单通道图像的PIL fromarray
我想把一个形状是 (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)