按位与操作返回黑色图像

0 投票
1 回答
56 浏览
提问于 2025-04-14 17:11

假设我们有一张这样的图片:

这里输入图片描述

我想对这张图片进行一些位运算,所以我尝试了以下这个遮罩:

import cv2
import matplotlib.pyplot as plt
import numpy as np
image1 =cv2.imread("ML.png")
image1 =cv2.resize(image1,(400,400))
print(image1)
mask =np.zeros((400,400,3),dtype='uint8')
mask[0:50,0:120]=1
mask[70:180,130:320] =1
mask[150:240,190:390] =1
print(mask)
image1_changed =cv2.bitwise_and(image1,mask)
print(image1_changed)
plt.imshow(np.uint8(image1_changed))
plt.show()

其实我想保留头部的部分,把其他的都去掉,这里有所有的矩阵:

[[[255 250 245]
  [255 250 245]
  [255 250 245]
  ...
  [255 250 245]
  [255 250 245]
  [255 250 245]]

 [[255 250 245]
  [255 250 245]
  [255 250 245]
  ...
  [255 250 245]
  [255 250 245]
  [255 250 245]]

 [[255 250 245]
  [255 250 245]
  [255 250 245]
  ...
  [255 250 245]
  [255 250 245]
  [255 250 245]]

 ...

 [[255 250 245]
  [255 250 245]
  [255 250 245]
  ...
  [255 250 245]
  [255 250 245]
  [255 250 245]]

 [[255 250 245]
  [255 250 245]
  [255 250 245]
  ...
  [255 250 245]
  [255 250 245]
  [255 250 245]]

 [[255 250 245]
  [255 250 245]
  [255 250 245]
  ...
  [255 250 245]
  [255 250 245]
  [255 250 245]]]
[[[1 1 1]
  [1 1 1]
  [1 1 1]
  ...
  [0 0 0]
  [0 0 0]
  [0 0 0]]

 [[1 1 1]
  [1 1 1]
  [1 1 1]
  ...
  [0 0 0]
  [0 0 0]
  [0 0 0]]

 [[1 1 1]
  [1 1 1]
  [1 1 1]
  ...
  [0 0 0]
  [0 0 0]
  [0 0 0]]

 ...

 [[0 0 0]
  [0 0 0]
  [0 0 0]
  ...
  [0 0 0]
  [0 0 0]
  [0 0 0]]

 [[0 0 0]
  [0 0 0]
  [0 0 0]
  ...
  [0 0 0]
  [0 0 0]
  [0 0 0]]

 [[0 0 0]
  [0 0 0]
  [0 0 0]
  ...
  [0 0 0]
  [0 0 0]
  [0 0 0]]]
[[[1 0 1]
  [1 0 1]
  [1 0 1]
  ...
  [0 0 0]
  [0 0 0]
  [0 0 0]]

 [[1 0 1]
  [1 0 1]
  [1 0 1]
  ...
  [0 0 0]
  [0 0 0]
  [0 0 0]]

 [[1 0 1]
  [1 0 1]
  [1 0 1]
  ...
  [0 0 0]
  [0 0 0]
  [0 0 0]]

 ...

 [[0 0 0]
  [0 0 0]
  [0 0 0]
  ...
  [0 0 0]
  [0 0 0]
  [0 0 0]]

 [[0 0 0]
  [0 0 0]
  [0 0 0]
  ...
  [0 0 0]
  [0 0 0]
  [0 0 0]]

 [[0 0 0]
  [0 0 0]
  [0 0 0]
  ...
  [0 0 0]
  [0 0 0]
  [0 0 0]]]

那么怎么才能定义好这样的矩阵呢?之前的代码返回的是一张黑色的图片,请帮帮我。

1 个回答

1

根据我的理解,你需要保留头部(脑袋)部分,把其他的去掉。你可以通过从原始图片中选择一些点来创建一个遮罩,把这些点的值设为255。注意,你把这个值设为1,这样的话就不太明显,因为它接近黑色(接近0)。下面的代码有注释来解释,希望这能帮到你。

import cv2
import numpy as np

#Read image
image = cv2.imread('ML.png')
#Create mask as same as image size.
mask =np.zeros((image.shape[0],image.shape[1],1),dtype='uint8')

#Mask rectangle is selected as points from original image.
mask[30:240,57:168]=255

#Resize image and mask
image1 =cv2.resize(image,(400,400))
mask1 = cv2.resize(mask,(400,400))

#Do bitwise and
image1_changed =cv2.bitwise_and(image1,image1, mask=mask1)

#Save mask and masked image result.
cv2.imwrite("mask.png",mask1)
cv2.imwrite("changed.png",image1_changed)

输出文件为 'changed.png'。

这里是图片描述

撰写回答