纯RAW数据转换为DNG格式

手上有一个没有任何header信息的RAW文件,是从相机传感器直接输出的,格式是一个一维的数组,大小是1,310,720,也就是1024*1280.

想使用rawpy来模拟ISP的处理流程,但是很不幸的是,rawpy不支持直接处理这种没有任何header信息的RAW文件。报错信息如下:

LibRawFileUnsupportedError: b'Unsupported file format or not RAW file'

好在,我找到了一个解决方案:(http://im.snibgo.com/procbay.htm)

纯RAW数据转换为DNG格式

首先将RAW格式的文件resize到1024*1280.然后保存为未经压缩的TIF文件格式:

raw1 = np.fromfile(os.path.join(dirpath, "M00009_48mp_0x8_0x07ff.raw"), dtype=np.uint8)
raw1 = np.reshape(raw1,(1024,1280,1))
imageio.imsave('M00009_48mp_0x8_0x07ff.tif', raw1)
print(raw1[:10,0,0]) # [85 39 39 40 41 38 39 39 38 38]

检查一下看看TIF重新读取会改变数据么?

rawtif = imageio.imread('M00009_48mp_0x8_0x07ff.tif')
print(rawtif.shape)
rawtif = np.reshape(rawtif,(1024,1280,1))
print(rawtif[:10,0,0]) # [85 39 39 40 41 38 39 39 38 38]

实际上没有,TIF保存是安全的,没有任何数据丢失和压缩。

然后我们拿着TIF文件,也就是上面图里面当作Bayer图,使用exiftool来生成DNG图像。不过使用这个工具是需要指定一些相机的具体的参数的,也就是metadata:

-Make=MICRON CORPORATION
-Model=MT9M001
-DNGVersion=1.4.0.0
-DNGBackwardVersion=1.3.0.0
-EXIF:SubfileType=Full-resolution Image
-PhotometricInterpretation=Color Filter Array
-IFD0:CFARepeatPatternDim=2 2
-IFD0:CFAPattern2=0 1 1 2
-Orientation=Horizontal
-BitsPerSample=8
-SamplesPerPixel=1

然后使用如下命令转换格式到DNG:

./exiftool.exe   -@ pbpx_exft_args.txt   -o C00009_48mp_0x8_0x07ff.dng  C00009_48mp_0x8_0x07ff.tif

事实上,DNG里面就是相比于原始RAW多了这些meta的数据罢了,我们手工加上,就形成了一个很好的DNG文件格式了。

有了DNG,rawpy处理就没啥问题了:

filepath = 'C00009_48mp_0x8_0x07ff.dng'
with rawpy.imread(filepath) as raw:
    rgb = raw.postprocess(use_camera_wb=True, half_size=False, no_auto_bright=True, output_bps=8)
img = Image.fromarray(rgb)
display(img)

成功显示。

上一篇:38,39,40,41,....


下一篇:1、Python中类的学习