2015-09-07 503 views
4

我一直在google搜索使用python库显示原始图像数据的方法,但找不到任何合适的解决方案。数据来自相机模块,并具有'.raw'扩展名。当我试图通过'more filename.raw'在终端打开它时,控制台说这是一个二进制文件。厂商告诉我,相机输出16位原始灰度数据。使用python打开.raw图像数据

但我想知道如何通过PIL,Pillow或Numpy显示这些数据。我测试了PIL的Image模块。但是,它无法识别图像数据文件。看来PIL不会将.raw文件视为图像数据格式。可以显示BMP文件,但是'.raw'不能。

此外,当我试图与刚才读功能和matplotlib,如以下

from matplotlib import pyplot as plt 
f = open("filename.raw", "rb").read() 
plt.imshow(f) 
plt.show() 

然后用

ERROR: Image data can not convert to float

任何想法可以理解发生了错误。

链接: camera module

我做了一些改进与下面的代码。但现在问题是这个代码只显示整个图像的一部分。

from matplotlib import pyplot as plt 
import numpy as np 
from StringIO import StringIO 
from PIL import * 
scene_infile = open('G0_E3.raw','rb') 
scene_image_array = np.fromfile(scene_infile,dtype=np.uint8,count=1280*720) 
scene_image = Image.frombuffer("I",[1280,720], 
           scene_image_array.astype('I'), 
           'raw','I',0,1) 
plt.imshow(scene_image) 
plt.show() 
+0

RAW在位图或jpeg的意义上不是图像格式。这些图像包含每个像素的颜色,例如rgb值。 RAW基本上包含了照片船的原始数据,尚未转换为颜色值(因此是16位灰度)。这就是为什么它经常被(半)专业摄影师用来改变颜色在后期处理中的显示方式。由于将数据转换为每个像素的颜色的步骤尚未完成,因此所有标准图片库很可能无法读取RAW数据格式。 – Dux

+0

你是否搜索过numpy和RAW?我记得一些关于RAW的具有品牌特定标题块的内容。 – hpaulj

+0

你可能想看看[rawkit](https://github.com/photoshell/rawkit)。我从来没有使用它,所以不能评论它对你的用处,但它看起来可能有帮助 – tom

回答

3

rawpy看一看:

import rawpy 
import imageio 

path = 'image.raw' 
raw = rawpy.imread(path) 
rgb = raw.postprocess() 
imageio.imsave('default.tiff', rgb) 

rgb只是一个RGB numpy的数组,所以你可以使用任何库(不只是imageio)将其保存到磁盘。

如果您要访问的未经处理的拜尔数据,然后执行:

bayer = raw.raw_image 

又见API docs