可移动淋浴房十大知名品牌有哪些好的品牌

利用OpenCV计算并绘制灰度直方图_Linux编程_Linux公社-Linux系统门户网站
你好,游客
利用OpenCV计算并绘制灰度直方图
来源:Linux社区&
作者:quarryman
下面用两种方法实现直方图的计算和绘制,其一用自己实现计算直方图,其二利用OpenCV提供的库函数计算直方图。代码和算法不难,适合OpenCV初学者学习之用。如有疏漏错误之处,还请各路方家指出。下面使用的测试图是标准的lena图。
#include&&cv.h& &
#include&&highgui.h& &
#pragma&comment(&lib,&"cv.lib"&) &
#pragma&comment(&lib,&"cxcore.lib"&) &
#pragma&comment(&lib,&"highgui.lib"&) &&
int&main()&&
&&&&IplImage*&src=cvLoadImage("lena.jpg",0);&&
&&&&int&width=src-&&&
&&&&int&height=src-&&&
&&&&int&step=src-&widthS&&
&&&&uchar*&data=(uchar&*)src-&imageD&&
&&&&int&hist[256]={0};&&
&&&&for(int&i=0;i&i++)&&
&&&&&&&&for(int&j=0;j&j++)&&
&&&&&&&&{&&
&&&&&&&&&&&&hist[data[i*step+j]]++;&&
&&&&&&&&}&&
&&&&int&max=0;&&
&&&&for(i=0;i&256;i++)&&
&&&&&&&&if(hist[i]&max)&&
&&&&&&&&{&&
&&&&&&&&&&&&max=hist[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/&&
&&&&for(i=0;i&256;i++)&&
&&&&&&&&CvPoint&p0=cvPoint(i*bin_width,dst-&height);&&
&&&&&&&&CvPoint&p1=cvPoint((i+1)*bin_width,dst-&height-hist[i]*bin_unith);&&
&&&&&&&&cvRectangle(dst,p0,p1,cvScalar(0,255),-1,8,0);&&
&&&&cvNamedWindow("src",1);&&
&&&&cvShowImage("src",src);&&
&&&&cvNamedWindow("dst",1);&&
&&&&cvShowImage("dst",dst);&&
&&&&cvWaitKey(0);&&&
&&&&cvDestroyAllWindows();&&
&&&&cvReleaseImage(&src);&&
&&&&cvReleaseImage(&dst);&&
&&&&return&0;&&
代码效果如下
#include&&cv.h& &
#include&&highgui.h& &
#pragma&comment(&lib,&"cv.lib"&) &
#pragma&comment(&lib,&"cxcore.lib"&) &
#pragma&comment(&lib,&"highgui.lib"&) &&
int&main()&&
&&&&IplImage*&src=cvLoadImage("lena.jpg",0);&&
&&&&int&size=256;&&
&&&&float&range[]={0,255};&&
&&&&float*&ranges[]={range};&&
&&&&CvHistogram*&hist=cvCreateHist(1,&size,CV_HIST_ARRAY,ranges,1);&&
&&&&cvCalcHist(&src,hist,0,NULL);&&
&&&&float&max=0;&&
&&&&cvGetMinMaxHistValue(hist,NULL,&max,NULL,NULL);&&
&&&&IplImage*&dst=cvCreateImage(cvSize(400,300),8,3);&&
&&&&cvSet(dst,cvScalarAll(255),0);&&
&&&&double&bin_width=(double)dst-&width/&&
&&&&double&bin_unith=(double)dst-&height/&&
&&&&for(int&i=0;i&i++)&&
&&&&&&&&CvPoint&p0=cvPoint(i*bin_width,dst-&height);&&
&&&&&&&&CvPoint&p1=cvPoint((i+1)*bin_width,dst-&height-cvGetReal1D(hist-&bins,i)*bin_unith);&&
&&&&&&&&cvRectangle(dst,p0,p1,cvScalar(0,255),-1,8,0);&&
&&&&cvNamedWindow("src",1);&&
&&&&cvShowImage("src",src);&&
&&&&cvNamedWindow("dst",1);&&
&&&&cvShowImage("dst",dst);&&
&&&&cvWaitKey(0);&&&
&&&&cvDestroyAllWindows();&&
&&&&cvReleaseImage(&src);&&
&&&&cvReleaseImage(&dst);&&
&&&&return&0;&&
代码效果如下
可见上面两种方法的结果并无明显的差异。
通过复用上面的代码。我们可以得到彩色图像各通道的直方图,代码如下
#include&&cv.h& &
#include&&highgui.h& &
#pragma&comment(&lib,&"cv.lib"&) &
#pragma&comment(&lib,&"cxcore.lib"&) &
#pragma&comment(&lib,&"highgui.lib"&) &&
int&main()&&
&&&&IplImage*&src=cvLoadImage("lena.jpg",1);&&
&&&&IplImage*&r=cvCreateImage(cvGetSize(src),&IPL_DEPTH_8U,&1);&&&
&&&&IplImage*&g=cvCreateImage(cvGetSize(src),&IPL_DEPTH_8U,&1);&&&
&&&&IplImage*&b=cvCreateImage(cvGetSize(src),&IPL_DEPTH_8U,&1);&&&
&&&&cvSplit(src,b,g,r,NULL);&&&
&&&&IplImage*&gray&=&cvCreateImage(cvGetSize(src),8,1);&&
&&&&cvCvtColor(src,gray,CV_BGR2GRAY);&&
&&&&int&size=256;&&
&&&&float&range[]={0,255};&&
&&&&float*&ranges[]={range};&&
&&&&CvHistogram*&r_hist&=&cvCreateHist(1,&size,CV_HIST_ARRAY,ranges,1);&&
&&&&CvHistogram*&g_hist&=&cvCreateHist(1,&size,CV_HIST_ARRAY,ranges,1);&&
&&&&CvHistogram*&b_hist&=&cvCreateHist(1,&size,CV_HIST_ARRAY,ranges,1);&&
&&&&CvHistogram*&hist&&&=&cvCreateHist(1,&size,CV_HIST_ARRAY,ranges,1);&&
&&&&cvCalcHist(&r,r_hist,0,NULL);&&
&&&&IplImage*&r_dst=cvCreateImage(cvSize(400,300),8,3);&&
&&&&cvSet(r_dst,cvScalarAll(255),0);&&
&&&&float&r_max=0;&&
&&&&cvGetMinMaxHistValue(r_hist,NULL,&r_max,NULL,NULL);&&
&&&&double&r_bin_width=(double)r_dst-&width/&&
&&&&double&r_bin_unith=(double)r_dst-&height/r_&&
&&&&for(int&i=0;i&i++)&&
&&&&&&&&CvPoint&p0=cvPoint(i*r_bin_width,r_dst-&height);&&
&&&&&&&&CvPoint&p1=cvPoint((i+1)*r_bin_width,r_dst-&height-cvGetReal1D(r_hist-&bins,i)*r_bin_unith);&&
&&&&&&&&cvRectangle(r_dst,p0,p1,cvScalar(255,0,0),-1,8,0);&&
&&&&cvCalcHist(&g,g_hist,0,NULL);&&
&&&&IplImage*&g_dst=cvCreateImage(cvSize(400,300),8,3);&&
&&&&cvSet(g_dst,cvScalarAll(255),0);&&
&&&&float&g_max=0;&&
&&&&cvGetMinMaxHistValue(g_hist,NULL,&g_max,NULL,NULL);&&
&&&&double&g_bin_width=(double)g_dst-&width/&&
&&&&double&g_bin_unith=(double)g_dst-&height/g_&&
&&&&for(i=0;i&i++)&&
&&&&&&&&CvPoint&p0=cvPoint(i*g_bin_width,g_dst-&height);&&
&&&&&&&&CvPoint&p1=cvPoint((i+1)*g_bin_width,g_dst-&height-cvGetReal1D(g_hist-&bins,i)*g_bin_unith);&&
&&&&&&&&cvRectangle(g_dst,p0,p1,cvScalar(0,255,0),-1,8,0);&&
&&&&cvCalcHist(&b,b_hist,0,NULL);&&
&&&&IplImage*&b_dst=cvCreateImage(cvSize(400,300),8,3);&&
&&&&cvSet(b_dst,cvScalarAll(255),0);&&
&&&&float&b_max=0;&&
&&&&cvGetMinMaxHistValue(b_hist,NULL,&b_max,NULL,NULL);&&
&&&&double&b_bin_width=(double)b_dst-&width/&&
&&&&double&b_bin_unith=(double)b_dst-&height/b_&&
&&&&for(i=0;i&i++)&&
&&&&&&&&CvPoint&p0=cvPoint(i*b_bin_width,b_dst-&height);&&
&&&&&&&&CvPoint&p1=cvPoint((i+1)*b_bin_width,b_dst-&height-cvGetReal1D(b_hist-&bins,i)*b_bin_unith);&&
&&&&&&&&cvRectangle(b_dst,p0,p1,cvScalar(0,0,255),-1,8,0);&&
&&&&cvCalcHist(&gray,hist,0,NULL);&&
&&&&IplImage*&gray_dst=cvCreateImage(cvSize(400,300),8,3);&&
&&&&cvSet(gray_dst,cvScalarAll(255),0);&&
&&&&float&max=0;&&
&&&&cvGetMinMaxHistValue(hist,NULL,&max,NULL,NULL);&&
&&&&double&bin_width=(double)gray_dst-&width/&&
&&&&double&bin_unith=(double)gray_dst-&height/&&
&&&&for(i=0;i&i++)&&
&&&&&&&&CvPoint&p0=cvPoint(i*bin_width,gray_dst-&height);&&
&&&&&&&&CvPoint&p1=cvPoint((i+1)*bin_width,gray_dst-&height-cvGetReal1D(hist-&bins,i)*bin_unith);&&
&&&&&&&&cvRectangle(gray_dst,p0,p1,cvScalar(0),-1,8,0);&&
&&&&IplImage*&dst=cvCreateImage(cvSize(800,600),8,3);&&
&&&&cvSetZero(dst);&&
&&&&CvRect&rect&=&cvRect(0,&0,&400,&300);&&&
&&&&cvSetImageROI(dst,&rect);&&&
&&&&cvCopy(r_dst,&dst);&&&
&&&&rect&=&cvRect(400,&0,&400,&300);&&
&&&&cvSetImageROI(dst,&rect);&&&
&&&&cvCopy(g_dst,&dst);&&
&&&&rect&=&cvRect(0,&300,&400,&300);&&
&&&&cvSetImageROI(dst,&rect);&&&
&&&&cvCopy(b_dst,&dst);&&
&&&&rect&=&cvRect(400,&300,&400,&300);&&
&&&&cvSetImageROI(dst,&rect);&&&
&&&&cvCopy(gray_dst,&dst);&&
&&&&cvResetImageROI(dst);&&
&&&&cvNamedWindow("src",1);&&
&&&&cvShowImage("src",src);&&
&&&&cvNamedWindow("dst",1);&&
&&&&cvShowImage("dst",dst);&&
&&&&cvSaveImage("dst.jpg",dst);&&
&&&&cvWaitKey(0);&&&
&&&&cvDestroyAllWindows();&&
&&&&cvReleaseImage(&src);&&
&&&&cvReleaseImage(&dst);&&
&&&&cvReleaseImage(&r);&&
&&&&cvReleaseImage(&g);&&
&&&&cvReleaseImage(&b);&&
&&&&cvReleaseImage(&gray);&&
&&&&cvReleaseImage(&r_dst);&&
&&&&cvReleaseImage(&g_dst);&&
&&&&cvReleaseImage(&b_dst);&&
&&&&cvReleaseImage(&gray_dst);&&
&&&&return&0;&&
效果图如下
相关资讯 & & &
& (01月12日)
& (12/27/:52)
& (03月12日)
& (12/31/:28)
& (12/15/:37)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款8373人阅读
Computer Vision(101)
C/C++(132)
#include &cv.h&
#include &highgui.h&
#pragma comment( lib, &cv.lib& )
#pragma comment( lib, &cxcore.lib& )
#pragma comment( lib, &highgui.lib& )
int main()
IplImage* src=cvLoadImage(&lena.jpg&,0);
int width=src-&
int height=src-&
int step=src-&widthS
uchar* data=(uchar *)src-&imageD
int hist[256]={0};
for(int i=0;i&i++)
for(int j=0;j&j++)
hist[data[i*step+j]]++;
int max=0;
for(i=0;i&256;i++)
if(hist[i]&max)
max=hist[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/
for(i=0;i&256;i++)
CvPoint p0=cvPoint(i*bin_width,dst-&height);
CvPoint p1=cvPoint((i+1)*bin_width,dst-&height-hist[i]*bin_unith);
cvRectangle(dst,p0,p1,cvScalar(0,255),-1,8,0);
cvNamedWindow(&src&,1);
cvShowImage(&src&,src);
cvNamedWindow(&dst&,1);
cvShowImage(&dst&,dst);
cvWaitKey(0);
cvDestroyAllWindows();
cvReleaseImage(&src);
cvReleaseImage(&dst);
#include &cv.h&
#include &highgui.h&
#pragma comment( lib, &cv.lib& )
#pragma comment( lib, &cxcore.lib& )
#pragma comment( lib, &highgui.lib& )
int main()
IplImage* src=cvLoadImage(&lena.jpg&,0);
int size=256;
float range[]={0,255};
float* ranges[]={range};
CvHistogram* hist=cvCreateHist(1,&size,CV_HIST_ARRAY,ranges,1);
cvCalcHist(&src,hist,0,NULL);
float max=0;
cvGetMinMaxHistValue(hist,NULL,&max,NULL,NULL);
IplImage* dst=cvCreateImage(cvSize(400,300),8,3);
cvSet(dst,cvScalarAll(255),0);
double bin_width=(double)dst-&width/
double bin_unith=(double)dst-&height/
for(int i=0;i&i++)
CvPoint p0=cvPoint(i*bin_width,dst-&height);
CvPoint p1=cvPoint((i+1)*bin_width,dst-&height-cvGetReal1D(hist-&bins,i)*bin_unith);
cvRectangle(dst,p0,p1,cvScalar(0,255),-1,8,0);
cvNamedWindow(&src&,1);
cvShowImage(&src&,src);
cvNamedWindow(&dst&,1);
cvShowImage(&dst&,dst);
cvWaitKey(0);
cvDestroyAllWindows();
cvReleaseImage(&src);
cvReleaseImage(&dst);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:7168709次
积分:50183
积分:50183
排名:第54名
原创:483篇
转载:36篇
评论:4570条
百度深度学习实验室RD,关注计算机视觉,机器学习,算法研究,人工智能, 移动互联网等学科和产业,希望结识更多同道中人。
新浪微博:
(1)(1)(1)(1)(4)(3)(1)(7)(7)(2)(1)(1)(9)(1)(1)(5)(2)(1)(3)(4)(6)(6)(5)(4)(1)(1)(1)(6)(1)(2)(7)(6)(7)(11)(20)(12)(23)(29)(37)(37)(6)(24)(6)(1)(1)(2)(2)(1)(7)(23)(20)(32)(17)(5)(22)(58)(8)(8)【OpenCV】数字图像灰度直方图(转)
灰度直方图是数字图像中最简单且有用的工具,这一篇主要总结OpenCV中直方图CvHistogram的结构和应用。
灰度直方图的定义
灰度直方图是灰度级的函数,描述图像中该灰度级的像素个数(或该灰度级像素出现的频率):其横坐标是灰度级,纵坐标表示图像中该灰度级出现的个数(频率)。
一维直方图的结构表示为
高维直方图可以理解为图像在每个维度上灰度级分布的直方图。常见的是二维直方图。如红-蓝直方图的两个分量分别表示红光图像的灰度值和蓝光图像灰度值的函数。其图像坐标(Dr,Db)处对应在红光图像中具有灰度级Dr同时在蓝光图像中具有灰度级Db的像素个数。这是基于多光谱——每个像素有多个变量——的数字图像,二维中对应每个像素统计个变量。
OpenCV中的直方图CvHistogram
注意我们在上面理解直方图的意义时更多把他想象成一幅“图”,继而理解图中横坐标,纵坐标的意义。而在OpenCV中,应该更多把直方图看做“数据结构”来理解。
OpenCV中用CvHistogram表示多维直方图():
typedef&struct&CvHistogram&&
&&&&int&&&&&&&
&&&&CvArr*&&&&//存放每个灰度级数目的数组指针
&&&&float&&&thresh[CV_MAX_DIM][2];&&//均匀直方图
&&&&float**&thresh2;&//非均匀直方图
&&&&CvMatND&&&//直方图数组的内部数据结构
typedef struct CvHistogram
//存放每个灰度级数目的数组指针
thresh[CV_MAX_DIM][2];
//均匀直方图
float** thresh2; //非均匀直方图
//直方图数组的内部数据结构
这个结构看起来简单(比IplImage*元素少多了。。。)其实并不太好理解。
第一个成员type用来指定第二个成员bins的类型。OpenCv中常见到CvArr*的接口,可以用以指定诸如CvMat、CvMatND、IplImage的类型,其实CvArr*的是一个指向void的指针。在函数内部有时需要得到确切的指向类型,这就需要type来指定。
thresh用来指定统计直方图分布的上下界。比如[0 255]表示用来统计图像中像素分别在灰度级[0
255]区间的分布情况,CV_MAX_DIM对应直方图的维数,假如设定二维红-蓝直方图的thresh为[0 255;100
200],就是分别统计红色图像灰度级在[0 255]以及蓝色图像在灰度级[100 200]的分布情况。
thresh用以指定均匀直方图的分布,我们按每个像素理解自然是“均匀分布”,其实也可以统计像素在几个区间的分布。如果统计像素在2个区间的分布,则对应[0
255]的上下界,均匀分布统计的区间即[0 127] [127
255]分布的概率,这也是为什么thresh第二个维数默认为2——会自动均分上下界;而thresh2指定非均匀的分布,这就需要指定每个区间的上下界,如果要统计直方图在区间(0,10,100,255)的分布,那需要指定thresh2的一个维度为[0
10 100 255],所以用float**形式表示。
mat简单说就是存储了直方图的信息,即我们统计的直方图分布概率。
创建直方图
cvCreateHist()
OpenCV中用cvCreateHist()创建一个直方图:
CvHistogram*&cvCreateHist(&&&
&&&&int&dims,&//直方图维数&
&&&&int*&sizes,//直翻图维数尺寸
&&&&int&type,&//直方图的表示格式
&&&&&&&&float**&ranges=NULL,&//图中方块范围的数组
&&&&int&uniform=1&//归一化标识
CvHistogram* cvCreateHist(
int dims, //直方图维数
int* sizes,//直翻图维数尺寸
int type, //直方图的表示格式
float** ranges=NULL, //图中方块范围的数组
int uniform=1 //归一化标识
size数组的长度为dims,每个数表示分配给对应维数的bin的个数。如dims=3,则size中用[s1,s2,s3]分别指定每维bin的个数。
type有两种:CV_HIST_ARRAY 意味着直方图数据表示为多维密集数组 CvMatND; CV_HIST_TREE
意味着直方图数据表示为多维稀疏数组 CvSparseMat。
ranges就是那个复杂的不好理解的thresh的范围,他的内容取决于uniform的值。uniform为0是均匀的,非0时不均匀。
计算图像直方图的函数为CalcHist():
void&cvCalcHist(&&&
&&&&IplImage**&image,&//输入图像(也可用CvMat**)
&&&&CvHistogram*&hist,&//直方图指针
&&&&&&&&&&&&&&&&&int&accumulate=0,&//累计标识。如果设置,则直方图在开始时不被清零。
&&&&const&CvArr*&mask=NULL&//操作&mask,&确定输入图像的哪个象素被计数
void cvCalcHist(
IplImage** image, //输入图像(也可用CvMat**)
CvHistogram* hist, //直方图指针
int accumulate=0, //累计标识。如果设置,则直方图在开始时不被清零。
const CvArr* mask=NULL //操作 mask, 确定输入图像的哪个象素被计数
要注意的是这个函数用来计算一张(或多张)单通道图像的直方图,如果要计算多通道,则用这个函数分别计算图像每个单通道。
实践:一维直方图
下面实践一下用OpenCV生成图像的一维直方图
int&main(&)&&
&&&&IplImage&*&src=&cvLoadImage("baboon.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;&&
&&&&//创建一张一维直方图的“图”,横坐标为灰度级,纵坐标为像素个数(*scale)
&&&&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;i
&&&&&&&&float&bin_val&=&cvQueryHistValue_1D(gray_hist,i);&//像素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,255,255));&&&&
&&&&cvNamedWindow(&"GraySource",&1&);&&
&&&&cvShowImage("GraySource",gray_plane);&&
&&&&cvNamedWindow(&"H-S&Histogram",&1&);&&
&&&&cvShowImage(&"H-S&Histogram",&hist_image&);&&
&&&&cvWaitKey(0);&&
int main( )
IplImage * src= cvLoadImage("baboon.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;
//创建一张一维直方图的“图”,横坐标为灰度级,纵坐标为像素个数(*scale)
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;i
试验结果:
对应的,我们可以用一样的思路统计每个通道的直方图,并绘制图像每个通道像素的分布:
实践:二维直方图
我们也可以结合OpenCV的例子生成二维直方图:
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*&planes[]&=&{&r_plane,&g_plane&};&&
&&&&//将HSV图像分离到不同的通道中
&&&&cvCvtPixToPlane(&src,&b_plane,&g_plane,&r_plane,&0&);&&
&&&&//&生成二维直方图数据结构
&&&&int&r_bins&=256,&b_bins&=&256;&&&
&&&&CvHistogram*&&&
&&&&&&&&int&&&&hist_size[]&=&{&r_bins,&b_bins&};&&
&&&&&&&&float&&r_ranges[]&&=&{&0,&255&};&&&&&&&&&&//&hue&is&[0,180]
&&&&&&&&float&&b_ranges[]&&=&{&0,&255&};&&&
&&&&&&&&float*&ranges[]&&&&=&{&r_ranges,b_ranges&};&&
&&&&&&&&hist&=&cvCreateHist(&2,&hist_size,&CV_HIST_ARRAY,&ranges,&1);&&&
&&&&//计算一张或多张单通道图像image(s)&的直方图
&&&&cvCalcHist(&planes,&hist,&0,&0&);&&
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* planes[] = { r_plane, g_plane };
//将HSV图像分离到不同的通道中
cvCvtPixToPlane( src, b_plane, g_plane, r_plane, 0 );
// 生成二维直方图数据结构
int r_bins =256, b_bins = 256;
CvHistogram*
hist_size[] = { r_bins, b_bins };
r_ranges[]
= { 0, 255 };
// hue is [0,180]
b_ranges[]
= { 0, 255 };
float* ranges[]
= { r_ranges,b_ranges };
hist = cvCreateHist( 2, hist_size, CV_HIST_ARRAY, ranges, 1);
//计算一张或多张单通道图像image(s) 的直方图
cvCalcHist( planes, hist, 0, 0 );
刚才的图我们是对应每个横坐标绘制纵坐标的直方块,二维的图需要绘制每个点:
for(&int&h&=&0;&h&&&r_&h++&)&{&&
&&for(&int&s&=&0;&s&&&b_&s++&)&{&&
&&&&float&bin_val&=&cvQueryHistValue_2D(&hist,&h,&s&);&//查询直方块的值
&&&&&&&&int&intensity&=&cvRound(&bin_val&*&255&/&max_value&);&&
&&&&&&&&cvRectangle(&hist_img,&&&
&&&&&&&&&&cvPoint(&h*scale,&s*scale&),&&
&&&&&&&&&&cvPoint(&(h+1)*scale&-&1,&(s+1)*scale&-&1),&&
&&&&&&&&&&CV_RGB(intensity,intensity,intensity),&&&
&&&&&&&&&&CV_FILLED);&&
for( int h = 0; h & r_ h++ ) {
for( int s = 0; s & b_ s++ ) {
float bin_val = cvQueryHistValue_2D( hist, h, s ); //查询直方块的值
int intensity = cvRound( bin_val * 255 / max_value );
cvRectangle( hist_img,
cvPoint( h*scale, s*scale ),
cvPoint( (h+1)*scale - 1, (s+1)*scale - 1),
CV_RGB(intensity,intensity,intensity),
CV_FILLED);
最终生成二维直方图:
直方图的应用以后再讨论。
转载请注明出处:
实验代码下载:
Mat格式的参考这里:
(转载请注明作者和出处:&未经允许请勿用于商业用途)
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 哪个品牌的淋浴房好 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信