OpenCV:如何混合多个不同颜色的半透明多边形?
Posted
技术标签:
【中文标题】OpenCV:如何混合多个不同颜色的半透明多边形?【英文标题】:OpenCV: How to blend multiple semi-transparent polygons with different colors? 【发布时间】:2015-11-30 10:22:33 【问题描述】:我有多个半透明多边形,每个都有一个 RGBA 填充颜色。我想使用 OpenCV 将它们全部绘制在图像上。
多边形可能会相互重叠。我想混合重叠的部分。
我已经在.net
中使用System::Drawing::Graphics.FillPolygon
尝试过此操作,并且效果符合我的预期。添加到画布的每个多边形仅影响它所覆盖的区域,重叠区域在所有涉及的多边形之间混合,如下图所示。
但是,我无法在 OpenCV 中获得这个预期的图像。
首先,我不能简单地使用cv::fillPoly()
或cv::fillConvexPoly
,因为文档说:
当目标图像为 4 通道时,这些函数不支持 alpha 透明度。在这种情况下,颜色[3] 被简单地复制到重新绘制的像素。因此,如果要绘制半透明形状,可以在单独的缓冲区中绘制它们,然后将其与主图像混合。
我也无法通过在不同的cv::Mat
上绘制多边形并按照建议的here 使用addWeighted
替代方案混合它们来获得所需的结果。
我这里使用的加权因子是每个多边形的加权 alpha 值,即
weight[i] = alpha[i] / sum(alpha[i])
canvas = sum(weight[i] * polygon[i])
这种方法的问题是每个多边形都会影响画布上的所有其他多边形,因为它的 alpha 值用于计算每个多边形的weight
。当一个新的多边形被添加到画布上时,画布上的所有像素都会改变,而不仅仅是这个多边形覆盖的区域。
对这个问题有什么想法吗?
【问题讨论】:
answers.opencv.org/question/73016 可能会有所帮助 【参考方案1】:混合是一个比看起来更复杂的话题。有几种常见的混合策略。可以在 QML 文档(在“mode”参数下)找到一个很好的图片解释:http://doc.qt.io/qt-5/qml-qtgraphicaleffects-blend.html
创建包含多边形的矩阵后,您必须自己进行混合,因为您已经开始了。在您的例程中,您正在使用强度值的自适应归一化。这样可以保证不会出现过饱和。
如果您希望多边形绘制不影响图像的整体亮度,则必须放弃标准化。您只需使用最适合您的应用程序的混合策略,并且只对多边形应用权重,而不是源图像。
例如canvas = canvas + 0.2*polygon[i]
(简单加法)
根据您要采用的策略,您可能需要在混合之前在黑色或白色背景上渲染多边形。
【讨论】:
非常感谢!不知道有这么多的混合策略。我只是在考虑如何在混合过程中避免饱和。以上是关于OpenCV:如何混合多个不同颜色的半透明多边形?的主要内容,如果未能解决你的问题,请参考以下文章