Страницы

Поиск по вопросам

суббота, 27 октября 2018 г.

Offset (смещение) для растра

Для произвольной фигуры, представляющей из себя просто вектор с точками, имеется возможность производить смещение. Уменьшать, либо увеличивать без строгого соответствия начальной форме.
Для демонстрации привожу небольшой пример:

Исходное состояние - серый цвет, результат - зелёный. Впрочем, можно и наоборот, суть роли не играет.
На всякий случай хочу отметить, что это не масштабирование (scale), т.к. при использовании последнего зелёный полигон (точнее сказать, в примере их два, большой и маленький) был бы просто уменьшен с точным сохранением формы. Но нужно именно то, что показано на картинке. Причём для растровой маски.
Да, при помощи методов, имеющихся в OpenCV (да и даже если просто свой цикл реализовать), можно получить векторы пограничных пикселей маски, а затем использовать для смещения, но хотелось бы избежать лишней конвертации. То есть выполнить смещение сразу на растре.
Навскидку приходят в голову операции дилатации и эрозии, но у них имеется недостаток, заключающийся в том, что если брать большое ядро для выполнения морфологической операции, то получим усиленную "квадратизацию" модифицированного полигона. Иными словами ровненькие линии, такие как в примере не получатся. Если же брать маленький размер ядра, но взять больше итераций, то это работает достаточно медленно, причём чем больше дельта (разница между исходником и результатом), тем больше потребуется итераций и тем дольше будет выполняться алгоритм. Часто такая скорость совершенно неприемлема.
Каким ещё способом, кроме обозначенных морфологических операций возможно решить данную задачу?


Ответ

Думаю, вас может заинтересовать статья CPU vs GPU. Distance field на Хабрахабре.
Там с помощью ядра

получают

Чем больше ядро, тем меньше угловатость и тем меньше скорость. Реализации на CPU и GPU прилагаются: Distance Field Samples

Комментариев нет:

Отправить комментарий