opencv学习笔记(二十七)实例:显示一张灰度图片的直方图

程序实例:

#include 
#define cvQueryHistValue_1D( hist, idx0 ) ((float)cvGetReal1D( (hist)->bins, (idx0)))
int main( )  
{  
    IplImage * src= cvLoadImage("a.jpg");  
    IplImage* gray_plane = cvCreateImage(cvGetSize(src),8,1);  
    cvCvtColor(src,gray_plane,CV_BGR2GRAY);  

    int hist_size = 256;    //直方图尺寸 
    int hist_height = 256;  
    float range[] = {0,255};  //灰度级的范围  
float* ranges[]={range};  //就是用指针指向这个数组,
//然后这个指针就能访问和控制这个数组了。

    //创建一维直方图,统计图像在[0 255]像素的均匀分布
    CvHistogram* gray_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);  
    //计算灰度图像的一维直方图  
    cvCalcHist(&gray_plane,gray_hist,0,0);  
    //归一化直方图  
    cvNormalizeHist(gray_hist,1.0);  

    int scale = 2;  
//创建一张一维直方图的“图”,横坐标为灰度级,纵坐标为像//素个数
    IplImage* hist_image = cvCreateImage(cvSize(hist_size*scale,hist_height),8,3);  
    cvZero(hist_image);  
    //统计直方图中的最大直方块  
    float max_value = 0;  
    cvGetMinMaxHistValue(gray_hist, 0,&max_value,0,0);  

    //分别将每个直方块的值绘制到图中  
    for(int i=0;ifloat bin_val = cvQueryHistValue_1D(gray_hist,i);
        //像素i的概率 
//为什么称为概率呢?因为我们知道归一化直方图之后,所有的直方块之和=1,
//所以我们利用cvQueryHistValue_1D得到的直方块的值其实就是概率了。
        int intensity = cvRound(bin_val*hist_height/max_value);  //要绘制的高度
        cvRectangle(hist_image,  
        cvPoint(i*scale,hist_height-1),  
        cvPoint((i+1)*scale - 1, hist_height - intensity),  
            CV_RGB(255,255,255));    
    }  
    cvNamedWindow( "GraySource", 1 );  
    cvShowImage("GraySource",gray_plane);  
    cvNamedWindow( "H-S Histogram", 1 );  
    cvShowImage( "H-S Histogram", hist_image );  

    cvWaitKey(0);  
}  

代码理解:
1、float* histRange = { range };
就是用指针指向这个数组,然后这个指针就能访问和控制这个数组了。
2、 int scale = 2;
IplImage* hist_image = cvCreateImage(cvSize(hist_size*scale,hist_height),8,3);
cvZero(hist_image);
这个hist_size*scale里面的“*”是“乘法”的意思,最终的图像是横坐标是纵坐标的2倍,scale换成1就是两个一样高。
3、cvRound——前面有,作用是对一个double型的数进行四舍五入,并返回一个整型数!
画直方图的一般步骤:
1、将图片黑白化(彩色图片转成3个通道,各个通道单独处理)。
2、设置直方图的range(要统计的灰度范围,一般都是[0~255])和尺寸。
3、创建一个直方图,然后统计图像在[0 255]像素的分布。
4、利用cvCalcHist计算。
5、利用 cvNormalizeHist归一化直方图。
6、创建一张图片,再创建一个矩形,将直方图“画在其中”。
7、窗口显示。
opencv学习笔记(二十七)实例:显示一张灰度图片的直方图_第1张图片
opencv学习笔记(二十七)实例:显示一张灰度图片的直方图_第2张图片

错误解析:

本来运行程序时,提示——“cvQueryHistValue_1D”: 找不到标识符。然后加入

#define cvQueryHistValue_1D( hist, idx0 ) ((float)cvGetReal1D( (hist)->bins, (idx0)))

就好使了。

“cvQueryHistValue_2D”: 找不到标识符
在代码中加入:

#define cvQueryHistValue_2D( hist, idx0, idx1 )   cvGetReal2D( (hist)->bins, (idx0), (idx1) )

然后就编译通过。

你可能感兴趣的:(opencv学习笔记(二十七)实例:显示一张灰度图片的直方图)