在OpenCV中使用GaussianBlur函数的减法_gaussian_blur函数有什么作用?

时间:2019-07-18 11:05:22

标签: opencv image-processing

我遇到了具有以下功能的this Kaggle内核。

def subtract_gaussian_blur(img):
    gb_img = cv2.GaussianBlur(img, (0, 0), 5)
    return cv2.addWeighted(img, 4, gb_img, -4, 128)

这将转换此RGB图像。

enter image description here

进入下图。

enter image description here

我可以看到效果是它使图像有些锐化并将其转换为更灰度的图像(因为该图像仍然是RGB,所以实际上不是灰度的),但是我不确定我是否完全了解该函数的功能即使在阅读了有关GaussianBlur和addWeighted的OpenCV文档之后。

此外,这种特殊的图像转换是否具有我可以进一步阅读的特定名称?

1 个答案:

答案 0 :(得分:3)

我可以看到的主要步骤是cv2.addWeighted(img, 4, gb_img, -4, 128)。 addWeighted的基本公式为dst(I)=saturate(src1(I)∗alpha+src2(I)∗beta+gamma)。在此处的示例中,alpha为4,beta -4和gamma 128。

我对这是如何工作的理解是,它首先执行高斯模糊处理以生成图像的去噪版本。但是,除了消除噪声外,高斯模糊还可以“涂抹”边缘,这在以后很重要。然后从原始图像中减去降噪后的版本,并向每个像素颜色通道添加128。

在原始像素与过滤后的像素相同的区域中,这将导致均匀的灰色区域。在原始像素和过滤后的像素相差很大的区域中,取决于原始像素或过滤后的像素的强度较高,您最终会得到较亮或较暗的区域。差异将在原始图像的边缘附近最明显,因为高斯模糊会强烈地“涂抹”这些差异。

由于addWeighted()分别应用于像素的每个颜色通道,因此结果不是完全灰度。前后模糊图像的RGB值以不平衡方式变化的区域(即,两个红色通道之间的差异远大于蓝色或绿色通道之间的差异),将有一定程度的颜色,而不仅仅是灰色。 / p>