opencv学习之一亮度对比度调节

修改图像的对比度和亮度

目标

  • 获取像素值
  • 初始化零矩阵
  • 学习使用cv::saturate_cast和作用“
  • 学习一些比较酷的像素转换

原理

图像处理

通常图像处理操作就是一个函数,包含一个或者多个输入图像然后产生一个输出结果。
图像转化可以看成两种操作,一种是像素点的操作,第二种就是临域的操作(就是图像的一个区域内的操作)

像素点转化

这种图像处理每一个输出像素点的值依赖于相对应的输入像素点的值的加减处理。做这些处理的两个基本的例子就是图像的亮度和对比度的调节。

亮度和对比度调节

通常的图像处理的公式如下:

                g(x)=αf(x)+β

参数alpha>0,alpha叫增益因子和beta叫偏移因子。alpha控制对比度,beta控制亮度。
下面的公式更符合图像处理,g(i,j)表示输出点,f(i,j)表示输入点基本i,j代表图像中的行和列位置。

                    g(i,j)=α⋅f(i,j)+β

代码

下面的代码执行的是g(i,j)=α⋅f(i,j)+β的操作。

#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. 我们开始创建两个参数alpha和beta,然后通用用户输入。
double alpha;
double beta;

2.使用cv::imread读取一张图片

Mat image = imread(argv[1]);

3.创建一张图片矩阵,初始化矩阵为0,并且与image同样大小和同样的通道数。

Mat new_image = Mat::zeros(image.size(),image.type());

4.下面执行操作g(i,j)=α⋅f(i,j)+β ,我们将会遍历每一个像素。因为图像的格式是BGR,我们每个像素需要操作三个值(BGR)。我们需要分别操作它们。

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 );
        }
    }
}

这里遍历每一个像素使用image.at(y,x)[c]。
由于计算结果可能会超出范围或者不是整数,我们使用cv::saturate_cast来确保计算结果可用。
5.最后,我们创建一个窗口来显示图像。

namedWindow("Original Image", 1);
namedWindow("New Image", 1);
imshow("Original Image", image);
imshow("New Image", new_image);
waitKey(0);

其实可以使用cv::Mat::convertTo会更高效。

image.convertT(new_image,-1,aplha,beta);

函数原型:

void cv::Mat::convertTo     (   OutputArray     m,
        int     rtype,
        double      alpha = 1,
        double      beta = 0 
    )       const

函数执行公式如下:
m(x,y)=saturate_cast(α(∗this)(x,y)+β)
参数说明:
m是输出矩阵。
rtype期望输出矩阵类型。

运行结果

使用alpha=2.2 beta=50。然后得到运行结果


***** VIDEOINPUT LIBRARY - 0.1995 - TFW07 *****

 Basic Linear Transforms
-------------------------
* Enter the alpha value [1.0-3.0]: 2.2
* Enter the beta value [0-100]: 50
* 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用OpenCV进行图像处理时,我们经常需要调整图像的对比度。可以使用cv::Mat的convertTo()函数来实现对比度调节,但是如果需要实时调节对比度,可以使用滑条回调函数来实现。 下面是一个简单的示例代码,演示了如何使用滑条回调函数来实现对比度调节: ```c++ #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int g_contrast_value = 50; // 对比度初始值 int g_brightness_value = 50; // 亮度初始值 Mat g_srcImage, g_dstImage; // 对比度亮度调节函数 void onContrastAndBright(int, void*) { // 计算对比度亮度值 int contrast_value = g_contrast_value - 50; double brightness_value = g_brightness_value - 50; // 计算缩放比例 double scale = pow(2, contrast_value / 50.0); // 计算像素值偏移量 double delta = brightness_value * 255 / 100.0; // 对图像进行对比度亮度调节 g_srcImage.convertTo(g_dstImage, -1, scale, delta); // 显示调整后的图像 imshow("dstImage", g_dstImage); } int main() { // 读取图像 g_srcImage = imread("test.jpg"); // 创建窗口 namedWindow("srcImage", WINDOW_NORMAL); namedWindow("dstImage", WINDOW_NORMAL); // 创建滑条 createTrackbar("Contrast", "dstImage", &g_contrast_value, 100, onContrastAndBright); createTrackbar("Brightness", "dstImage", &g_brightness_value, 100, onContrastAndBright); // 初始化图像 onContrastAndBright(g_contrast_value, 0); // 显示原始图像 imshow("srcImage", g_srcImage); // 等待按键 waitKey(); return 0; } ``` 在这个示例代码中,我们首先读取了一张图像,然后创建了两个窗口,一个用于显示原始图像,一个用于显示调整后的图像。接着,我们创建了两个滑条,一个用于调节对比度,一个用于调节亮度。每当滑条的值发生变化时,就会调用onContrastAndBright()函数进行对比度亮度调节。最后,我们显示了原始图像,并等待按键。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值