用opencv创建图像的灰度直方图

来源:互联网 发布:金融数据分析工具 编辑:程序博客网 时间:2024/05/21 12:40
// 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到RGBcvCalcHist(&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;}

0 0
原创粉丝点击