在python中读取预处理的cr2 RAW图像数据

时间:2015-06-04 22:09:54

标签: python opencv image-processing numpy

我正在尝试从cr2(佳能原始图像文件)中读取原始图像数据。我想只读取数据(没有标题等),如果可能的话预处理(即pre-bayer /最原生的未处理数据)并将其存储在numpy数组中。我尝试了一些库,例如opencvrawkitrawpy,但似乎没有任何工作正常。

有关我应该如何做的任何建议?我应该用什么?我尝试了很多东西。

谢谢

2 个答案:

答案 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

bayerbayer_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 forumsLibRaw struct docs上的此问题中找到更多信息。

存储在一个numpy数组中,我作为用户的excersize离开,或者作为后续回答(我没有numpy经验)。