// grayHistogram.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<opencv\cv.h>
#include<opencv\cxcore.h>
#include<opencv2\highgui\highgui.hpp>
int _tmain(int argc, _TCHAR* argv[])
{
IplImage *src=cvLoadImage("E:\\tupian\\shu.bmp"); //加载图像
cvNamedWindow("sr"); //创建显示窗口
cvShowImage("sr",src); //显示图像
int size=256;
float range[]={0,255};
float *ranges[]={range};
CvHistogram *hist=cvCreateHist(1,&size, CV_HIST_ARRAY,ranges,1);//创建一维直方图,
IplImage* gray=cvCreateImage(cvGetSize(src),8,1);
cvCvtColor(src,gray,CV_BGR2GRAY);
//vCvtColor(...),是Opencv里的颜色空间转换函数,可以实现RGB颜色向HSV,HSI等颜色空间的转换,也可以转换为灰度图像。
//参数CV_RGB2GRAY是RGB到gray,
//参数CV_GRAY2RGB是gray到RGB
cvCalcHist(&gray,hist,0,0);//统计图像在[0 255]像素的均匀分布,将统计结果存在结构体中
//draw histogram-----
//统计直方图中的最大直方块
float histMax=0;
cvGetMinMaxHistValue(hist,0,&histMax,0);
//创建一张一维直方图的“图”,横坐标为灰度级,纵坐标为像素个数
IplImage *grayHist=cvCreateImage(cvSize(256,64),8,1);
cvZero(grayHist);
//分别将每个直方块的值绘制到图中
for(int i=0;i<255;i++)
{
float histValue=cvQueryHistValue_1D(hist,i);
float nextValue=cvQueryHistValue_1D(hist,i+1);
//计算直方块4个点的值
CvPoint pt1=cvPoint(i,64);
CvPoint pt2=cvPoint(i+1,64);
CvPoint pt3=cvPoint(i+1,(64-(nextValue/histMax)*64));
//nextValue/histMax是将i级像素点个数归一到0~1,在*64是使其高对在0~64之间
//由于opencv图像是以左上角为坐标原点,向右为x轴,向下时y轴,而显示的直方图是向上增长的,所以用64减,将其倒过来显示
CvPoint pt4=cvPoint(i, 64-(histValue/histMax)*64);
int ptNum=5;
CvPoint pt[5];
pt[0]=pt1;
pt[1]=pt2;
pt[2]=pt3;
pt[3]=pt4;
pt[4]=pt1;
cvFillConvexPoly(grayHist,pt,ptNum,cvScalar(255)); //填充直方块
}
cvNamedWindow("grayHistogram");
cvShowImage("grayHistogram",grayHist);
cvWaitKey(0);
cvReleaseImage(&src);
cvReleaseImage(&gray);
cvReleaseImage(&grayHist);
cvDestroyWindow("sr");
cvDestroyWindow("grayHistogram");
return 0;
}
用opencv创建图像的灰度直方图
最新推荐文章于 2024-04-30 15:09:36 发布