opencv - 这个使用OpenCV中GaussianBlur函数的subtract_gaussian_blur函数是做什么的?

标签 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 文档之后也是如此。

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

最佳答案

我能看到的主要步骤是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 添加到每个像素颜色 channel 。

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

结果不是完全灰度的 addWeighted()分别应用于像素的每个颜色 channel 。模糊前和模糊后图像的 RGB 值以不平衡方式不同的区域(即两个红色 channel 之间的差异比蓝色或绿色 channel 之间的差异大得多),将会有一定程度的颜色而不仅仅是灰色。

关于opencv - 这个使用OpenCV中GaussianBlur函数的subtract_gaussian_blur函数是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57093068/

相关文章:

c# - 从图像中找到直线上的角

c++ - OpenCV IOS调整垫子大小

Android图像处理过滤器导致OutOfMemory Exception

python - cv2.dnn' 使用 python 3.6 和 opencv3.4.1 没有属性 'readNet'

opencv - 使用IDCT(OpenCV)时出错

python - 如何使用 OpenCV python 获取对象的大小?

python - 如何还原由openface.AlignDlib.align完成的转换?

c++ - OpenCv 没有制定目标的规则

c++ - cvLoadImage 返回 NULL

windows - 帧到视频 - Windows 8 中的图像处理(仅限 WinRT)