OpenCV实验系列之修改图片对比度与亮度



OpenCV实验系列之修改图片对比度与明亮度


注意:以下内容根据opencv官网提供的教程结合个人理解所得,仅是个人学习笔记,可能存在错误或偏差,欢迎指正。


对比度与亮度的理解(个人臆测)

以下对于对比度的解释来自百度百科

对比度指的是一幅图像中明暗区域最亮的白和最暗的黑之间不同亮度层级的测量,差异范围越大代表对比越大,差异范围越小代表对比越小,好的对比率120:1就可容易地显示生动、丰富的色彩,当对比率高达300:1时,便可支持各阶的颜色。但对比率遭受和亮度相同的困境,现今尚无一套有效又公正的标准来衡量对比率,所以最好的辨识方式还是依靠使用者眼睛。

以灰度图来举例,个人理解就是图片中亮与暗点间的灰度差值,比如255与200的对比度小于255与100的对比度,对于灰度图来说亮度就是整体的白的程度。由此可以得出对对比度和亮度进行调节的公式:
这里写图片描述

α用来控制对比度,β用来控制亮度。可以想象当α>1是图片的对比度将扩大(扩大了像素点间的差异),β>0时亮度将提高,当0<α<1是图片的对比度将j减小,β<0时亮度将减小。

实现方法

可以使用LUT()

http://blog.csdn.net/Nrush/article/details/79330077
进行处理在下例中使用一般遍历的方法进行处理。

#include 
#include  
#include  
#include 

using namespace std;
using namespace cv;

void main()
{
    double alpha = 1.5; double beta = 0;
    Mat src;
    src = imread( "timg.jpg" );
    imshow("src",src);
    Mat dst = Mat::zeros( src.size(), src.type());

    for( int y = 0; y < src.rows; y++ ) {
        for( int x = 0; x < src.cols; x++ ) {
            for( int c = 0; c < 3; c++ ) {
                dst.at(y,x)[c] =
                  saturate_cast( alpha*( src.at(y,x)[c] ) + beta );
            }
        }
    }

    imshow( "dst", dst );
    waitKey(0);
}

运行结果
原图
原图
这里写图片描述
α = 1,β = 50.提高亮度结果
这里写图片描述
α = 1,β = -50.降低亮度结果
这里写图片描述
α = 1.5,β = 0 提高对比度结果
这里写图片描述
α = 0.5,β = 0 降低对比度结果