#include

灰度直方图实现

  • 格式:docx
  • 大小:143.58 KB
  • 文档页数:3

// 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:\\picture\\grayshu.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*2,64*2),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*2,64*2);
CvPoint pt2=cvPoint((i+1)*2,64*2);
CvPoint pt3=cvPoint((i+1)*2,(64-(nextValue/histMax)*64)*2);
//nextValue/histMax是将级像素点个数归一到0~1,在*64是使高对在0~64之间
//由于opencv图像是以左上角为坐标原-点,向右为x轴,向下时y轴,而显示的直方图是向上增长的,所以用64减,将其倒过y来显示
CvPoint pt4=cvPoint(i*2, (64-(histValue/histMax)*64)*2);
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;
}。