1

我想实现一个环中值滤波器 - 它所做的基本上是将中心像素替换为其周围圆环中像素的中值。 我可以使一些半径的圆形掩模这样python中的环中值滤波器

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环中值过滤器,从原始图像中减去后留下比例尺小于半径的物体。

此外,不知道如果我应该在RGB或不这样做。我只看到灰度图像

中值滤波器
+0

你可以简单地计算环的相对坐标,然后将其应用于您的图像。在数学形态学中应用自定义结构元素是可比的。 – FiReTiTi

+0

是的,那正是我的问题 - 确切的相对坐标是什么。如果0,0是11 * 11内核的中心,那么圆的坐标是多少?它有点模棱两可,因此Bresenham算法(见下面的答案)似乎很好。这里有一个老问题http://stackoverflow.com/questions/17454931/how-can-i-apply-a-ring-shaped-median-filter-to-an-image-in-matlab它使用gaussian2D,但因为条件'ring = ring> eps&ring <1e-9'是手动的,并且需要为每个内核大小更改。 – madratman

+0

最简单的方法是在应用中值滤波器之前计算环坐标。在你的情况下,你可以从点(0,5)开始,然后用一小步(假设一次一个度数)跟踪圆/环的形状,但是你必须检查新点是否已经进入列表。 – FiReTiTi

回答

-1

使用布氏算法圈https://www.daniweb.com/programming/software-development/threads/321181/python-bresenham-circle-arc-algorithm

SciPy的这一环中位内核一起一般的过滤器在实践中是相当缓慢的,至少在Python

+0

线形是一个链,而不是省略号的一部分。 – FiReTiTi

+0

恩,你是指这里的悬链曲线吗?减去环中值过滤器的想法是保持元素小于半径的尺度(根据链接的纸张)。或者你的意思是在内核中,环的形状不正确 – madratman

+0

环形与悬链曲线不匹配,所以检测效果会很差。泰勒斯直升机(前欧洲直升机公司)拥有专利,专门使用链条形状以匹配悬链曲线。 (PS:我不是那个投了票的人......) – FiReTiTi