【问题标题】:OpenCV removing the background with a mask imageOpenCV 使用蒙版图像去除背景
【发布时间】:2020-04-13 02:41:15
【问题描述】:

给定两个输入 i。原始图像& ii。蒙版图像,从原始图像中删除到背景的最佳方法是什么。

原图

蒙版图片

最终输出将只包含没有背景的狗,并且看起来是透明的。我已经看到掩码图像也是用 OpenCV 创建的。有没有办法只使用现有的蒙版图像并生成输出图像?

更新 我试过这个

import cv2

# opencv loads the image in BGR, convert it to RGB
img = cv2.imread("originalImage.png")
mask = cv2.imread("maskImage.png")
final = cv2.bitwise_and(img, mask)
cv2.imwrite("final.png", final)

最终形象

有没有办法将背景设置为透明?

【问题讨论】:

  • @Baraa 感谢您的即时回复。我试过你的建议,背景不透明。

标签: python objective-c opencv


【解决方案1】:

您可以通过创建 4 通道 BGRA 图像并从原始图像复制前 3 个通道并使用蒙版图像设置 Alpha 通道来创建透明图像。

transparent = np.zeros((img.shape[0], img.shape[1], 4), dtype=np.uint8)
transparent[:,:,0:3] = img
transparent[:, :, 3] = mask

【讨论】:

  • 感谢@Baraa Ran 快速更新此错误 - transparent[:, :, 3] = mask ValueError: could not broadcast input array from shape (170,273,3) into shape (170,273)
  • 请确保您的蒙版是单通道图像。您可以使用:mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
【解决方案2】:

这是 Python OpenCV 中的另一种方式。将图像转换为 BGRA,然后插入 alpha 通道。

result = img.copy()
result = cv2.cvtColor(result, cv2.COLOR_BGR2BGRA)
result[:, :, 3] = mask

【讨论】:

    【解决方案3】:

    为您的输入图像添加 alpha 通道并将蒙版复制到其中。

    Mat img;
    cvtColor(imread("img.jpg", CV_LOAD_IMAGE_COLOR), img , cv::COLOR_RGB2RGBA);
    Mat mask = imread("mask.jpg", CV_LOAD_IMAGE_GRAYSCALE);
    for(int r = 0; r < img.rows; r++){
        for(int c = 0; c < img.cols; c++){
            uchar alpha = 0;
            if(r < mask.rows && c < mask.cols)
                alpha = mask.at<uchar>(r, c);
            img.at<Vec4b>(r, c)[3] = alpha;
        }
    }
    imwrite("result.png", img);
    

    顺便说一句,您的图像与蒙版的分辨率不同,但结果看起来还不错。

    (我知道它不是 Python,但有 c++ 标签所以...:D)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      相关资源
      最近更新 更多