Python实现BayerRG8/BayerRG12原始相机数据保存为.raw/.cr2文件
推荐的Python库及实现方案
一、保存为纯.raw文件
纯.raw是未经封装的原始字节流,Lightroom/Darktable可通过手动指定参数(分辨率、Bayer格式、位深度)导入,无需额外依赖,直接用numpy即可实现:
1. 处理BayerRG8(uint8)
import numpy as np # 假设frame为形状(1216,1936,1)的uint8数组 frame = frame.squeeze() # 移除最后一个维度,转为(1216,1936) frame.tofile("output_rgb8.raw")
2. 处理BayerRG12(uint16)
你的uint16数组中每个像素实际是12位数据(通常高4位补0),需打包为紧凑的12位字节流(每3字节存储2个12位像素):
import numpy as np frame = frame.squeeze().astype(np.uint16) # 拆分12位数据的高低位 high_8bits = ((frame >> 4) & 0xFF).astype(np.uint8) low_4bits = (frame & 0x0F).astype(np.uint8) # 按每2个像素打包为3字节的格式重组 packed = np.zeros((frame.size * 3) // 2, dtype=np.uint8) packed[::3] = high_8bits[::2] packed[1::3] = high_8bits[1::2] packed[2::3] = low_4bits[::2] | (low_4bits[1::2] << 4) packed.tofile("output_rgb12.raw")
导入后期软件时,手动设置:分辨率1216×1936、Bayer格式RGGB、位深度12位即可。
二、保存为DNG格式(推荐,无需手动配置)
DNG是Adobe制定的通用RAW格式,Lightroom/Darktable可直接识别,无需手动导入参数,推荐以下两种方式:
1. 使用OpenCV(简单直接)
OpenCV 4.0+版本支持写入DNG,代码简洁:
import cv2 import numpy as np frame = frame.squeeze() # 转为(1216,1936) # 指定Bayer格式参数,RGGB对应cv2.COLOR_BAYER_RGGB2BGR params = [cv2.IMWRITE_DNG_BAYER_PATTERN, cv2.COLOR_BAYER_RGGB2BGR] # 写入DNG文件 cv2.imwrite("output.dng", frame, params)
注:12位uint16数组写入时会自动处理为12位DNG,无需额外转换。
2. 使用pyexiv2(自定义元数据)
如果需要添加相机型号、ISO、快门速度等EXIF元数据,可使用pyexiv2实现:
import numpy as np import pyexiv2 frame = frame.squeeze() # 先写入原始数据到临时文件 frame.tofile("temp_raw.bin") # 创建DNG文件并写入元数据 dng_img = pyexiv2.Image("output.dng") exif_tags = { "Exif.Image.ImageWidth": 1936, "Exif.Image.ImageLength": 1216, "Exif.Photo.BitsPerSample": 8 if frame.dtype == np.uint8 else 12, "Exif.Photo.PhotometricInterpretation": 32803, # 对应RGGB Bayer格式 "Exif.Image.Make": "Allied Vision", "Exif.Image.Model": "你的相机型号" } dng_img.modify_exif(exif_tags) # 将临时文件的原始数据写入DNG(需保证DNG结构合规,也可结合libraw完善)
关于CR2格式
CR2是佳能专属RAW格式,无公开标准,第三方库难以生成符合规范的文件,且Lightroom/Darktable对DNG的兼容性远优于自定义CR2,因此不推荐生成CR2,优先选择DNG。
内容的提问来源于stack exchange,提问作者Phil333
相关产品推荐
相关产品推荐

