opencv 绘制图像直方图

#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();




}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值