OpenCV 4.11.0
开源计算机视觉库
|
上一教程: 使用 OpenCV 添加(混合)两张图像
下一教程: 离散傅里叶变换
原作者 | Ana Huamán |
兼容性 | OpenCV >= 3.0 |
在本教程中,您将学习如何:
两个常用的点过程是与常数的乘法和加法
\[g(x) = \alpha f(x) + \beta\]
您可以将\(f(x)\)视为源图像像素,将\(g(x)\)视为输出图像像素。然后,我们可以更方便地将表达式写成
\[g(i,j) = \alpha \cdot f(i,j) + \beta\]
其中\(i\)和\(j\)表示像素位于第i行和第j列。
我们观察到 cv::Mat::zeros 基于 image.size() 和 image.type() 返回一个 Matlab 风格的零初始化器
注意以下几点 (**仅限 C++ 代码**)
其中cv::Mat::convertTo将有效地执行*new_image = a*image + beta*。但是,我们想向您展示如何访问每个像素。无论哪种方法,结果都相同,但convertTo方法经过优化,速度更快。
在本段中,我们将运用所学知识,通过调整图像的亮度和对比度来校正曝光不足的图像。我们还将看到另一种校正图像亮度的技术,称为伽马校正。
增加/减少\(\beta\)值将向每个像素添加/减去一个常数值。像素值超出[0;255]范围将被饱和(即,高于255/低于0的像素值将被钳位到255/0)。
直方图表示对于每个颜色级别,具有该颜色级别的像素数量。暗图像将有很多具有低颜色值的像素,因此直方图在其左侧将出现峰值。添加常数偏差时,直方图将向右移动,因为我们已向所有像素添加了常数偏差。
\(\alpha\)参数将修改级别的扩展方式。如果\( \alpha < 1 \),颜色级别将被压缩,结果将是对比度较低的图像。
请注意,这些直方图是使用GIMP软件中的亮度-对比度工具获得的。亮度工具应与\(\beta\)偏差参数相同,但对比度工具似乎与\(\alpha\)增益不同,其中输出范围在GIMP中似乎居中(正如您在上一个直方图中注意到的那样)。
使用\(\beta\)偏差可能会改善亮度,但同时图像可能会出现轻微的薄雾,因为对比度会降低。\(\alpha\)增益可用于减少这种影响,但由于饱和度,我们将丢失原始明亮区域中的某些细节。
伽马校正可用于通过使用输入值和映射输出值之间的非线性变换来校正图像的亮度。
\[O = \left( \frac{I}{255} \right)^{\gamma} \times 255\]
由于此关系是非线性的,因此对所有像素的影响将不同,并且取决于它们的原始值。
当\( \gamma < 1 \)时,原始暗区将更亮,直方图将向右移动,而当\( \gamma > 1 \)时则相反。
下图已使用以下参数进行校正:\( \alpha = 1.3 \) 和 \( \beta = 40 \)。
整体亮度得到了改善,但是您可以注意到,由于所用实现的数值饱和度(在摄影中称为高光剪切),云现在严重饱和。
下图已使用以下参数进行校正:\( \gamma = 0.4 \)。
伽马校正应倾向于减少饱和度效应,因为映射是非线性的,并且与之前的方法不同,不存在数值饱和的可能性。
上图比较了三张图像的直方图(三个直方图之间的y范围不同)。您可以注意到,对于原始图像,大多数像素值位于直方图的下部。经过\(\alpha\),\(\beta\)校正后,我们可以观察到由于饱和度而在255处出现一个大峰值,以及向右的偏移。伽马校正后,直方图向右移动,但暗区中的像素移动得更多(参见伽马曲线图)比亮区中的像素。
在本教程中,您已经看到了两种调整图像对比度和亮度的简单方法。这些是基本技术,并非旨在替代光栅图形编辑器!
伽马校正代码
使用查找表可以提高计算性能,因为只需要计算一次256个值。