opencv学习笔记(十六)——图像对比度和亮度值

一、理论分析

对于图像亮度和对比度的调整主要是加上或者乘上一个常数,理论公式如下:

g(x,y)<c> = a*f(x,y)<c>+b
  • f(x,y)< c >代表源图像第x行,第y列像素点第c通道的值
  • g(x,y)< c>代表输出图像第x行,第y列像素点第c通道的值
  • a(a>0)通常称为增益(放大倍数),用来控制图像的对比(为了观察结果,一般设置为0.0到3.0之间)
  • b通常被称为偏置,用来控制图像的亮度

例程:

#include

static void on_ContrastAndBright(int, void*);

int g_nContrastValue;
int g_nBrightValue;
cv::Mat g_srcImage, g_dstImage;

int main()
{
    g_srcImage = cv::imread("亚丝娜.jpg");
    if (!g_srcImage.data)   { printf("源图像加载失败!"); return 0; }
    g_dstImage = cv::Mat::zeros(g_srcImage.size(), g_srcImage.type());

    g_nContrastValue = 80;
    g_nBrightValue = 80;

    cv::namedWindow("【效果图】", 1);

    cv::createTrackbar("对比度:", "【效果图】", &g_nContrastValue, 300, on_ContrastAndBright);
    cv::createTrackbar("亮  度:", "【效果图】", &g_nBrightValue, 200, on_ContrastAndBright);

    on_ContrastAndBright(g_nContrastValue, 0);
    on_ContrastAndBright(g_nBrightValue, 0);
    while (char(cv::waitKey(1)) != 'q') {}
    return 1;

}

static void on_ContrastAndBright(int, void*)
{
    cv::namedWindow("【原始图】");
    for (int y = 0; y < g_srcImage.rows; y++)
    {
        for (int x = 0; x < g_srcImage.cols; x++)
        {
            for (int c = 0; c < 3; c++)
            {
                g_dstImage.at<cv::Vec3b>(y, x)[c] = cv::saturate_cast((g_nBrightValue*0.01)*(g_srcImage.at<cv::Vec3b>(y, x)[c]) + g_nContrastValue);
                //saturate_cast 防止数据溢出,强制装换成uchar类型
            }
        }
    }
    imshow("【原始图】", g_srcImage);
    imshow("【效果图】", g_dstImage);
}

你可能感兴趣的:(opencv)