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

2024-04-29 09:19:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从cr2(佳能原始图像文件)读取原始图像数据。如果可能的话,我只想读取预处理的数据(没有头等)(即预拜耳/最原始的未处理数据),并将其存储在numpy数组中。我试过很多库,比如opencvrawkitrawpy,但是似乎没有什么能正常工作。在

我该怎么做有什么建议吗?我应该用什么?我试过很多东西。在

谢谢你


Tags: 数据图像numpy图像文件数组opencv建议佳能
2条回答

因为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和{}都是2dnumpy数组。在

您可以使用rawkit来获取这些数据,但是,您将无法使用实际的rawkit模块(它为处理原始图像提供了更高级别的api)。相反,您将希望主要使用libraw模块,该模块允许您访问底层LibRaw api。在

我很难从图像中看出这些像素是什么。以下脚本(完全未经测试)将允许您获得所需的内容:

#!/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 forumsLibRaw struct docs上找到。在

在numpy数组中存储时,我会将其作为一种过度使用留给用户,或者作为后续的答案(我没有使用numpy的经验)。在

相关问题 更多 >