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, каковы координаты круга. Это немного неоднозначно, и для этого Брешенхамский алго (см. Мой ответ ниже) кажется хорошим. Здесь есть старый вопрос: http://stackoverflow.com/questions/17454931/how-can-i-apply-a-ring-shaped-median-filter-to-an-image-in-matlab, который использует gaussian2D, но для этого условие «кольцо = кольцо» eps & ring <1e-9' является ручным, и его необходимо изменить для каждого размера ядра. – madratman

+0

Самый простой способ - до применения медианного фильтра, чтобы вычислить координаты кольца. В вашем случае вы можете начать с точки (0,5), затем проследить круг/форму кольца с помощью небольшого шага (скажем, градуса за раз), но вы должны проверить, что новая точка еще не находится в список. – FiReTiTi

ответ

-1

Используйте алгоритм Bresenham для окружностей https://www.daniweb.com/programming/software-development/threads/321181/python-bresenham-circle-arc-algorithm

SciPy общего фильтр вместе с этим кольцом срединного ядром является довольно медленным, на практике, по крайней мере, в питоне

+0

Форма провода - это цепочка, а не часть многоточия. – FiReTiTi

+0

Умм, вы имеете в виду здесь цепную кривую? Идея вычитания кольцевого срединного фильтра заключалась в том, чтобы сохранить элементы меньше шкалы радиуса (согласно связанной бумаге). Или вы имеете в виду в ядре, форма кольца неправильная. – madratman

+0

Форма кольца не будет соответствовать контактной кривой, поэтому обнаружение будет плохой. Существует патент от Thales Helicopter (бывший Eurocopter), который специально использует форму цепи, чтобы соответствовать контактной кривой. (PS: Я не тот, кто проголосовал ...) – FiReTiTi