【OpenCV入门指南】第八篇 灰度直方图

,

(1)

(0),

(NULL)

)

参数说明:

第一个参数表示输入图像。

第二个参数表示输出的直方图指针。

第三个参数操作mask, 确定输入图像的哪个象素被计数。

第四个参数表示累计标识。如果设置,则直方图在开始时不被清零。这个特征保证可以为多个图像计算一个单独的直方图,,或者在线更新直方图。

函数说明:

这是个inline函数,函数内部会直接调用cvCalcArrHist( (CvArr**)image, hist, accumulate, mask );

其它直方图的函数介绍可以参阅:

下面给出灰度直方图的代码示范:

//图像的灰度直方图//By MoreWindows ()#include <opencv2/opencv.hpp>#include <opencv2/legacy/compat.hpp>using namespace std;#pragma comment(linker, "/subsystem:\&;windows\&; /entry:\&;mainCRTStartup\&;")void FillWhite(IplImage *pImage){cvRectangle(pImage, cvPoint(0, 0), cvPoint(pImage->width, pImage->height), CV_RGB(255, 255, 255), CV_FILLED);}// 创建灰度图像的直方图CvHistogram* CreateGrayImageHist(IplImage **ppImage){int nHistSize = 256;float fRange[] = {0, 255}; //灰度级的范围 float *pfRanges[] = {fRange}; CvHistogram *pcvHistogram = cvCreateHist(1, &nHistSize, CV_HIST_ARRAY, pfRanges);cvCalcHist(ppImage, pcvHistogram);return pcvHistogram;}// 根据直方图创建直方图图像IplImage* CreateHisogramImage(int nImageWidth, int nScale, int nImageHeight, CvHistogram *pcvHistogram){IplImage *pHistImage = cvCreateImage(cvSize(nImageWidth * nScale, nImageHeight), IPL_DEPTH_8U, 1);FillWhite(pHistImage);//统计直方图中的最大直方块float fMaxHistValue = 0;cvGetMinMaxHistValue(pcvHistogram, NULL, &fMaxHistValue, NULL, NULL);//分别将每个直方块的值绘制到图中int i;for(i = 0; i < nImageWidth; i++){float fHistValue = cvQueryHistValue_1D(pcvHistogram, i); //像素为i的直方块大小int nRealHeight = cvRound((fHistValue / fMaxHistValue) * nImageHeight); //要绘制的高度cvRectangle(pHistImage,cvPoint(i * nScale, nImageHeight – 1),cvPoint((i + 1) * nScale – 1, nImageHeight – nRealHeight),cvScalar(i, 0, 0, 0),CV_FILLED); }return pHistImage;}int main( int argc, char** argv ){const char *pstrWindowsSrcTitle = "原图()";const char *pstrWindowsGrayTitle = "灰度图()";const char *pstrWindowsHistTitle = "直方图()";// 从文件中加载原图IplImage *pSrcImage = cvLoadImage("007.jpg", CV_LOAD_IMAGE_UNCHANGED);IplImage *pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);// 灰度图cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY);// 灰度直方图CvHistogram *pcvHistogram = CreateGrayImageHist(&pGrayImage);// 创建直方图图像int nHistImageWidth = 255;int nHistImageHeight = 150; //直方图图像高度int nScale = 2;IplImage *pHistImage = CreateHisogramImage(nHistImageWidth, nScale, nHistImageHeight, pcvHistogram);// 显示cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);cvNamedWindow(pstrWindowsGrayTitle, CV_WINDOW_AUTOSIZE);cvNamedWindow(pstrWindowsHistTitle, CV_WINDOW_AUTOSIZE);cvShowImage(pstrWindowsSrcTitle, pSrcImage);cvShowImage(pstrWindowsGrayTitle, pGrayImage);cvShowImage(pstrWindowsHistTitle, pHistImage);cvWaitKey(0);cvReleaseHist(&pcvHistogram);cvDestroyWindow(pstrWindowsSrcTitle);cvDestroyWindow(pstrWindowsGrayTitle);cvDestroyWindow(pstrWindowsHistTitle);cvReleaseImage(&pSrcImage);cvReleaseImage(&pGrayImage);cvReleaseImage(&pHistImage);return 0;}

运行效果如下图所示:

由直方图可以看出灰度图上有四种灰度占了很大一部分比例。估计应该是墙壁,衣服,裤子及皮肤这四种灰度吧。

本篇主要介绍了灰度图像的直方图,彩色图像的直方图可以参考:%E5%9B%BE%E5%83%8F%E9%A2%9C%E8%89%B2%E5%88%86%E5%B8%83%E7%9B%B4%E6%96%B9%E5%9B%BE

后面二篇《OpenCV第十篇 灰度直方图均衡化》与《OpenCV第十一篇 彩色直方图均衡化》将介绍直方图的均衡化处理,这是图像增强的常用方法。欢迎继续浏览。

《OpenCV入门指南》系列文章地址:

转载请标明出处,原文地址:

欢迎关注微博:

比天才难得,许多天赋差的人经过过勤学苦练也取得了很大的成功。

【OpenCV入门指南】第八篇 灰度直方图

相关文章:

你感兴趣的文章:

标签云: