【数字图像处理】直方图均衡

//直方图均衡
Mat HistogramEquilibrium(Mat src)
{
	int num = 1;
	//首先创建一个存储像素灰度值以及灰度值出现次数的键值对
	map<int,int> pixelStatistic;
	//遍历图像像素,统计各灰度值出现次数
	for(int r = 0;r < src.rows;r++)
	{
		uchar* srcRowData = src.ptr<uchar>(r);
		for(int c = 0;c < src.cols;c++)
		{
			map<int,int>::iterator it = pixelStatistic.find(srcRowData[c]); 
			if(it != pixelStatistic.end())
			{
				it->second++;
			}
			else
			{
				pixelStatistic.insert(pair<int, int>(srcRowData[c], num));
			}
		}
	}
	//创建灰度值及其出现概率的键值对
	map<int, double> probability;
	int sum = 0;
	//计算各灰度值在直方图均衡过程中的映射关系(等于从0灰度值开始,各灰度值的概率向下求和)
	for(int i = 0;i <= 255;i++)
	{
		map<int, int>::iterator it = pixelStatistic.find(i);
		sum += it->second;
		probability.insert(pair<int, double>(i, sum * 1.0 / (src.rows * src.cols)));
	}
	Mat dst;
	dst.create(src.size(), src.type());
	//将各灰度值映射到相应的灰度级中,得到均衡后的灰度值
	for(int r = 0;r < src.rows;r++)
	{
		uchar* srcRowData = src.ptr<uchar>(r);
		uchar* dstRowData = dst.ptr<uchar>(r);
		for(int c = 0;c < src.cols;c++)
		{
			map<int, double>::iterator it = probability.find(srcRowData[c]);
			dstRowData[c] = (uchar)(it->second * 255);
		}
	}
	return dst;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值