Ваше словесное описание в точности соответствует тому, как вы реализуете алгоритм: для каждого пикселя (назовем его значение r
), изучите его окрестность с размером окрестности, заданным r
. В этой окрестности установите для всех пикселей значение r
, если их значение было ниже. Вам необходимо записать в независимое выходное изображение, вы не можете изменить вход без нарушения логики c.
Это, конечно, реализовано с помощью набора вложенных циклов: сначала l oop по каждому пикселю на изображении, и внутри этого l oop, l oop на каждый пиксель в окрестности.
Python медленно с петлями, поэтому это не будет эффективным, если записано в Python. Вы можете попробовать использовать numba , чтобы ускорить его. Если это достаточно важно, напишите его на родном языке, таком как C или C ++.
Возможно, что если n
мало, эта операция может быть немного ускорена по сравнению с очевидной реализации, используя пороговое разложение.
Идея состоит в том, что вы l oop над значениями серого r
в изображении. На каждой итерации расширяйте двоичное изображение img==r
(что верно для пикселей со значением r
, false в другом месте) с SE размером r
. Затем составьте окончательное выходное изображение, беря поэлементный максимум по расширенным изображениям. Обратите внимание, что вы можете накапливать этот конечный результат поэтапно в пределах l oop, взяв максимум предыдущего результата и нового расширения.
Эта реализация делает больше работы, но поскольку вы используете операции с целым изображением, Вы минимизируете количество циклов Python и, следовательно (надеюсь) ускоряете код.