Реализация адаптивного расширения оттенков серого - PullRequest
0 голосов
/ 08 марта 2020

Учитывая двумерный массив со значениями в диапазоне от 0 до n, я хотел бы расширить каждый пиксель на значение, которое он содержит, более высокие значения должны перезаписывать более низкие значения во время расширения.

То есть любой пиксель в радиусе, эквивалентный значению пикселя, наследует это значение, если их значение меньше. Например, если ввод [0 1 0 2 0 0], вывод будет [1 2 2 2 2 2 ].

Как это можно реализовать?

1 Ответ

0 голосов
/ 08 марта 2020

Ваше словесное описание в точности соответствует тому, как вы реализуете алгоритм: для каждого пикселя (назовем его значение 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 и, следовательно (надеюсь) ускоряете код.

...