有些图像对比度太低,可以通过比例换算的方法提升对比度。
image.png
其中I是原始灰度值,O是结果灰度值。
问题是如何确定Imax和Imin。此处使用一个百分比阈值,表示最小强度值0和最大强度值255像素的百分比。
cv::Mat
EnhanceContrast(Mat src, Mat hist, double percent)
{
// 像素的百分比
float number = src.total() * percent;
// 找到直方图的左极限
int imin = 0;
for (float count = 0; imin< 256; ++imin) {
// 小于或者等于imin的像素数量必须大于number
if ((count += hist.at<float>(imin)) >= number) {
break;
}
}
// 找到直方图的右极限
int imax = 255;
for (float count = 0; imax > 0; --imax) {
// 小于或者等于imin的像素数量必须大于number
if ((count += hist.at<float>(imin)) >= number) {
break;
}
}
Mat result;
Mat lut(1, 256, CV_8U);
for (size_t i = 0; i < 256; i++) {
lut.at<uchar>(i) = 255 * (i - imin) / (imax - imin) + 0;
}
LUT(src, lut, result);
return result;
}
其中hist上计算得到的一维直方图。对比效果如下:
image.png
网友评论