PhotoShop算法实现--直方图(十)

PhotoShop算法实现--直方图(十)

kezunhai@gmail.com

http://blog.csdn.net/kezunhai

         亮度直方图(Histogram)就是一张表示图像色彩R、G、B三分量各个亮度级的分布图像。它的横坐标是亮度级,范围为[0,255],纵坐标是该亮度的频率,即像素的分布数,通过它可以了解图像的一个很基本的统计特征。

         实现原理:首先建立一个256级的亮度数组,然后取出图像中的每一个像素的亮度值,再将亮度数组对应亮度级的统计值加1,最后根据各亮度级的统计值计算出对应的概率

          实现代码:

void PhotoShop::Histogram(Mat& img, Mat& gImg)
{
	if ( gImg.empty())	
		gImg.create(480,480, CV_8UC1);		

	gImg = cv::Scalar::all(0);

	int i, j;
	Size size = img.size();
	int chns = img.channels();

	float total = size.width* size.height;

	int Count[256] = {0};
	float Probability[256]={0};

	if (img.isContinuous() && gImg.isContinuous())
	{
		size.width *= size.height; 
		size.height = 1;
	}

	for (  i= 0; i<size.height; ++i)
	{
		const unsigned char* src = (const unsigned char*)(img.data+ img.step*i);		
		for (  j=0; j<size.width; ++j)
		{						
			Count[src[j]]++;
		}
	}

	float maxP = 0;
	for ( i =0; i<256; ++i)
	{
		Probability [i] = Count[i]/total;
		if ( Probability[i]>maxP)
		{
			maxP = Probability[i];
		}	
	}

	int scale = 400/maxP;
	for ( i =0; i<256; ++i)
	{
		int py = (int)(Probability[i]*scale+0.5);
		// 画出概率图
		line(gImg, Point(i+80, gImg.rows-40),Point(i+80, gImg.rows-40-py),cv::Scalar::all(255),1);
	}

}
       这里只实现了单通道(灰度图像)的直方图计算方法,对于多通道的情况,可以进行通道拆分,分别予以计算,然后显示。

实现效果如下图所示:


       

            从颜色直方图上看,可以知道,这种图片的灰度分布较为均匀。图像的直方图包含了丰富的图像信息,描述各通道的亮度级分布,反应了亮度的分布情况,在图像处理中具有广泛的应用(如图像分割、增强等)。

作者:kezunhai 出处:http://blog.csdn.net/kezunhai 欢迎转载或分享,但请务必声明文章出处。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值