PIL fromarray 用于单通道图像

问题描述 投票:0回答:1

我正在尝试从一个形状 (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

我尝试不扩大维度,得到r的形状为(1080,1920)并成功运行

Image.fromarray(r)

我还尝试扩大 PIL 图像的尺寸

frame = np.expand_dims(frame, axis=(2))
,这似乎返回了适当的结果,但有一个奇怪的行为:

如果我使用大小为 (1080, 1920, 3) 的数组并运行

size = frames[0].size
,我会得到
size = 1920, 1080
,这非常棒。但如果我用形状为 (1080, 1920, 1) 的框架运行
size = frames[0].size
,我会得到
size = 2073600

我的目标是在传递形状为 (1080, 1920, 1) 的框架时得到一个大小为 (1920, 1080) 的数组。

我做错了什么或不理解吗?

谢谢你

python numpy opencv python-imaging-library
1个回答
0
投票

这没有道理。如果您有一个形状为 (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)
© www.soinside.com 2019 - 2024. All rights reserved.