单通道图像的PIL fromarray

-1 投票
1 回答
48 浏览
提问于 2025-04-14 15:41

我想把一个形状是 (1080, 1920, 3) 的图片变成形状是 (1080, 1920, 1) 的图片。可是我尝试了很多方法都没有成功:

    for fr in fr_lst:
            frame = cv2.imread(os.path.join(frame_root, fr))

            #SPLIT CHANNELS
            frame = (cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
            r, g, b = cv2.split(frame)
            r = np.expand_dims(r, axis=2)
            print(r.shape)
            frame = Image.fromarray(r)

当我打印变量 r 的形状时,得到的是 (1080, 1920, 1),但是用 Image.fromarray(r) 时却报错了。

TypeError: Cannot handle this data type: (1, 1, 1), |u1

我还尝试过不扩展维度,直接用形状是 (1080, 1920) 的 r,这样用 Image.fromarray(r) 就成功了。

我也试着扩展 PIL 图片的维度,使用 frame = np.expand_dims(frame, axis=(2)),这看起来返回了正确的结果,但却出现了一些奇怪的情况:

如果我用一个大小是 (1080, 1920, 3) 的数组,并运行 size = frames[0].size,我得到的结果是 size = 1920, 1080,这很好。但如果我用形状是 (1080, 1920, 1) 的 frames 运行 size = frames[0].size,我得到的结果却是 size = 2073600

我的目标是当传入一个形状是 (1080, 1920, 1) 的帧时,得到一个大小是 (1920, 1080) 的数组。

我哪里做错了,或者说我不明白的地方是什么呢?

谢谢!

1 个回答

2

这听起来有点不对劲。如果你有一个形状为(1920,1080,3)的BGR图像,想要得到一个单通道的图像,它的形状应该是(1920,1080)。

你可以选择只取一个通道:

singleChannel = im[..., 0]   # take Blue channel
singleChannel = im[..., 1]   # take Green channel
singleChannel = im[..., 2]   # take Red channel

或者你可以把它转换成灰度图像,然后取那个:

singleChannel = cv.cvtColor(im, cv.COLOR_BGR2GRAY)

撰写回答