调节图片对比度和亮度(像素变换)
原理
关于OpenCV的配置和基础用法,请参阅本专栏的其他文章:垚武田的OpenCV合集
以下的原理来自Richard Szeliski的书《Computer Vision: Algorithms and Applications》(《计算机视觉:算法和应用》)。
像素变换
图片处理的操作基本上就是一个传入一张或多张图片,然后输出一张结果图片的方法。
对某个图片对象进行的操作可以分为以下两大类:
- 点操作:像素变换
- 域操作:涉及到相邻的像素
这章主要讨论像素变换。在像素变换中,每个像素的计算结果只与输入的像素和其他参数有关,不与图片中的其他像素相关。像素变换的应用包括图片亮度、对比度调整,以及颜色校正和颜色变换等。
亮度和对比度调整
在亮度和对比度的线性调整中,像素变换的算法非常简单,就是一个简单的线性变换:
g ( x ) = α f ( x ) + β g(x) = \alpha f(x) + \beta g(x)=αf(x)+β
- α > 0 \alpha > 0 α>0,为增强参数; β \beta β为偏移参数
- α \alpha α控制对比度; β \beta β用来控制亮度
- f ( x ) f(x) f(x)为转换前的像素, g ( x ) g(x) g(x)为转换后的像素
也可以用行列坐标的形式来表示像素:
g ( i , j ) = α f ( i , j ) + β g(i, j) = \alpha f(i ,j) + \beta g(i,j)=αf(i,j)+β
- i i i和 j j j分别代表行号和列号
代码实现
首先导入图片并储存到Mat对象中。
//CommandLineParser对main函数输入的参数进行解析,最后的字符串代表以下意义:
//@input表示一个有顺序的参数,将其命名为input
//lena.jpg,代表input的默认值
//input image,是对input参数的解释,说明它是输入的图像
CommandLineParser parser(argc, argv, "{@input | lena.jpg | input image}");
Mat image{
imread(parser.get<Str