2015-11-30 4 views
2

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

Полигоны могут пересекаться друг с другом. И я хочу смешать перекрывающиеся части.

Я пробовал это с System::Drawing::Graphics.FillPolygon в .net, и он работал так, как я ожидал. Каждый многоугольник, добавленный к холсту, влияет только на область, которую он покрывает, и перекрывающаяся область смешивается между всеми задействованными многоугольниками, как показано на рисунке ниже.

enter image description here

Однако, я не могу получить это ожидаемое изображение в OpenCV.

Прежде всего, я не могу просто использовать cv::fillPoly() или cv::fillConvexPoly, потому что документация говорит:

функция не поддерживает альфа-прозрачность, когда целевое изображение является 4-канальным. В этом случае цвет [3] просто копируется в перекрашенные пиксели. Таким образом, если вы хотите нарисовать полупрозрачные фигуры, вы можете нарисовать их в отдельном буфере, а затем смешать с основным изображением.

тоже не могу получить желаемый результат, построение многоугольников на различных cv::Mat и смешивая их с помощью addWeighted альтернативы, как предложил here.

Весовой коэффициент я здесь взвешенное значение альфа для каждого полигона, т.е.

weight[i] = alpha[i]/sum(alpha[i]) 
canvas = sum(weight[i] * polygon[i]) 

Проблема этого метода состоит в том, что каждый полигон будет влиять на все другие полигоны на холсте, так как используется его значение альфа при вычислении weight для каждого многоугольника. Когда к холсту добавляется новый многоугольник, все пиксели на холсте изменяются, а не только область, покрываемая этим полигоном.

Любые идеи по этой проблеме?

+0

http://answers.opencv.org/question/73016 может быть полезно – sturkmen

ответ

2

Смешивание - более сложная тема, чем может показаться. Существует несколько общих стратегий смешивания. Хорошее объяснение с картинками можно найти в документах QML (в параметре «режим»): http://doc.qt.io/qt-5/qml-qtgraphicaleffects-blend.html

После того, как вы создали свою матрицу, содержащую многоугольник, вам нужно сделать смешение самостоятельно, как вы уже начали. В вашей рутине вы используете адаптивную нормализацию значений интенсивности. Это гарантирует отсутствие перенасыщения.

Если вы хотите, чтобы ваш рисунок многоугольника не влиял на общую яркость изображения, вам придется отказаться от нормализации. Вы просто используете стратегию смешивания, которая лучше всего подходит для вашего приложения и применяет только взвешивание к многоугольнику, а не исходное изображение.

E.g. canvas = canvas + 0.2*polygon[i] (простое дополнение)

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

+0

Большое вам спасибо! Не знал, что существует так много стратегий смешивания.Я думал только о том, как избежать насыщения во время смешивания. – Rikka

Смежные вопросы