我想更有效地使用代码。
现在我要通过引用图像形式的值来转换图像的颜色
众所周知,这与图像分割有关。
我通过深度学习模型获得了图像[Width] * [Height]的类值。
我想用原始颜色绘制分割的区域,而另一个用灰色绘制
以下是我的结果。人的部分是分割的区域
def read_video_frame(video_path):
cap = cv2.VideoCapture(video_path)
while(cap.isOpened()):
ret, frame = cap.read()
frame = cv2.resize(frame, dsize=(448, 448), interpolation=cv2.INTER_AREA)
image = np.array(frame)
mask = model_run(image) # Deep learning model
gray = skimage.color.gray2rgb(skimage.color.rgb2gray(image)) * 255
if mask is None:
segmented_image = gray.astype(np.uint8)
else:
segmented_image[:, :, 0] = np.where(mask >= 1, image[:, :, 0], gray[:, :, 0])
segmented_image[:, :, 1] = np.where(mask >= 1, image[:, :, 1], gray[:, :, 1])
segmented_image[:, :, 2] = np.where(mask >= 1, image[:, :, 2], gray[:, :, 2])
cv2.imshow('video', segmented_image)
if cv2.waitKey(1) & 0xff == ord('q'):
break
cap.release()
您会在图像中发现不舒服的代码部分。
例如,我通过深度学习模型获得了(5 * 5)的类值
NumPy数组的形式如下。
ex = np.array([[0,0,1,0,0],
[0,1,1,1,1],
[0,0,1,1,1],
[0,0,0,2,2],
[0,0,1,2,2]
])
如果数组的值大于1,则将使用原始图像值;如果数组的值为0,将使用灰度的图像值。
因此,我想使用np.where()一次处理所有问题。
segmented_image[:, :] = np.where(mask >= 1, image[:, :], gray[:, :])
但是我得到了这个错误
ValueError:操作数不能与形状(448,448)(448,448,3)(448,448,3)一起广播
(我的目标图像尺寸是448x448)
因为您知道,图像像素的NumPy形状为(宽度,高度,3)。
所以我被迫将r,g,b分成三个部分,并形成一个图像。
segmented_image[:, :, 0] = np.where(mask >= 1, image[:, :, 0], gray[:, :, 0])
segmented_image[:, :, 1] = np.where(mask >= 1, image[:, :, 1], gray[:, :, 1])
segmented_image[:, :, 2] = np.where(mask >= 1, image[:, :, 2], gray[:, :, 2])
如何更清楚地编写代码?