【发布时间】:2022-02-14 18:08:06
【问题描述】:
我在使用蒙版仅保留图像的少数部分时遇到问题。 我做什么:
1 -> 选择我要保留的颜色(OK)
2 -> 我将所有内容都转换为 Lab 空间以计算 deltaE(OK)
3 -> 使用 deltaE 值创建掩码(OK)
4 -> 蒙版的形态开口(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,掩码为 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
欢迎任何帮助。感谢任何需要一些时间来回答的人:)
编辑:第二个形状随着蒙版的变化而变化(如果我连续两次选择相同的颜色,第二个形状保持不变)
编辑 2 :第二个形状中的第一个值对应于掩码中 1 的数量(在本例中,此掩码保留了 21045 个像素)
编辑 3:当我这样做时,它可以完美运行,但速度太慢:
for i in range(h):
for j in range(w):
if mask[i,j]:
im_finale[i,j,:] = im[i,j,:]
【问题讨论】: