//直方图均衡
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;
}
【数字图像处理】直方图均衡
最新推荐文章于 2023-10-10 20:52:22 发布