OpenCV 在MFC中二值化

来源:互联网 发布:五轴编程视频 编辑:程序博客网 时间:2024/05/01 02:35

参考的是书上例7-1.

原代码是获取H-S二维直方图,我在这里改成了获取RGB以及灰度图的一维直方图。代码如下:

首先,要获取分别的直方图,必须将原图片按通道分开,因此,创建四个IplImage,depth为8,然后进行图像转换。
IplImage* r_plane = cvCreateImage(cvGetSize(src),8,1);IplImage* g_plane = cvCreateImage(cvGetSize(src),8,1);IplImage* b_plane = cvCreateImage(cvGetSize(src),8,1);IplImage* gray_plane = cvCreateImage(cvGetSize(src),8,1);cvCvtPixToPlane(src,b_plane,g_plane,r_plane,0);cvCvtColor(src,gray_plane,CV_BGR2GRAY);        //OpenCV中不管是Windows中Load的还是摄像头取得的都是BGR顺序排列的

然后为这四幅图创建对应的直方图结构。

int hist_size = 100;int hist_height = 100;float range[] = {0,255};float* ranges[]={range};CvHistogram* r_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);CvHistogram* g_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);CvHistogram* b_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);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*4),8,3);cvZero(hist_image);

然后开始显示,这里对直方图进行了标准化处理,不然的话无法观察到明显的变化。

float max_value = 0;cvGetMinMaxHistValue(r_hist, 0,&max_value,0,0);for(int i=0;i<hist_size;i++){    float bin_val = cvQueryHistValue_1D(r_hist,i);    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,0,0));}

最后只要显示出来就可以了。出结果图的时候我并不知道自己的结果是不是正确,于是把图片用Photoshop打开,然后看色阶。结果发现红和蓝的直方图是反的,这才发现,自己在拆分通道的时候写的是rgb而不是bgr吐舌笑脸。改过来之后就对了。

image

原创粉丝点击