如何使用Python的OpenCV2读取32位TIFF图像并增强对比度
32位TIFF图像读取与对比度增强问题
问题背景
使用OpenCV读取TIFF图像时触发错误,目标是读取图像并完成轻度对比度增强。
初始错误信息
OpenCV TIFF: TIFFRGBAImageOK: Sorry, can not handle images with 32-bit samples
原代码
import os import cv2 input_folder = 'path' output_folder = 'path' # 遍历输入文件夹中的所有TIFF文件 for filename in os.listdir(input_folder): if filename.endswith('.tiff'): image = cv2.imread(os.path.join(input_folder, filename), cv2.IMREAD_GRAYSCALE) alpha = 1.0035 beta = 0 enhanced_image = cv2.convertScaleAbs(image, alpha=alpha, beta=beta) output_filename = os.path.splitext(filename)[0] + '_enhanced.tif' cv2.imwrite(os.path.join(output_folder, output_filename), enhanced_image)
更新尝试后的错误
尝试参考相关方案后,出现以下错误:
can't open/read file: check file path/integrity
cv2.error: OpenCV(4.7.0) D:\a\opencv-python\opencv-python\opencv\modules\imgcodecs\src\loadsave.cpp:783: error: (-215:Assertion failed) !_img.empty() in function 'cv::imwrite'
解决方案
OpenCV的imread对32位浮点TIFF支持有限,可改用tifffile库读取,再转成OpenCV可处理的格式:
- 安装依赖库
pip install tifffile
- 修改后的代码
import os import cv2 import tifffile as tf input_folder = 'path' output_folder = 'path' # 确保输出文件夹存在 os.makedirs(output_folder, exist_ok=True) for filename in os.listdir(input_folder): if filename.lower().endswith(('.tiff', '.tif')): file_path = os.path.join(input_folder, filename) # 读取32位TIFF图像 image = tf.imread(file_path) # 转换为OpenCV兼容的8位格式(根据图像实际范围调整归一化逻辑) image_normalized = cv2.normalize(image, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U) # 对比度增强 alpha = 1.0035 beta = 0 enhanced_image = cv2.convertScaleAbs(image_normalized, alpha=alpha, beta=beta) # 保存增强后的图像 output_filename = os.path.splitext(filename)[0] + '_enhanced.tif' cv2.imwrite(os.path.join(output_folder, output_filename), enhanced_image)
关键说明
tifffile库原生支持32位TIFF(包括浮点型)的读取,解决OpenCV的兼容性问题- 加入
os.makedirs确保输出文件夹存在,避免路径类错误 - 增加对
.tif后缀的兼容,用lower()规避大小写匹配问题 - 归一化步骤可根据图像实际数据范围调整:如果原始图像是0-65535的16位数据,可直接转8位;如果是浮点型(如0-1或任意范围),用
cv2.normalize映射到0-255区间
内容的提问来源于stack exchange,提问作者Neko Lim
相关产品推荐
相关产品推荐

