您的位置:首页 > 运维架构

opencv 绘制图像直方图

2014-02-27 20:42 239 查看
#include"cv.h"

#include"highgui.h"

int main()

{

//1、先读取一副单通道图像

IplImage*scr=cvLoadImage("C:\\111.jpg",0);

//2、创建一个直方图结果,为下面计算图像的直方图做准备。

int dims=1;

int nHistSize = 256;

float fRange[] = {0, 255};

float *pfRanges[] = {fRange}; //这里的pfRanges 是一个指针,他指向一个数组,数组中包含的元素是指针。

//灰度级的范围 一个数组,数组的名就是一个常指针,把这个指针放到一个数组中,就形成了指针数组,

//那么这个数组的名字还是一个指针,只是这个指针指向了包含了指针的数组的首地址,所以说该指针也就是指针的指针。

//指针数组:储存了指针的数组;数组指针,指向数组的指针。

CvHistogram *pcvHistogram = cvCreateHist(dims, &nHistSize, CV_HIST_ARRAY, pfRanges);

//(直方图维数,维数尺寸的数组,直方图的表示格式CV_HIST_ARRAY 多维密集数组 CV_HIST_TREE 多维稀疏数组,图中方块范围的数组,归一化标识)

// 这里设置维数是多少,那么nHistSize的维数就是多少,每一维就代表对应维数的直方图的大小。

//例如:我建立一个二维直方图,每个直方图的大小为128,256。那么dims=2,nHistSize[] = {128,256}

//注意:这里的每一维直方图的大小要用指针作为参数,直方图范围要用指针的指针作为参数。

// 3、计算图像scr的直方图

cvCalcHist(&scr, pcvHistogram);

//4、创建直方图的图像

int nHistImageWidth = 255; //直方图图像宽度度

int nHistImageHeight = 150; //直方图图像高度

int nScale = 3; //宽度放大尺度

IplImage *pHistImage = cvCreateImage(cvSize(nHistImageWidth * nScale, nHistImageHeight), IPL_DEPTH_8U, 1); //创建显示直方图的空图像

cvRectangle(pHistImage, cvPoint(0, 0), cvPoint(pHistImage->width,pHistImage->height), CV_RGB(255, 255, 255), CV_FILLED);

//将创建的显示直方图的空图像填充为白色。cvRectangle 绘制简单、指定粗细或者带填充的 矩形

//5、绘制直方图

//5.1 统计直方图中的最大直方块

float fMaxHistValue = 0;

cvGetMinMaxHistValue(pcvHistogram, NULL, &fMaxHistValue, NULL, NULL); //该函数可以统计直方图中的最大、小直方块,可以返回值和地址。

//5.2 分别将每个直方块的值绘制到直方图中

int i;

for(i = 0; i < nHistImageWidth; i++)

{

float fHistValue = cvQueryHistValue_1D(pcvHistogram, i); //读取一维直方图中像素序号为i的直方块大小

int nRealHeight = cvRound((fHistValue / fMaxHistValue) * nHistImageHeight);

//每个直方块要绘制的实际高度。int cvRound (double value) 对一个double型的数进行四舍五入,并返回一个整型数!

cvRectangle(pHistImage,

cvPoint(i * nScale, nHistImageHeight - 1), //矩形的起点

cvPoint((i + 1) * nScale - 1, nHistImageHeight - nRealHeight),//矩形中起点斜对角先的另一端

cvScalar(i, 0, 0, 0),

CV_FILLED

);

}

/*//直接对图像进行直方图均衡化

IplImage*dst=cvCreateImage(cvGetSize(scr),8,1);

cvEqualizeHist(scr,dst);

cvNamedWindow("直方图均衡化",CV_WINDOW_AUTOSIZE);

cvShowImage("直方图均衡化",dst);

*/

//6、显示原始图像 以及直方图

cvNamedWindow("原图", CV_WINDOW_AUTOSIZE);

cvNamedWindow("直方图", CV_WINDOW_AUTOSIZE);

cvShowImage("原图", scr);

cvShowImage("直方图", pHistImage);

cvWaitKey(0);

//7、释放内存空间

cvReleaseHist(&pcvHistogram);

cvReleaseImage(&scr);

cvReleaseImage(&pHistImage);

cvDestroyAllWindows();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: