我正在尝试从一个形状 (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) 的数组。
我做错了什么或不理解吗?
谢谢你
这没有道理。如果您有一个形状为 (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)