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

来源:互联网 发布:淘宝店铺综合评分497 编辑:程序博客网 时间:2024/05/22 18:40

一、理论分析

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

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<opencv2/opencv.hpp>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<uchar>((g_nBrightValue*0.01)*(g_srcImage.at<cv::Vec3b>(y, x)[c]) + g_nContrastValue);                //saturate_cast<uchar> 防止数据溢出,强制装换成uchar类型            }        }    }    imshow("【原始图】", g_srcImage);    imshow("【效果图】", g_dstImage);}
0 0