Python中如何将OpenCV读取的3D图像矩阵调整为2D矩阵?
问题原因说明
你之前尝试的操作完全偏离了目标的计算逻辑:labels.transpose(2,0,1).reshape(3,-1) 是先把通道维度移到数组最前面,再把高、宽两个空间维度拍平拼接成一维,最终输出的数组形状是(3, 1528*1518),既没有保留原图像的二维空间结构,也没有去掉通道维度,自然得不到你要的(1528,1518)的输出。
要实现从OpenCV读取的(高, 宽, 3)三通道图像,调整为(高, 宽)的二维数组,核心是对第三通道的维度做合并/提取,不能随意转置、拍平空间维度,常见的正确实现方式如下:
常用实现方案
- 针对三通道数值完全一致的标注掩膜场景(你当前读取的是labels标注图,多数导出的标注文件符合这个特征)
直接提取任意一个通道的像素值即可,执行代码:labels = labels[:, :, 0]
执行完成后直接输出的数组shape就是(1528, 1518),且完全保留原图像每个空间位置的像素对应关系,没有信息错乱。 - 针对带不同色彩编码的多类别标签图场景
可以将每个位置的BGR三个通道的数值加权合并为单个整数标签值,既保留原色彩的区分度,又能去掉第三通道维度,示例代码:
输出数组的shape同样匹配# 按BGR通道权重编码为单通道整数值 labels = (labels[:, :, 0] << 16) + (labels[:, :, 1] << 8) + labels[:, :, 2](1528, 1518)的要求。 - 针对需要将彩色图转灰度的场景
直接调用OpenCV自带的色彩转换接口即可,执行代码:labels = cv2.cvtColor(labels, cv2.COLOR_BGR2GRAY)
输出为单通道灰度图,shape符合目标要求。
注意:不要使用无规则的reshape操作硬砍维度,否则会打乱像素的空间位置对应关系,直接破坏原图像的结构信息。
内容的提问来源于stack exchange,提问作者Vaibhav Saxena
相关产品推荐
相关产品推荐

