首页 > 解决方案 > 在opencv中用掩码替换部分图像

问题描述

我有一个 384x384 像素的图像。我想屏蔽或替换图像中间的所有内容,所以我只有图像的边框。为此,我创建了一个 352x352 像素的蒙版(只是一个黑色图像)。现在我想把这个蒙版放在图像的中间,这样它到每个角落的距离都是 32 像素。

我想到了这样的事情,但它不起作用:

mask = cv2.imread('C://Users//but//Desktop//mask.png')
hh, ww, dd = mask.shape

image = cv2.imread('C://Users//but//Desktop//Train//OK//train_image1.jpg')

x = 32
y = 352
print('left:', x, 'top:', y)

# put mask into black background image
mask2 = np.full_like(image, 255)
mask2[x:x + hh, y:y + ww] = mask

# apply mask to image
img_masked = cv2.bitwise_and(image, mask2)

cv2.imshow('masked image', img_masked)
cv2.waitKey(0)
cv2.destroyAllWindows()

我得到的错误是:

Traceback (most recent call last):
File "C:/Users/but/PycharmProjects/SyntheticDataWriter.py", line 17, in <module>
mask2[x:x + hh, y:y + ww] = mask
ValueError: could not broadcast input array from shape (352,352,3) into shape (352,32,3)

标签: pythonopencv

解决方案


您可以使图像的中间变成黑色,而无需创建黑色图像并将其覆盖或叠加,只需使用 Numpy 切片:

import cv2

# Load image and get its dimensions
im = cv2.imread('paddington.png', cv2.IMREAD_COLOR)
h,w = im.shape[0:2]

# Make middle black
im[32:h-32, 32:w-32, :] = 0

cv2.imwrite('result.png', im)

在此处输入图像描述

这是他过去的缩略图,以防有人不知道:

在此处输入图像描述


推荐阅读