【发布时间】:2016-04-26 15:41:22
【问题描述】:
我想实现一个环形中值滤波器 - 它的作用基本上是将中心像素替换为围绕它的圆环中像素的中值。 我可以像这样制作一些半径的圆形遮罩
kernel = np.zeros((2*radius+1, 2*radius+1))
y,x = np.ogrid[-radius:radius+1, -radius:radius+1]
mask = x**2 + y**2 <= radius**2
kernel[mask] = 1
然后我可以使用 scipy 的通用过滤器来取值的中位数
import scipy.ndimage.filters as scp_filt
circular_median = scp_filt.generic_filter(my_image, np.median, footprint=kernel)
上面的掩码包括圆圈内的像素。什么像素应该位于圆周上对我来说似乎有点模棱两可(想想内接在 3*3、5*5、7*7 内核中的圆)。有没有我可以使用 OTS 之类的“环”功能?
为什么这一切 - 尝试使用本文的一部分http://pages.swcp.com/~spsvs/resume/PODS_DSS2009_2009-01-15.pdf Ring 中值滤波器,在从原始图像中减去后留下的对象的尺度大小小于半径。
另外,不确定我是否应该在 RGB 中执行此操作。我只在灰度图像上看到过中值过滤器
【问题讨论】:
-
您可以简单地计算环的相对坐标,然后将其应用于您的图像。与在数学形态学中应用自定义结构元素相当。
-
是的,这正是我的问题——确切的相对坐标是什么。假设 0,0 是 11*11 内核的中心,那么圆的坐标是多少。这有点模棱两可,为此 Bresenham 算法(见下面我的回答)似乎不错。这里有一个老问题stackoverflow.com/questions/17454931/… 使用了 gaussian2D,但为此条件
ring = ring>eps & ring<1e-9是手动的,需要针对每个内核大小进行更改。 -
最简单的方法是在应用中值滤波器之前计算环坐标。在您的情况下,您可以从点 (0,5) 开始,然后用一小步跟踪圆形/环形(假设一次一个度数),但您必须检查新点是否已经进入列表。
标签: python opencv image-processing median background-subtraction