【數字圖像處理】直方圖均衡

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/wl1070325332/article/details/77895159
//直方圖均衡
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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章