【问题标题】:Transparent pixels in OpenCV C++ (when using GrabCut)OpenCV C++ 中的透明像素(使用 GrabCut 时)
【发布时间】:2014-08-31 12:09:06
【问题描述】:

我正在使用 OpenCV 的 GrabCut 实现来从图像中删除背景。但是现在新的背景是黑色的。有什么办法让它透明吗? 目前这部分代码如下所示:

Mat binMask( image.size(), CV_8UC1 );
binMask = mask & 1;
image.copyTo( result, binMask );

我能以某种方式用透明像素填充 binMask 吗? 我已经阅读了一些叠加图像的教程,但我不需要在我的图片前面而是后面的透明图像。 我希望有人能帮忙。 非常感谢!

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    由于您使用的是 8UC1 图像类型,因此不可能有透明像素。 仅当您有 alpha 通道且 alpha 设置为 0 时才允许使用这些:您必须使用 4 通道图像(3 用于颜色,1 用于 alpha 通道)。 Alpha 通道在 PNG 等文件格式中受支持,但在 JPG 中不支持。

    在蒙版的情况下,您不需要使用透明像素,因为黑色像素实际上对应于 0,并且当您混合两个图像时它们不会影响结果(例如 addWeighted,或者在 bitwise_or 操作的情况下)。

    【讨论】:

    • 我不能将所有黑色像素都视为背景的一部分,因为其中一些可能是前景的一部分。
    • 如果您使用轮廓提取方法,您只需将提取的部分定义为 ROI 并用白色像素填充轮廓。在这种情况下,您将拥有完整的前景。参考这个答案stackoverflow.com/a/16877055/2369389
    • 我使用 GrabCut 来寻找背景。没有办法重用结果吗?还是我必须进行更多计算才能找到轮廓?
    • 如果您提取了完整的前景,(例如,具有绝对差异),您仍然需要定义轮廓并填充该区域
    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2016-07-13
    • 2013-04-18
    • 1970-01-01
    • 2023-03-14
    • 2012-04-30
    • 1970-01-01
    相关资源
    最近更新 更多