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

// 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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值