Страницы

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

понедельник, 16 декабря 2019 г.

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

#cpp #алгоритм #opencv


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

Для демонстрации привожу небольшой пример:



Исходное состояние - серый цвет, результат - зелёный. Впрочем, можно и наоборот,
суть роли не играет.

На всякий случай хочу отметить, что это не масштабирование (scale), т.к. при использовании
последнего зелёный полигон (точнее сказать, в примере их два, большой и маленький)
был бы просто уменьшен с точным сохранением формы. Но нужно именно то, что показано
на картинке. Причём для растровой маски.

Да, при помощи методов, имеющихся в OpenCV (да и даже если просто свой цикл реализовать),
можно получить векторы пограничных пикселей маски, а затем использовать для смещения,
но хотелось бы избежать лишней конвертации. То есть выполнить смещение сразу на растре.

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

Каким ещё способом, кроме обозначенных морфологических операций возможно решить данную
задачу?
    


Ответы

Ответ 1



Думаю, вас может заинтересовать статья CPU vs GPU. Distance field на Хабрахабре. Там с помощью ядра получают Чем больше ядро, тем меньше угловатость и тем меньше скорость. Реализации на CPU и GPU прилагаются: Distance Field Samples.

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

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