使用 opencv 和 numpy 数组的 RGB 图像掩码(形状不匹配)

RGB image masking using opencv and numpy arrays (shape mismatch)

我在使用蒙版仅保留图像的少数部分时遇到问题。 我的工作:

1 -> Select 我要保留的颜色(确定)

2 -> 我将所有内容转换为 Lab space 以计算 deltaE(确定)

3 -> 使用 deltaE 值创建掩码(确定)

4 -> mask 的形态学开口(OK)

5 -> 将此蒙版应用于原始图像(不正确

当我尝试将蒙版应用于图像时,出现此错误:

"shape mismatch: value array of shape (720,1280,3) could not be broadcast to indexing result of shape (21045,3)"

形状 (720,1280,3) 是我原始图像的形状,但是对于第二个形状,每次我开始编写代码时都会得到不同的结果。

所有数据(原始图像和最终图像)均为 720x1280x3,mask 为 720x1280。另外,所有数据都是 uint8.

这是我的代码:

couleur_mire = im_Lab[mouseY,mouseX,:]
image_unie = np.ones_like(im) * couleur_mire
video.set(cv2.CAP_PROP_POS_FRAMES,frame_k)
_, im = video.read()
im_Lab = cv2.cvtColor(im, cv2.COLOR_BGR2Lab)
mask = np.zeros((h,w))
im_finale = np.zeros_like(im)
L1 = np.array(im_Lab[:,:,0],dtype=int)
a1 = np.array(im_Lab[:,:,1],dtype=int)
b1 = np.array(im_Lab[:,:,2],dtype=int)
L2 = np.array(image_unie[:,:,0],dtype=int)
a2 = np.array(image_unie[:,:,1],dtype=int)
b2 = np.array(image_unie[:,:,2],dtype=int)
deltaE =np.sqrt(np.multiply(L1-L2,L1-L2) + np.multiply(a1-a2,a1-a2) + np.multiply(b1-b2,b1-b2))
th = 25
mask[deltaE<th] = 1
mask = cv2.morphologyEx(mask,cv2.MORPH_OPEN,np.ones((20,20)))
mask = np.array(mask,dtype=np.uint8)
im_finale = np.zeros_like(im)
im_finale[mask==1] = im <--THIS IS THE LINE THAT DOES NOT WORK

欢迎任何帮助。感谢任何愿意花时间回答的人:)

Edit : 每当蒙版改变时第二个形状也会改变(如果我连续两次 select 相同的颜色,第二个形状保持不变)

编辑2:第二个形状的第一个值对应mask中1的个数(在这种情况下,21045个像素与这个mask一起保留)

编辑 3:当我这样做时,它工作得很好,但它太慢了:

for i in range(h):
   for j in range(w):
      if mask[i,j]:
         im_finale[i,j,:] = im[i,j,:]

根据我的理解,您需要根据您创建的蒙版对图像进行蒙版,您可以使用乘法来实现此效果。

def mask_image( img, mask ):
   newImg = img.copy()
   newImg[:,:] = img[:,:] * mask[:,:]
   return newImg

有了这个,您不必将掩码转换为 uint8。