识别渐变填充区域

时间:2012-02-29 16:40:15

标签: image-processing

之前我问了一个相关问题:Image segmentations with gradient filled regions

但是这一次,我有一个更简单的问题(我认为)。给定一个区域(像素集),我想知道它是否填充了线性渐变。为此,我想到使用3X3 sobel滤波器在x和y方向找出图像梯度,然后检查梯度的方向。如果该方向保持不变,则该区域可以被分类为梯度填充区域。

它适用于水平和垂直方向渐变,但不是一般的。例如,似乎对于45度线性渐变,梯度方向在1到3之间的相邻像素上变化很大。

我无法理解为什么会发生这种情况以及如何解决这个问题。从理论上讲,到处都应该是1。

2 个答案:

答案 0 :(得分:2)

Wikipedia说:

Sobel算子在减少与纯中心差分算子相关的伪影的同时,没有完美的旋转对称性。 Scharr考虑优化这个属性。已经在那里展示了尺寸为5 x 5的过滤器内核,但最常用的是......

这是Sharr的论文,快乐学习:) http://archiv.ub.uni-heidelberg.de/volltextserver/volltexte/2000/962/pdf/Diss.pdf

答案 1 :(得分:1)

你有了正确的想法,只需在计算空间导数时使用高斯滤波器。 最后,通过选择方向图像的渐变幅度的暗像素来获得渐变填充区域。

修改 关于Gaussian filters的维基百科文章。

在我的代码中,我使用以下卷积内核(水平然后垂直导数):

{
 {0.00623304, 0.012975, 0., -0.012975, -0.00623304},
 {0.0259501, 0.054019, 0., -0.054019, -0.0259501},
 {0.0581332, 0.121013, 0., -0.121013, -0.0581332},
 {0.0259501, 0.054019, 0., -0.054019, -0.0259501},
 {0.00623304, 0.012975, 0., -0.012975, -0.00623304}
}

{
 {0.00623304, 0.0259501, 0.0581332, 0.0259501, 0.00623304},
 {0.012975, 0.054019, 0.121013, 0.054019, 0.012975},
 {0., 0., 0., 0., 0.},
 {-0.012975, -0.054019, -0.121013, -0.054019, -0.012975},
 {-0.00623304, -0.0259501, -0.0581332, -0.0259501, -0.00623304}
}

作为概念验证,这是它在Mathematica中的外观,使用包含倾斜渐变区域和垂直渐变区域的测试图像:

enter image description here