使用open-CV和Python生成黑白图像轮廓

2024-04-25 07:15:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用OpenCV2和Python3将图像的一部分绘制为黑白。这是我正在尝试的代码:

(x, y, w, h) = cv2.boundingRect(c)
cv2.rectangle(frame, (x,y), (x+w,y+h),0,0)
sub_face = frame[y:y+h, x:x+w]
# apply a gaussian blur on this new recangle image
# sub_face = cv2.GaussianBlur(sub_face,(9, 9), 30, borderType = 0)
sub_face = cv2.cvtColor(sub_face, cv2.COLOR_BGR2GRAY)

# merge this blurry rectangle to our final image
result_frame[y:y+sub_face.shape[0], x:x+sub_face.shape[1]] = sub_face

当我应用GaussianBlur方法时,它可以正常工作,但是当我尝试cvtColor方法时,它失败了,并显示一条消息(在最后一行):无法将输入数组从shape(268182)广播到shape(268182,3)。我做错什么了?

第一行中的c变量是一个轮廓(来自运动检测)。

我是Python和OpenCV的新手。

谢谢!


Tags: 方法代码图像image绘制thiscv2frame
2条回答

您将子面转换为单通道图像,但结果_帧是3通道图像。在

在最后一行中,您尝试将一个单通道阵列分配给一个3通道切片。在

你可以这样做:

result_frame[y:y+sub_face.shape[0], x:x+sub_face.shape[1], 0] = sub_face
result_frame[y:y+sub_face.shape[0], x:x+sub_face.shape[1], 1] = sub_face
result_frame[y:y+sub_face.shape[0], x:x+sub_face.shape[1], 2] = sub_face

由于result_frame是一个RGB/三通道图像,因此您正试图同时将cv2.cvtColor调用产生的单个通道分配给三个通道。您可能希望将单个通道分配给所有三个通道。一种干净的方法是利用NumPy broadcasting在第三维度中创建一个单例通道,然后在所有通道上广播结果。由于您使用的是OpenCV的cv2接口,因此用于操作图像的本机数据类型是NumPy数组:

# merge this blurry rectangle to our final image
result_frame[y:y+sub_face.shape[0], x:x+sub_face.shape[1]] = sub_face[:,:,None]

此上下文中的:操作访问特定维度中的所有值。在这种情况下,我们需要第一和第二维度。因此,sub_face[:,:,None]将使您的单通道图像3D,第三维度是单粒子(即1)。使用NumPy广播将同时向所有频道广播该单频道图像。在

注意,当赋值给result_frame时,我不必显式地访问第三维度。这是因为result_frame[y:y+sub_face.shape[0], x:x+sub_face.shape[1]]和{}与在隐式指定的最后一个维度之后删除索引是一样的。在

相关问题 更多 >