为什么方向导数在使用高斯滤波器时效果更好?

信息处理 图像处理 过滤器 边缘检测
2022-02-15 11:49:12

我一直致力于图像分割和计算灰度图像的方向导数,目的是检测轮廓和边缘。我已经意识到,如果我在计算方向导数之前应用高斯滤波器,边缘会得到更好的增强。所以我的问题是——为什么会这样?

这是原始图像:

在此处输入图像描述

这是一阶导数(dx 和 dy)的样子(没有高斯滤波器): 在此处输入图像描述

这是对图像应用高斯滤波后的导数,sigma = 6:

在此处输入图像描述

*******计算导数的Python代码

with rio.open("vein_template.tif", 'r') as ds:
    RGB_arr = ds.read(masked=True)  # read all raster values
rgb_1 = np.rot90(np.transpose(RGB_arr, [1, 2, 0]))
#the rgb image contains 4 channels, so I'm changing their order, and making the image upright

%matplotlib
plt.imshow(rgb_1)

# Transform to grey-level img
gsi = 0.2989 * rgb_1[:, :, 0] + 0.5870 * rgb_1[:, :, 1] + 0.1140 * rgb_1[:, :, 2] 
plt.imshow(gsi, cmap = "gist_gray")

#compute derivatives
dx = np.diff(gsi, axis = 0)
dy = np.diff(gsi, axis = 1)

f = plt.figure()
f.add_subplot(1, 2, 1)
plt.imshow(dx, cmap = "Greys")
plt.title("dx")
f.add_subplot(1, 2, 2)
plt.imshow(dy, cmap = "Greys")
plt.title("dy")
2个回答

好吧,看看你的原始图片:除了边缘之外的所有点都是恒定的,这意味着除了这些边缘之外的所有点你的导数都是零。

通过对其应用“舍入、平滑”过滤器,您可以“涂抹”边缘足以使导数在每个方向上对多个像素都非零。

我会将您的条款改写为:

就频率分离而言,2 点梯度是非常差的过滤器,实际上您的图像在局部具有相当高的频率内容,因为它是分段连续的。因此,过滤器的行为很笨拙。如果您进行二次采样,情况会更糟,因为您可能会错过边缘。如果您在像素 ] 上逐块应用卷积 ] ,您将只会看到零。例如,这发生在 Haar 小波中。[1,1][0,0,1,1]

大多数使用的导数过滤器是基于观察到的补丁通常是:

  • 边缘奇异(急剧变化)
  • 沿边缘规则(平滑变化)

这在交叉路口和拐角处并不完全正确。然而,人们经常将平滑和(更好的)导数结合起来,就像在非常简单的 Sobel 边缘检测器滤波器中一样:

[121000121]

结合一个 3 点导数(比好一点)和一个 3 点平滑器,它原来是一个非常短的离散高斯近似,基于帕斯卡三角形。[101][11][121]

就你而言,你们俩都使用高斯:

  • 在一个方向上创建了一个更长的平滑滤波器,
  • 在另一个方向上创建了一个更长的梯度滤波器,因为它看起来像一个高斯导数。

这种组合更适合您的图像形态。然而,其他更具方向性的滤波器设计也是可能的。