用掩膜图像移除背景的OpenCV

7
给定两个输入,一是原始图像,二是掩膜图像,最佳方式是什么来从原始图像中去除背景。最终输出只包含狗的图像,没有背景并具有透明度。我已经看到掩膜图像也可以用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 感谢您的及时回复。我尝试了您的建议,但背景仍然不透明。 - DesperateLearner
3个回答

7

您可以通过创建一个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的快速更新。遇到了这个错误 - transparent[:, :, 3] = mask ValueError: could not broadcast input array from shape (170,273,3) into shape (170,273) - DesperateLearner
1
请确保您的掩膜是单通道图像。您可以使用:mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY) - Baraa

4

这里提供Python OpenCV的另一种方法。将图像转换为BGRA格式,然后插入Alpha通道。

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

1
给您的输入图像添加 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)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接