纯RAW数据转换为DNG格式
Posted MrCharles
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了纯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格式的文件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)
成功显示。
以上是关于纯RAW数据转换为DNG格式的主要内容,如果未能解决你的问题,请参考以下文章