• OpenCV基础(四)---图像对比度,亮度调整


    图像对比度,亮度调整

    图像对比度,指不同像素间的差值,差值越大,对比度越大.

    图像亮度,对于RGB图像,亮度最大为(255,255,255),最暗为(0,0,0).

    调整公式如上,f(x)为源图像,g(x)为输出图像

           α为增益,用于设置图像对比度

           β为偏置,用于调整图像亮度

    函数介绍:createTrackbar()

    这里创建了两个滑动条,用于调整α,β

    函数原型: int createTrackbar(const String& trackbarname, const String& winname,
                  int* value, int count,
                  TrackbarCallback onChange = 0,
                  void* userdata = 0);

    参数说明:

    const String& trackbarname:滑动条的名字

    const String& winname:窗口的名称,该窗口将用作创建的滑动条的父窗口

    int* value:值可选指针,指向一个整型变量,其值反映滑块的位置。创建时,滑块位置由该变量定义

    int count:滑块的最大位置。最小位置总是0。

    TrackbarCallback onChange = 0:指针指向每次滑块改变位置时要调用的函数。这个函数的原型应该是void Foo(int,void*);,其中第一个参数是trackbar位 置,第二个参数是用户数据(参见下一个参数)。如果回调是空指针,则不调用回调,只更新值

    void* userdata = 0: 作为回调函数传递的用户数据。它可以在不使用全局变量的情况下处理trackbar事件

    代码演示

     1 #include <opencv2/opencv.hpp>
     2 #include <iostream>
     3 
     4 using namespace std;
     5 using namespace cv;
     6 
     7 Mat src, dst;
     8 const char * contrast_bar = "对比度";
     9 const char * bright_bar = "亮度";
    10 const char * window_name = "效果图";
    11 int contrast_value;
    12 int bright_value;
    13 int max_contrast = 200;    //最大对比度,为2倍  
    14 int max_bright = 100;   //最大偏置
    15 int channels;
    16 static void adjustContrastAndBright(int, void *);
    17 
    18 int main()
    19 {
    20     src = imread("D:/xiaobai.png");
    21     if (src.empty()) {
    22         cout << "could not load image..." << endl;
    23         return false;
    24     }
    25     imshow("xiaobai", src);
    26     dst = Mat::zeros(src.size(), src.type());
    27     channels = src.channels();  //获取图像通道数
    28     contrast_value = 100;  //设置初始对比度   
    29     bright_value = 0;   //设置初始亮度
    30 
    31     namedWindow(window_name, CV_WINDOW_AUTOSIZE);
    32 
    33     //创建轨迹条
    34     createTrackbar(contrast_bar, window_name, &contrast_value, max_contrast, adjustContrastAndBright);
    35     createTrackbar(bright_bar, window_name, &bright_value, max_bright, adjustContrastAndBright);
    36     
    37     //调用回调函数
    38     adjustContrastAndBright(contrast_value, 0);
    39     adjustContrastAndBright(bright_value, 0);
    40 
    41     waitKey(0);
    42     return 0;
    43 }
    44 
    45 static void adjustContrastAndBright(int, void *)
    46 {
    47     switch (channels)
    48     {
    49     case 1:
    50         for (int row = 0; row < src.rows; row++)
    51             for (int col = 0; col < src.cols; col++){
    52                 float v = src.at<uchar>(row, col);
    53                 // saturate_cast 限制结果在0-255之间
    54                 dst.at<uchar>(row, col) = saturate_cast<uchar>(v * contrast_value * 0.01 + bright_value); //调整
    55         }
    56     case 3:
    57         for (int row = 0; row < src.rows; row++)
    58             for (int col = 0; col < src.cols; col++) {
    59                 float b = src.at<Vec3b>(row, col)[0];// blue
    60                 float g = src.at<Vec3b>(row, col)[1]; // green
    61                 float r = src.at<Vec3b>(row, col)[2]; // red            
    62                 //调整
    63                 dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b * contrast_value * 0.01 + bright_value);
    64                 dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g * contrast_value * 0.01 + bright_value);
    65                 dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r * contrast_value * 0.01 + bright_value);
    66             }
    67     }
    68     imshow(window_name, dst);
    69 }

    原始图像

    效果图

           

     

  • 相关阅读:
    Kprobes—insight into the Linux kernel—replace kernel function with module
    Go将统治下一个十年
    linux—网络仿真开源软件—network simulator—ns
    Serval Project——Android
    CentOS7—Firefox—截图工具—fireshot插件
    Wi-Fi Direct技术
    国产CPU迷局 龙芯该如何参与市场竞争
    《深入理解Android:Wi-Fi,NFC和GPS》—android源码下载
    wifi direct—深入理解Wi-Fi P2P
    c语言学习基础:[1]开发工具介绍
  • 原文地址:https://www.cnblogs.com/zmm1996/p/10662502.html
Copyright © 2020-2023  润新知