![]() |
OpenCV 4.12.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 个值。