OpenCV学习笔记之改变图像的对比度和亮度

一、图像对比度和亮度

图像对比度指的是一幅图像中明暗区域最亮的白和最暗的黑之间不同亮度层级的测量,即指一幅图像灰度反差的大小。差异范围越大代表对比越大,差异范围越小代表对比越小,好的对比率120:1就可容易地显示生动、丰富的色彩,当对比率高达300:1时,便可支持各阶的颜色。

韦伯定律(感觉阈值定律): [2]  在同种刺激下,人所能感受到的刺激的动态范围正比于标准刺激的强度,K=ΔI/I K为给定刺激下的常数,I为刺激,ΔI为能感受到的刺激的动态范围。

应用到人的视觉刺激,定义韦伯对比度为:

I为物体的亮度,Ib为背景的整体亮度。

Michelson对比度

Michelson [3]  对比度又被称为“能见度”,定义为:

其中的 和

分别表示最亮的亮度和最暗的亮度。Michelson对比度与人的视觉感受中视锥细胞对视场光通量的空域频率的感受程度在理论上是一致的。

均方根对比度

Peli 于1990年提出,与内容的空域频率和空域分布均无关的图像的对比度,被定义成一幅光栅图像内像素值的 [4]  均方根(也就是标准差):

其中

描述的是一幅宽和高分别为w和h的光栅图,

是图像中指定位置的一个像素点的值,

 是图的亮度(像素平均值),

 是均方根对比度(像素标准差)。

对于数字图像变换,设原像素灰度为 f(i,j),转化后的像素灰度为 g(i,j),则常用的线性变换是 g(i,j)= af(i,j) + b, 其中系数 a 影响图像的对比度,系数 b 影响图像的亮度,具体如下:
(1) a=1时是原图;
(2) a>1时对比度增强,图像看起来更加清晰;
(3) a<1时对比度减弱,图像看起来变暗;
(4) b影响图像的亮度,随着增加b (b>0)和减小b (b>0),图像整体的灰度值上移或者下移, 也就是图像整体变亮或者变暗, 不会改变图像的对比度

二、实践操作

#include <QCoreApplication>
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/imgcodecs.hpp>
#include <QDebug>
#include <QDir>
#include <QFile>
#include "iostream"

using namespace std;
using namespace cv;

int main()
{
    double alpha = 2.2 , beta = 50;
    Mat oriImg;
    //! 读取图片
    oriImg = imread("C:/1.png",IMREAD_COLOR);
    if( !oriImg.data ) { qDebug("Error loading src1 \n"); return -1; }
    imshow("ori",oriImg);

    //! 图片大小要一致
    Mat resImg = Mat::zeros( oriImg.size(), oriImg.type() ); 
    //! 执行运算 resImg(i,j) = alpha*oriImg(i,j) + beta
    for( int y = 0; y < oriImg.rows; y++ )
    {
        for( int x = 0; x < oriImg.cols; x++ )
        {
            for( int c = 0; c < 3; c++ )
            {
                resImg.at<Vec3b>(y,x)[c] = saturate_cast<uchar>( alpha*( oriImg.at<Vec3b>(y,x)[c] ) + beta );
            }
        }
    }

    imshow( "adjust", resImg );
    waitKey(0);
    return 0;
}

参考资料:

附录1:saturate_cast作用

为了安全转换,运算结果可能超出像素取值范围(溢出),还可能是非整数(如果是浮点数的话),用saturate_cast对结果进行转换,以确保它为有效值。

猜你喜欢

转载自blog.csdn.net/a8039974/article/details/104862821