![]() |
OpenCV 4.12.0
开源计算机视觉
|
考虑一个图像,其像素值仅限于某些特定值的范围内。例如,较亮的图像的所有像素都将限制在高值范围内。但是,好的图像将具有来自图像所有区域的像素。因此,您需要将此直方图拉伸到两端(如下图所示,来自维基百科),这就是直方图均衡化所做的事情(简单来说)。这通常会提高图像的对比度。
我建议您阅读维基百科关于直方图均衡化的页面以获取更多详细信息。它有一个非常好的解释和示例,因此您阅读后几乎可以理解所有内容。
我们使用函数:cv.equalizeHist (src, dst)
| src | 源 8 位单通道图像。 |
| dst | 与 src 相同大小和类型的目标图像。 |
在自适应直方图均衡化中,图像被分成称为“tiles”的小块(在 OpenCV 中,tileSize 默认是 8x8)。然后,通常对这些块中的每一个进行直方图均衡化。因此,在一个小区域中,直方图将限制在一个小区域内(除非存在噪声)。如果存在噪声,它将被放大。为了避免这种情况,应用了对比度限制。如果任何直方图 bin 高于指定的对比度限制(在 OpenCV 中默认为 40),则在应用直方图均衡化之前,这些像素会被裁剪并均匀地分布到其他 bins。均衡化后,为了消除 tile 边界中的伪影,应用了双线性插值。
我们使用类:cv.CLAHE (clipLimit = 40, tileGridSize = new cv.Size(8, 8))
| clipLimit | 对比度限制的阈值。 |
| tileGridSize | 用于直方图均衡化的网格大小。 输入图像将被分成大小相等的矩形 tiles。 tileGridSize 定义了行和列中的 tiles 数量。 |