我正在尝试从cr2(佳能原始图像文件)中读取原始图像数据。我想只读取数据(没有标题等),如果可能的话预处理(即pre-bayer /最原生的未处理数据)并将其存储在numpy数组中。我尝试了一些库,例如opencv
,rawkit
,rawpy
,但似乎没有任何工作正常。
有关我应该如何做的任何建议?我应该用什么?我尝试了很多东西。
谢谢
答案 0 :(得分:1)
由于libraw / dcraw可以读取cr2,因此应该很容易。使用rawpy:
#!/usr/bin/env python
import rawpy
raw = rawpy.imread("/some/path.cr2")
bayer = raw.raw_image # with border
bayer_visible = raw.raw_image_visible # just visible area
bayer
和bayer_visible
都是2D numpy数组。
答案 1 :(得分:0)
您可以使用rawkit
来获取此数据,但是,您将无法使用实际的rawkit
模块(它提供更高级别的API来处理原始图像)。相反,您将主要使用允许您访问底层LibRaw API的libraw
模块。
很难准确地告诉你这个问题你想要什么,但我将假设以下内容:原始拜耳数据,包括“蒙面”边框像素(未显示,但用于计算各种事物)关于图像)。像下面这个(完全未经测试的)脚本可以让你得到你想要的东西:
#!/usr/bin/env python
import ctypes
from rawkit.raw import Raw
with Raw(filename="some_file.CR2") as raw:
raw.unpack()
# For more information, see the LibRaw docs:
# http://www.libraw.org/docs/API-datastruct-eng.html#libraw_rawdata_t
rawdata = raw.data.contents.rawdata
data_size = rawdata.sizes.raw_height * rawdata.sizes.raw_width
data_pointer = ctypes.cast(
rawdata.raw_image,
ctypes.POINTER(ctypes.c_ushort * data_size)
)
data = data_pointer.contents
# Grab the first few pixels for demonstration purposes...
for i in range(5):
print('Pixel {}: {}'.format(i, data[i]))
我很有可能误解了某些内容并且大小已经关闭,在这种情况下最终会出现段错误,但这并不是我试图让LibRaw做过的事情。
可以在LibRaw forums或LibRaw struct docs上的此问题中找到更多信息。
存储在一个numpy数组中,我作为用户的excersize离开,或者作为后续回答(我没有numpy经验)。