OpenCV核心功能---改变图像的对比度和亮度

理论

图像处理

  • 一般图像处理操作符是获取一个或多个输入图像并产生输出图像的功能。
  • 图像变换可以看作:
  1. 点运算符(像素变换)
  2. 邻域(基于区域)运算

像素转化

  • 在这种图像处理变换中,每个输出像素的值仅取决于相应的输入像素值(加上,可能地,一些全局收集的信息或参数)。
  • 这种算子的例子包括亮度和对比度调整以及颜色校正和变换。

亮度和对比度调整

       其中i和j表示像素位于第i行和第j列。 

  • 两个常用的点过程是乘法和加法与常量:
  • 参数α> 0和β通常称为增益和偏置参数; 有时这些参数据说分别控制对比度和亮度。
  • 您可以将f(x)视为源图像像素,将g(x)视为输出图像像素。 然后,我们可以更方便地将表达式编写为:

代码

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
double alpha; /*< Simple contrast control */
int beta;  /*< Simple brightness control */
int main( int argc, char** argv )
{
    Mat image = imread( argv[1] );
    Mat new_image = Mat::zeros( image.size(), image.type() );
    std::cout<<" Basic Linear Transforms "<<std::endl;
    std::cout<<"-------------------------"<<std::endl;
    std::cout<<"* Enter the alpha value [1.0-3.0]: ";std::cin>>alpha;
    std::cout<<"* Enter the beta value [0-100]: "; std::cin>>beta;
    for( int y = 0; y < image.rows; y++ ) {
        for( int x = 0; x < image.cols; x++ ) {
            for( int c = 0; c < 3; c++ ) {
                new_image.at<Vec3b>(y,x)[c] =
                saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta );
            }
        }
    }
    namedWindow("Original Image", 1);
    namedWindow("New Image", 1);
    imshow("Original Image", image);
    imshow("New Image", new_image);
    waitKey();
    return 0;
}

解释

      (1)初始像素值等于零

      (2)与原始图像大小和类型相同

    (1)要访问图像中的每个像素,我们使用以下语法:image.at <Vec3b>(y,x)[c]其中y是行,x是列,c是R,G或B(0,1或2)。

    (2) 由于操作α⋅p(i,j)+β可以给出超出范围的值或不是整数(如果α是浮点数),我们使用cv :: saturate_cast来确保值有效。

  1. 我们首先创建参数以保存用户输入的α和β:
  2. 我们使用cv :: imread加载图像并将其保存在Mat对象中:
  3. 现在,由于我们将对此图像进行一些转换,因此我们需要一个新的Mat对象来存储它。 此外,我们希望它具有以下功能:
  4. 现在,为了执行操作g(i,j)=α⋅f(i,j)+β,我们将访问图像中的每个像素。 由于我们使用BGR图像进行操作,因此每个像素(B,G和R)将有三个值,因此我们也将单独访问它们。
  5. 最后,我们创建窗口并以通常的方式显示图像。

运行结果

猜你喜欢

转载自blog.csdn.net/LYKymy/article/details/83119664