OpenCV图像对比度亮度调整

新机器视觉

共 2679字,需浏览 6分钟

 ·

2021-07-26 18:32

点击下方卡片,关注“新机器视觉”公众号

视觉/图像重磅干货,第一时间送达

来源:洞庭余人

理论依据

首先了解一下算子的概念,一般的图像处理算子都是一个函数,它接受一个或多个输入图像,并产生输出图像。下面是算子的一般形式。

g(x) = (h(f(x)) 或者 g(x) = h(f0(x)......fn(x))

图像亮度和对比度的操作,其实属于图像处理变换中比较简单的一种-点操作(point operators)。点操作有一个特点:仅仅根据输入像素值来计算相应的输出像素值。这类算子包括亮度(brightness)和对比度(contrast)调整、颜色校正(color correction)和变换(transformations)。

两种最常见的点操作是乘上一个常数(对比度的调节)以及加上一个常数(亮度值的调节)。公式如下:

g(x) = a * f(x) + b

  • f(x) 表示原图像像素。

  • g(x) 表示输出图像像素。

  • 参数 a( a > 0)被称为增益,常用来控制图像的对比度。

  • 参数 b 通常称为偏置(bias),常用来控制图像的亮度。

进一步,我们这样改写这个公式:

g(i,j) = a * f(i,j) + b

其中i,j 表示像素位于第 i 行和第 j 列,这个公式可以用来作为我们在 OpenCV 中控制图像亮度和对比度的理论公式。

示例程序

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
#define WINDOW_NAME "Tracker"
const int MAX_VALUE = 100;
int contrastValue; //对比度
int brightnessValue; //亮度
Mat src;
Mat dstImage;

void onTrack(int, void *) {

   for (int row = 0; row < src.rows; row++) {
       //列
       for (int col = 0; col < src.cols; col++) {

           Vec3b pixels = src.at<Vec3b>(row, col);
           dstImage.at<Vec3b>(row, col)[0] = saturate_cast<uchar>((contrastValue * 0.01) * pixels[0] + brightnessValue);
           dstImage.at<Vec3b>(row, col)[1] = saturate_cast<uchar>((contrastValue * 0.01) * pixels[1] + brightnessValue);
           dstImage.at<Vec3b>(row, col)[2] = saturate_cast<uchar>((contrastValue * 0.01) * pixels[2] + brightnessValue);
       }
   }
   imshow(WINDOW_NAME,dstImage);
   imwrite("../opencv_contrast_brightness.jpg",dstImage);}int main() {

   //读取图片

   src = imread("../lena.png");
   dstImage = Mat::zeros(src.size(), src.type());
   //显示图片
   imshow("Tracker", src);

   contrastValue = 60;
   brightnessValue = 50;

   namedWindow(WINDOW_NAME, WINDOW_NORMAL);

   createTrackbar("Contrast", WINDOW_NAME, &contrastValue, MAX_VALUE, onTrack);
   createTrackbar("Brightness", WINDOW_NAME, &brightnessValue, MAX_VALUE, onTrack);

   onTrack(contrastValue, 0);
   onTrack(brightnessValue, 0);

   waitKey(0);
   return 0;}

—版权声明—

仅用于学术分享,版权属于原作者。

若有侵权,请联系微信号:yiyang-sy 删除或修改!


—THE END—
浏览 50
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报