ISP之提取.DNG格式中的RAW(Bayer)数据

最近在研究ISP算法,需要一些测试RAW图的二进制数据,突然发现有些手机的拍照模式可以选择RAW格式数据输出,但是这些RAW格式实际上是将Bayer格式的数据连同一些其他信息,如黑电平、拍摄时的曝光时长、白平衡、Bayer图像尺寸、CCM矩阵等一起打包的数据。

不同品牌的相机的RAW格式打包文件的后缀名都不同,如佳能是.CR2、尼康是.NEF、索尼是.ARW等。

DNG(数字负片)也是一种打包的RAW格式,是一种比较新的统一原始数据标准。目前所有单反相机、苹果、华为、小米、一加等手机厂商都已经支持DNG格式输出拍照原始图像数据(DNG)。

为了解析处DNG格式的二进制Bayer数据(如RGGB),使用以下Python脚本:

需要rawpy、numpy、exifread第三方库包,使用pip install安装即可

import rawpy
import numpy as np
import exifread

#HUAWEI Mate30:12bit   blacklevel:256   
#origin size1(X1):(width,heigt)=7296X5472    BayerPattern:BGGR
#origin size2(广角):(width,heigt)=4608X3456   BayerPattern:RGGB
#origin size3(X3):(width,heigt)=3264X2448    BayerPattern:RGGB

#1/2 clip size:(width,heigt)=3648X2736 

# 指定DNG文件路径
dng_path = "dngimagepath.dng"

#读取DNG文件标签信息
 with open(dng_path, 'rb') as f:
    # Read the metadata
    tags = exifread.process_file(f)   #读取所有的tag
    for tag in tags.keys():
        print(tag, tags[tag])
    # Get the black level tag value
    black_level = tags['Image BlackLevel'].values[0]
    print(black_level)
    f.close() 


# 打开DNG文件
with rawpy.imread(dng_path) as raw:
    # 提取原始的Bayer模式数据
    bayer_data = raw.raw_image.copy()
    # 将Bayer数据转换为numpy数组
    bayer_array = np.array(bayer_data)
    #bayer_array_clip=bayer_array[0:2736,0:3648] #若需要裁剪
    bayer_array_clip=bayer_array
    """ 
    # 获取红色通道
    red_channel = bayer_array[0::2, 0::2]
    # 获取绿色通道
    green_channel_1 = bayer_array[0::2, 1::2]
    green_channel_2 = bayer_array[1::2, 0::2]
    # 将两个绿色通道取平均
    green_channel = (green_channel_1 + green_channel_2) / 2
    # 获取蓝色通道
    blue_channel = bayer_array[1::2, 1::2]
    """
    bayer_array_clip=bayer_array_clip.astype(np.int32)
    # bayer_array_clip=bayer_array_clip-black_level  #减去黑电平black_level
    # bayer_array_clip[bayer_array_clip<0]=0         #减去黑电平后钳位
    dst=bayer_array_clip.astype(np.uint16)
    out_name="./image.raw"
    dst.tofile(out_name)

参考

DNG 文件解析 - 知乎

要使用rawpy库读取多张raw图片并应用偏移量(offset),可以使用循环遍历每个raw文件,并对每个文件执行读取和处理操作。以下是一个示例代码: ``` import rawpy import imageio import os # set path to directory containing raw files directory = '/path/to/raw/files' # set offset values offset_x = 100 offset_y = 200 # loop through all raw files in directory for filename in os.listdir(directory): if filename.endswith('.ARW'): # check if file is a raw file filepath = os.path.join(directory, filename) with rawpy.imread(filepath) as raw: # apply offset to raw image raw_image = raw.raw_image.astype('float32') raw_image = raw_image[offset_y:, offset_x:] raw_image = raw_image.clip(0, 65535) raw_image /= 65535.0 # convert raw image to RGB image rgb_image = raw.postprocess() # save RGB image to disk output_filepath = os.path.join(directory, filename[:-4] + '.jpg') imageio.imwrite(output_filepath, rgb_image) ``` 在这个示例中,我们使用os模块中的listdir()函数列出指定目录中的所有文件,然后使用循环遍历每个文件。对于每个.raw文件,我们使用os模块中的join()函数创建完整的文件路径,并使用rawpy中的imread()函数打开RAW文件。然后,我们应用偏移量来裁剪原始图像,并将其转换为RGB格式。最后,我们将RGB图像保存到磁盘上。在这个示例中,我们使用了imageio库来保存图像,但你也可以使用其他库来保存图像,例如OpenCV或Pillow。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值