OpenCV:如何混合多个不同颜色的半透明多边形?
OpenCV: How to blend multiple semi-transparent polygons with different colors?
我有多个半透明多边形,每个多边形都有一个 RGBA 填充颜色。我想使用 OpenCV 将它们全部绘制在图像上。
多边形可能相互重叠。我想混合重叠的部分。
我已经在 .net
中用 System::Drawing::Graphics.FillPolygon
试过了,它按我的预期工作。添加到 canvas 的每个多边形仅影响它覆盖的区域,重叠区域混合在所有涉及的多边形之间,如下图所示。
但是,我无法在 OpenCV 中获得预期的图像。
首先,我不能简单地使用 cv::fillPoly()
或 cv::fillConvexPoly
因为文档说:
The functions do not support alpha-transparency when the target image is 4-channel. In this case, the color[3] is simply copied to the repainted pixels. Thus, if you want to paint semi-transparent shapes, you can paint them in a separate buffer and then blend it with the main image.
通过在不同 cv::Mat
上绘制多边形并按照建议 here 使用 addWeighted
替代方案混合它们,我也无法获得所需的结果。
我这里使用的加权因子是每个多边形的加权alpha值,即
weight[i] = alpha[i] / sum(alpha[i])
canvas = sum(weight[i] * polygon[i])
此方法的问题是每个多边形都会影响 canvas 上的所有其他多边形,因为它的 alpha 值用于计算每个多边形的 weight
。当一个新的多边形添加到 canvas 时,canvas 上的所有像素都会改变,而不仅仅是这个多边形覆盖的区域。
关于这个问题有什么想法吗?
混合是一个比看起来更复杂的话题。有几种常见的混合策略。可以在 QML 文档中找到一个很好的图片解释(在 "mode" 参数下):http://doc.qt.io/qt-5/qml-qtgraphicaleffects-blend.html
创建包含多边形的矩阵后,您必须自己进行混合,因为您已经开始了。在您的例程中,您正在使用强度值的自适应归一化。这样可以保证不会过饱和。
如果您希望多边形绘制不影响图像的整体亮度,则必须放弃归一化。您只需使用最适合您的应用程序的混合策略,并且只将权重应用于多边形,而不是源图像。
例如canvas = canvas + 0.2*polygon[i]
(简单加法)
根据您要采用的策略,您可能需要在混合之前在黑色或白色背景上渲染多边形。
我有多个半透明多边形,每个多边形都有一个 RGBA 填充颜色。我想使用 OpenCV 将它们全部绘制在图像上。
多边形可能相互重叠。我想混合重叠的部分。
我已经在 .net
中用 System::Drawing::Graphics.FillPolygon
试过了,它按我的预期工作。添加到 canvas 的每个多边形仅影响它覆盖的区域,重叠区域混合在所有涉及的多边形之间,如下图所示。
但是,我无法在 OpenCV 中获得预期的图像。
首先,我不能简单地使用 cv::fillPoly()
或 cv::fillConvexPoly
因为文档说:
The functions do not support alpha-transparency when the target image is 4-channel. In this case, the color[3] is simply copied to the repainted pixels. Thus, if you want to paint semi-transparent shapes, you can paint them in a separate buffer and then blend it with the main image.
通过在不同 cv::Mat
上绘制多边形并按照建议 here 使用 addWeighted
替代方案混合它们,我也无法获得所需的结果。
我这里使用的加权因子是每个多边形的加权alpha值,即
weight[i] = alpha[i] / sum(alpha[i])
canvas = sum(weight[i] * polygon[i])
此方法的问题是每个多边形都会影响 canvas 上的所有其他多边形,因为它的 alpha 值用于计算每个多边形的 weight
。当一个新的多边形添加到 canvas 时,canvas 上的所有像素都会改变,而不仅仅是这个多边形覆盖的区域。
关于这个问题有什么想法吗?
混合是一个比看起来更复杂的话题。有几种常见的混合策略。可以在 QML 文档中找到一个很好的图片解释(在 "mode" 参数下):http://doc.qt.io/qt-5/qml-qtgraphicaleffects-blend.html
创建包含多边形的矩阵后,您必须自己进行混合,因为您已经开始了。在您的例程中,您正在使用强度值的自适应归一化。这样可以保证不会过饱和。
如果您希望多边形绘制不影响图像的整体亮度,则必须放弃归一化。您只需使用最适合您的应用程序的混合策略,并且只将权重应用于多边形,而不是源图像。
例如canvas = canvas + 0.2*polygon[i]
(简单加法)
根据您要采用的策略,您可能需要在混合之前在黑色或白色背景上渲染多边形。