OpenCV中如何载入图像并且转换成灰度显示图像直方图

大家在网上可以清楚的了解到有关OpenCV直方图的数据结构,如何创建,以及其他函数的一些方法说明和使用,下面的地址是网上的一些有关直方图的介绍  http://www.linuxidc.com/Linux/2013-10/91707.htm
下面我将分析一下我自己参考网上资料而写的一段关于建立和显示灰度直方图的代码

void histImage(IplImage* gray1,IplImage* histImg)
{
int histSize=255; //直方图针数
float range0[]={0,256}; //第0维数值变化范围
float * ranges[]={range0}; //第1维数值变化范围
int i,binW; //下标号
float maxValue,minValue; //直方图数值的max和min
int minIdx=0,maxIdx=0; //对应上述值时的下标号
CvHistogram * hist=cvCreateHist(1,&histSize,CV_HIST_ARRAY,ranges,1);//创建一个直方图
cvCalcHist(&gray1,hist,0,NULL);//计算直方图
cvGetMinMaxHistValue(hist,&minValue,&maxValue,&minIdx,&maxIdx);//得到最大最小值及其标号
//缩放最大值最小值以溶入图像
cvScale(hist->bins,hist->bins,((double)histImg->height)/maxValue,0);
cvSet(histImg,cvScalar(255),0);//把直方图画到图像中
for (i=0;i<histSize;i++)
{
cvRectangle(histImg,cvPoint(i,histImg->height),
cvPoint(i+1,histImg->height-cvRound(cvGetReal1D(hist->bins,i))),cvScalarAll(0),1,8,0);//在histImg //图像中中画出直方图矩形
}
}
//这是一个可以被调用的函数,可以在main函数中调用它,传递两个IplImage类型的参数,gray1为输入的单通 //道的图像,histImg为输出的直方图图像。
int main()
{

int R,G,B,offset,max;
cvNamedWindow("origin");
cvNamedWindow("gray1");
cvNamedWindow("hist");
IplImage* cvLoadImage("图.jpg",-1); //载入彩色图像
IplImage* gray1=cvCreateImage(cvGetSize(src),src->depth,1);
IplImage * histImg=cvCreateImage(cvSize(255,200),IPL_DEPTH_8U,1);//用于存放直方图
IplImage* r=cvCreateImage(cvGetSize(src),src->depth,1);//存放红色图像
IplImage* g=cvCreateImage(cvGetSize(src),src->depth,1);//存放绿色图像
IplImage* b=cvCreateImage(cvGetSize(src),src->depth,1);//存放蓝色图像
cvSplit(src,b,g,r,NULL);//分割彩色的通道
for(int y=0;y<g->height;y++)//取三个通道中的最大值作为灰色图像的值
for(int x=0;x<g->width;x++)
{
offset=y*g->widthStep+x;
R=(unsigned char )r->imageData[offset];
G=(unsigned char )g->imageData[offset];
B=(unsigned char )b->imageData[offset];
if (R>G && R>B) {
max = R;
}
else {
if (G>B) {
max = G;
}
else {
max = B;
}
}
gray1->imageData[offset]=max;
}
cvSmooth( gray1, gray1, CV_BLUR , 3, 3 );//去噪
histImage(gray1,histImg);
cvShowImage("hist",histImg);
cvShowImage("origin",src);
cvShowImage("gray1",gray1);
while(1){if((cvWaitKey(10)&0x7f)==27)break;}
cvDestroyAllWindows();
cvReleaseImage(&src);
cvReleaseImage(&histImg);
cvReleaseImage(&gray1);
return 1;
}

最后的结果如下图所示:

原始图像

灰度图像

图像直方图

初步涉及OpenCV,希望继续努力,不断的进步,能出更多更好的代码和知识跟大家分享。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值