You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 14:22:42