大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > C++技巧 > Opencv——灰度直方图

Opencv——灰度直方图

关键词:直方图灰度Opencv  阅读(711) 赞(17)

[摘要]本文是对Opencv——灰度直方图的讲解,对学习C++编程技术有所帮助,与大家分享。

灰度直方图是灰度级的函数,它表示图像中具有某种灰度级的像素的个数,反映了图像中某种灰度出现的频率。

如果将图像总像素亮度(灰度级别)看成是一个随机变量,则其分布情况就反映了图像的统计特性,这可用probability density function (PDF)来刻画和描述,表现为灰度直方图。

灰度直方图的分布函数为:

            h(k)=nk

其中,k是值第k个灰度级,nk是灰度级为rk的像素总和。如果是8位灰度图像,k=0,1,2,...,255

下面代码如下:

 #include<cv.h>
 #include<highgui.h>
 
 using namespace cv;
 using namespace std;
 
 int main()
 {
     IplImage *src = cvLoadImage("D:\\Opencv\\Images\\GrayLena.bmp");
     int pix[256];
     for (int i = 0; i < 256; i++)
         pix[i] = 0;
     int grayValue;
     for (int i = 0; i < src->height;i++)
     for (int j = 0; j < src->width; j++)
     {
         grayValue = ((char*)(src->imageData + j*src->widthStep))[i];
         pix[grayValue]++;
     }
 
     int max = 0;
     for (int i = 0; i<256; i++)
     {
         if (pix[i]>max)
         {
             max = pix[i];
         }
     }
     IplImage* dst = cvCreateImage(cvSize(400, 300), 8, 3);
     cvSet(dst, cvScalarAll(255), 0);
     double bin_width = (double)dst->width / 256;
     double bin_unith = (double)dst->height / max;
     for (int i = 0; i<256; i++)
     {
         CvPoint p0 = cvPoint(i*bin_width, dst->height);
         CvPoint p1 = cvPoint((i + 1)*bin_width, dst->height - pix[i] * bin_unith);
         cvRectangle(dst, p0, p1, cvScalar(0, 255), -1, 8, 0);
     }
 
     cvNamedWindow("destImage");
     cvShowImage("destImage",dst);
     cvWaitKey();
     cvReleaseImage(&dst);
     cvDestroyWindow("destImage");
     return 0;
 }



相关评论