在使用不同形状的np的情况下如何使用np

时间:2020-02-17 06:55:19

标签: python numpy image-segmentation

我想更有效地使用代码。

现在我要通过引用图像形式的值来转换图像的颜色

众所周知,这与图像分割有关。

我通过深度学习模型获得了图像[Width] * [Height]的类值。

我想用原始颜色绘制分割的区域,而另一个用灰色绘制

以下是我的结果。人的部分是分割的区域

enter image description here

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])

如何更清楚地编写代码?

0 个答案:

没有答案