#cpp #алгоритм #opencv
Для произвольной фигуры, представляющей из себя просто вектор с точками, имеется возможность производить смещение. Уменьшать, либо увеличивать без строгого соответствия начальной форме. Для демонстрации привожу небольшой пример: Исходное состояние - серый цвет, результат - зелёный. Впрочем, можно и наоборот, суть роли не играет. На всякий случай хочу отметить, что это не масштабирование (scale), т.к. при использовании последнего зелёный полигон (точнее сказать, в примере их два, большой и маленький) был бы просто уменьшен с точным сохранением формы. Но нужно именно то, что показано на картинке. Причём для растровой маски. Да, при помощи методов, имеющихся в OpenCV (да и даже если просто свой цикл реализовать), можно получить векторы пограничных пикселей маски, а затем использовать для смещения, но хотелось бы избежать лишней конвертации. То есть выполнить смещение сразу на растре. Навскидку приходят в голову операции дилатации и эрозии, но у них имеется недостаток, заключающийся в том, что если брать большое ядро для выполнения морфологической операции, то получим усиленную "квадратизацию" модифицированного полигона. Иными словами ровненькие линии, такие как в примере не получатся. Если же брать маленький размер ядра, но взять больше итераций, то это работает достаточно медленно, причём чем больше дельта (разница между исходником и результатом), тем больше потребуется итераций и тем дольше будет выполняться алгоритм. Часто такая скорость совершенно неприемлема. Каким ещё способом, кроме обозначенных морфологических операций возможно решить данную задачу?
Ответы
Ответ 1
Думаю, вас может заинтересовать статья CPU vs GPU. Distance field на Хабрахабре. Там с помощью ядра получают Чем больше ядро, тем меньше угловатость и тем меньше скорость. Реализации на CPU и GPU прилагаются: Distance Field Samples.
Комментариев нет:
Отправить комментарий