Python处理CR3格式Raw图像:读取/转JPG及偏色问题求助
处理CR3格式Raw照片的Python解决方案
一、Python直接读取CR3格式
用rawpy库(基于libraw)可原生读取CR3格式,自动处理拜耳阵列解码、白平衡、色彩空间转换等,避免手动处理的错误。
步骤:
- 安装依赖:
pip install rawpy opencv-python numpy
- 读取CR3并转为OpenCV可用的RGB图像:
import rawpy import cv2 import numpy as np def read_cr3_to_opencv(cr3_path): with rawpy.imread(cr3_path) as raw: # 生成标准RGB图像,参数可按需调整 rgb = raw.postprocess(use_camera_wb=True, output_bps=8) # 转换为OpenCV默认的BGR格式 bgr = cv2.cvtColor(rgb, cv2.COLOR_RGB2BGR) return bgr # 测试调用 img = read_cr3_to_opencv("example.cr3") cv2.imshow("CR3 to BGR", img) cv2.waitKey(0)
raw.postprocess()可调整参数:use_camera_wb启用相机自带白平衡,output_bps设置输出位深(8/16),no_auto_bright关闭自动亮度优化等。
二、批量将CR3转JPG
方法1:用rawpy批量转换
import rawpy from PIL import Image import os def batch_cr3_to_jpg(input_dir, output_dir): os.makedirs(output_dir, exist_ok=True) for filename in os.listdir(input_dir): if filename.lower().endswith(".cr3"): cr3_path = os.path.join(input_dir, filename) jpg_path = os.path.join(output_dir, os.path.splitext(filename)[0] + ".jpg") with rawpy.imread(cr3_path) as raw: rgb = raw.postprocess(use_camera_wb=True, output_bps=8) Image.fromarray(rgb).save(jpg_path, quality=95) print("批量转换完成") # 使用示例 batch_cr3_to_jpg("./cr3_photos", "./jpg_output")
方法2:调用exiftool(推荐,保留元数据)
exiftool是专业图像元数据工具,支持CR3转JPG并保留EXIF信息。先安装工具:Windows下载二进制包,Linux用apt install libimage-exiftool-perl,Mac用brew install exiftool,再用Python调用:
import subprocess import os def batch_cr3_to_jpg_exiftool(input_dir, output_dir): os.makedirs(output_dir, exist_ok=True) cmd = [ "exiftool", "-ext", "cr3", "-overwrite_original", "-o", output_dir, "-jpg", input_dir ] subprocess.run(cmd, check=True) print("批量转换完成") # 使用示例 batch_cr3_to_jpg_exiftool("./cr3_photos", "./jpg_output")
三、解决rawlib转PGM后的偏绿问题
偏绿原因是拜耳阵列通道拼接错误,且未处理白平衡、色彩校正。CR3的拜耳模式通常为BGGR或RGGB,手动拼接易出错,Raw数据需做去马赛克和色彩校正。
修正方案:用OpenCV的demosaicing函数处理
import cv2 import numpy as np def read_pgm_raw_to_bgr(pgm_path): with open(pgm_path, 'rb') as ipf: # 读取PGM头信息 format = ipf.readline().decode().strip() dim = ipf.readline().decode().strip() width, height = map(int, dim.split()) limit = int(ipf.readline().decode().strip()) # 读取Raw拜耳数据(大端16位) rawp = np.frombuffer(ipf.read(), dtype='>u2').reshape((height, width)) # 根据CR3的拜耳模式选择解码参数,常见为BGGR/RGGB # 不确定时可尝试几种模式直到颜色正常 bgr = cv2.cvtColor(rawp, cv2.COLOR_BAYER_BG2BGR) # 白平衡校正(示例参数,需根据实际照片调整) bgr[..., 0] = np.clip(bgr[..., 0] * 1.5, 0, 65535) bgr[..., 2] = np.clip(bgr[..., 2] * 1.8, 0, 65535) # 转换为8位图像 bgr_8bit = cv2.normalize(bgr, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U) return bgr_8bit # 测试调用 img = read_pgm_raw_to_bgr("raw.pgm") cv2.imshow("Corrected Image", img) cv2.waitKey(0)
关键补充:
- 确认拜耳模式:用
rawpy查看相机CR3的拜耳格式:
import rawpy with rawpy.imread("example.cr3") as raw: print(raw.raw_pattern) # 输出拜耳阵列结构,如[[0,1],[2,1]]对应BGGR
- 白平衡:Raw数据无自带白平衡,需应用相机参数或手动调整,否则必然偏色。
- 色彩校正:Raw数据需转换至sRGB色彩空间,
rawpy的postprocess会自动处理,手动处理需加载相机色彩矩阵。
内容的提问来源于stack exchange,提问作者user16971617
相关产品推荐
相关产品推荐

