Как преобразовать контуры, найденные OpenCV, в плавные сплайны или кривые, подобные Безье

#python #opencv #contour #opencv-python #opencv-contour

Вопрос:

Я векторизирую цветовое растровое изображение: короче говоря, я нахожу количество цветов, извлекаю каждый цвет в виде черно-белой маски и обнаруживаю контуры, а затем сбрасываю все в файл в виде SVG. Но результат оставляет желать лучшего из-за очень четких и грубых контуров для цветных краев. Кроме того, я получаю много шума («соль и перец»), который добавляет слишком много мелких контуров к выходу.

Проблемы

Чтобы устранить «соль и перец», я попытался применить различные эффекты размытия (срединное размытие, гауссово) до обнаружения контуров, а также морфологические операторы (размывание/расширение/открытие/закрытие), все они не подходят для моего случая, потому что они размывают или даже удаляют крошечные объекты/контуры, которые должны оставаться четкими.

Наконец, у меня появилась идея преобразовать набор точек из обнаруженных контуров в сплайн или кривую Безье, но я не нашел способа сделать это с массивами, возвращаемыми cv2.findContour(…).

В качестве эксперимента я попытался нанести c = cv2.approxPolyDP(c, simplification_param, False) на контуры, но они стали более угловатыми и ломаными, а не гладкими и непрерывными.

Есть ли способ преобразовать результат cv2.approxPolyDP(…) в сплайны или использовать какую-либо другую библиотеку, чтобы получить те же результаты, что и в approxPolyDP, но с кривыми Безье?

Это примеры ч/б масок, которые я использую для определения контуров с помощью cv2.findContours(…). В конечном счете, они должны быть преобразованы в гладкие непрерывные кривые (необязательно соединенные или замкнутые контуры).

Маска

Маска

Спасибо!

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

1. approxPolyDP будет искажать кривые больше, чем должно быть приемлемо для «векторизации» изображений. это можно продемонстрировать с помощью квадрата со скругленными углами. и это не даст вам сплайнов. Насколько мне известно, в OpenCV нет сплайнов или чего-либо, что использует сплайны. вам нужно будет написать свой собственный код или использовать библиотеку для своих целей. вы не занимаетесь компьютерным зрением. OpenCV — неподходящий инструмент для этой работы.