之前我问了一个相关问题:Image segmentations with gradient filled regions
但是这一次,我有一个更简单的问题(我认为)。给定一个区域(像素集),我想知道它是否填充了线性渐变。为此,我想到使用3X3 sobel滤波器在x和y方向找出图像梯度,然后检查梯度的方向。如果该方向保持不变,则该区域可以被分类为梯度填充区域。
它适用于水平和垂直方向渐变,但不是一般的。例如,似乎对于45度线性渐变,梯度方向在1到3之间的相邻像素上变化很大。
我无法理解为什么会发生这种情况以及如何解决这个问题。从理论上讲,到处都应该是1。
答案 0 :(得分:2)
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中的外观,使用包含倾斜渐变区域和垂直渐变区域的测试图像: