使用cv2.imread读取uint16格式TIFF文件时维度异常的问题
问题:OpenCV读取多通道TIFF时丢失通道
我有一个维度为(3,1200,1200)的TIFF文件,想用OpenCV读取后做后续处理,但遇到了问题:
- 用
tifffile.imread读取时,数据维度正常; - 用
cv2.imread(file_path, cv2.IMREAD_UNCHANGED)读取时,通道丢失,数组维度变为(1220,1200)。
我的代码如下:
import cv2 import numpy as np from matplotlib import pyplot as plt from scipy import ndimage from skimage import measure, color, io file_path = "C:\Users\valit\OneDrive - The Ohio State University\Valeria\20230228_cdk4\dmso\AVG_3.tif" img1 = cv2.imread(file_path, cv2.IMREAD_UNCHANGED) plt.imshow(img1)
原因分析
OpenCV的cv2.imread对多通道TIFF的支持存在局限性,尤其当文件采用**通道优先(C, H, W)**的存储顺序时,它无法正确识别通道结构,会将所有通道的像素数据平铺为单通道二维数组,导致维度异常。而tifffile.imread能完整解析TIFF的元数据,保留原始的通道顺序和维度。
解决方法
方法1:用tifffile读取后转换为OpenCV兼容格式
先通过tifffile读取原始数据,再将通道顺序从(C, H, W)转换为OpenCV常用的(H, W, C)格式:
import cv2 import numpy as np import tifffile from matplotlib import pyplot as plt # 路径前加r避免转义字符问题 file_path = r"C:\Users\valit\OneDrive - The Ohio State University\Valeria\20230228_cdk4\dmso\AVG_3.tif" # 读取原始多通道数据 img_tiff = tifffile.imread(file_path) # 形状为(3,1200,1200) # 转换通道顺序适配OpenCV img_cv = np.transpose(img_tiff, (1, 2, 0)) print("转换后维度:", img_cv.shape) # 输出应为(1200,1200,3) plt.imshow(img_cv) plt.show()
方法2:使用OpenCV的cv2.imreadmulti读取
OpenCV的cv2.imreadmulti专门用于读取多通道/多页TIFF,能正确保留通道信息:
import cv2 import numpy as np from matplotlib import pyplot as plt file_path = r"C:\Users\valit\OneDrive - The Ohio State University\Valeria\20230228_cdk4\dmso\AVG_3.tif" # 读取所有通道,返回值第二个元素为通道数组列表 _, channels = cv2.imreadmulti(file_path, [], cv2.IMREAD_UNCHANGED) # 堆叠通道并转换顺序 img_cv = np.transpose(np.array(channels), (1, 2, 0)) print("读取后维度:", img_cv.shape) # 输出应为(1200,1200,3) plt.imshow(img_cv) plt.show()
注意事项
- 文件路径需用原始字符串(加
r)或转义反斜杠,避免路径解析错误; - 若TIFF通道为16位等非8位格式,需先通过
cv2.normalize或手动缩放转换为8位,否则plt.imshow可能显示异常。
内容的提问来源于stack exchange,提问作者valit
相关产品推荐
相关产品推荐

