【问题标题】:OpenCV: how to convert all pixels outside of mask to transparent?OpenCV:如何将遮罩外的所有像素转换为透明?
【发布时间】:2021-04-11 02:13:45
【问题描述】:

我有一个名为 maskMat 的 4 通道遮罩,颜色为红色(但如果需要,我可以选择任何其他颜色)。

我有一个名为 imageMat 的 4 通道图像。

我想将 maskMat 之外的所有 mat 像素设置为透明色(以便只保留位于 maskMat 区域中的 imageMat 部分)。

如何使用 OpenCV 做到这一点? (我使用 openCV Java,但任何语言的答案都可以)

谢谢。

【问题讨论】:

  • 请提供显示输入和输出的代表性图像,或者提供几行代码来生成代表性图像,否则回答者会浪费时间猜测您的意思。谢谢。
  • 1.将图像转换为 4 通道 witg cvtColor(BGR2BGRA); 2.对于每个像素:如果未设置掩码(像素):将像素值设置为(b,g,r,0)
  • @Micka 我不推荐循环和单独触摸像素。这可以通过掩码操作轻松完成。此外,问题已经表明矩阵是 4 通道的,因此您对 cvtColor 的建议毫无意义。
  • @Christoph Rackwitz:我懒得再读一遍这个问题了。 Convertin to BGRA 可以很容易地跳过,但对于其他搜索类似问题的人来说是一个提示。循环版本很容易理解。除了透明度之外,使用 .setTo 的解决方案还会更改像素值。使用按位运算的解决方案需要将掩码转换为 4 通道,从而使操作效率降低且更复杂。在 C++ 中,循环并不是那么低效。你为什么不写一个答案?
  • @Regis_AG 我可以在 python 中给你一个答案,但大多数操作都会使用 numpy。您将不得不在 cv::Mat 上使用 OpenCV 的文档...无论如何请查阅文档。

标签: opencv opencv3.0 opencv-python opencv4android opencv-contour


【解决方案1】:

我终于找到了使用 bitwise_and 的解决方案。这是我的代码:

Mat maskMat = .... // A RGBA Mat with mask in white color
Mat imageMat = .... // A RGBA Mat
Mat removedBlackMat = new Mat();
Core.bitwise_and(imageMat, maskMat, removedBlackMat);

感谢您的帮助,对我的不准确问题深表歉意!

希望这会对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    相关资源
    最近更新 更多