调整图像对比度

2020-04-15  本文已影响0人  coolTigers

有些图像对比度太低,可以通过比例换算的方法提升对比度。


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
上一篇下一篇

猜你喜欢

热点阅读