sid,eld,sidd dataset介绍,dng图像处理

news2024/11/26 11:52:52

文章目录

    • SID dataset
      • 1. SID dataset 概述
      • 2. SID 读取和显示代码
      • 3. 一些示例
    • SIDD dataset
    • ELD dataset
    • DNG camera pipeline

SID dataset

1. SID dataset 概述

SID 是Learning to See in the Dark 论文中提出的暗光raw数据集

其中包括两个相机的拍摄数据 Sony alpha7S II 和 Fujifilm X-T2.
下面主要介绍下sony camera的数据

拍摄照度:
室外 0.2-5 lux
室内 0.03-0.3 lux

一共包括short和long两个文件夹:
long文件夹共231个ARW文件,其中20208__00_10s.ARW表示的是场景20208,第00次拍摄,曝光时间是10s
在这里插入图片描述

short文件夹对应的 短曝光 的拍摄图像, 一共2697张图像
short的曝光时间设置为 参考图像的 1/100, 1/250, 1/300。比如参考groundtruth 曝光是10s, 则short图像的曝光可能被设置为 0.1s, 0.04s, 0.033s。 相同设置可能被拍摄多张,可以用来开发 burst multiframe相关算法。
在这里插入图片描述

2. SID 读取和显示代码

利用rawpy 库
在这里插入图片描述

import glob
import os

import matplotlib.pyplot as plt
import numpy as np
import rawpy

import colour
from colour_demosaicing import demosaicing_CFA_Bayer_Menon2007
def pack_raw(raw):
    # pack Bayer image to 4 channels
    im = raw.raw_image_visible.astype(np.float32)
    im = np.maximum(im - 512, 0) / (16383 - 512)  # subtract the black level

    im = np.expand_dims(im, axis=2)
    img_shape = im.shape
    H = img_shape[0]
    W = img_shape[1]

    out = np.concatenate((im[0:H:2, 0:W:2, :],
                          im[0:H:2, 1:W:2, :],
                          im[1:H:2, 1:W:2, :],
                          im[1:H:2, 0:W:2, :]), axis=2)
    return out


def pack_raw_bayer(raw):
    # 和上面的函数功能一样,都是减去black level,然后分成4 channnel图像
    # pack Bayer image to 4 channels
    im = raw.raw_image_visible.astype(np.float32)
    raw_pattern = raw.raw_pattern
    R = np.where(raw_pattern == 0)
    G1 = np.where(raw_pattern == 1)
    B = np.where(raw_pattern == 2)
    G2 = np.where(raw_pattern == 3)

    white_point = 16383
    img_shape = im.shape
    H = img_shape[0]
    W = img_shape[1]

    out = np.stack((im[R[0][0]:H:2, R[1][0]:W:2],  # RGBG
                    im[G1[0][0]:H:2, G1[1][0]:W:2],
                    im[B[0][0]:H:2, B[1][0]:W:2],
                    im[G2[0][0]:H:2, G2[1][0]:W:2]), axis=0).astype(np.float32)

    black_level = np.array(raw.black_level_per_channel)[:, None, None].astype(np.float32)

    out = (out - black_level) / (white_point - black_level)
    out = np.clip(out, 0, 1)

    return out
if __name__ == "__main__":
    input_dir = r'D:\dataset\ELD\sid\Sony\Sony\short'
    gt_dir = r'D:\dataset\ELD\sid\Sony\Sony\long'

    train_id = 1
    in_files = glob.glob(os.path.join(input_dir, '%05d_00*.ARW' % train_id))
    gt_files = glob.glob(os.path.join(gt_dir, '%05d_00*.ARW' % train_id))
    print(in_files, gt_files)

    in_path = in_files[0]
    gt_path = gt_files[0]
    print(in_path, gt_path)

    # 获取曝光时间
    in_fn = os.path.basename(in_path)
    gt_fn = os.path.basename(gt_path)
    in_exposure = float(in_fn[9:-5])
    gt_exposure = float(gt_fn[9:-5])
    ratio = min(gt_exposure / in_exposure, 300)
    print('exp time:', in_exposure, gt_exposure, ratio)

    raw = rawpy.imread(in_path)
    gt_raw = rawpy.imread(gt_path)
    print('raw meta info :', raw.black_level_per_channel, raw.raw_pattern)

    im = raw.raw_image_visible.astype(np.float32)
    im = np.maximum(im - 512, 0) / (16383 - 512) * ratio # subtract the black level
    im1 = demosaicing_CFA_Bayer_Menon2007(im, 'RGGB')
    im11 = raw.postprocess(use_camera_wb=True, half_size=False, no_auto_bright=True, output_bps=8)

    im2 = gt_raw.postprocess(use_camera_wb=True, half_size=False, no_auto_bright=True, output_bps=8)

    # im1 raw数据乘上一个ratio, 然后 demosaicing, 显示绿色的raw图
    # im11 对raw数据 应用isp, 由于曝光时间短, 没有乘上ratio, 可能显示sRGB 全黑
    # im2 是groundtruth 参考图,曝光充分,正常显示sRGB图
    plt.figure()
    plt.subplot(131)
    plt.imshow(im1)
    plt.subplot(132)
    plt.imshow(im11)
    plt.subplot(133)
    plt.imshow(im2)
    plt.show()

    # noise image
    im11 = im11 / im11.max()
    im11 = im11 * ratio
    im11 = np.clip(im11, 0, 1)
    plt.figure()
    plt.imshow(im11)
    plt.show()

    # process all
    gt_files = glob.glob(os.path.join(gt_dir, '*.ARW'))
    for file in gt_files:
        print(file)
        gt_raw = rawpy.imread(file)
        im2 = gt_raw.postprocess(use_camera_wb=True, half_size=False, no_auto_bright=True, output_bps=8)
        cv2.imwrite(file[:-4] + '.png', im2[..., ::-1])

3. 一些示例

在这里插入图片描述

gt 和 noise:
在这里插入图片描述

将中间的黑色图乘上ratio显示noise image(只是为了显示,这样操作是不对的):
在这里插入图片描述

SIDD dataset

link:https://www.eecs.yorku.ca/~kamel/sidd/dataset.php
论文 A High-Quality Denoising Dataset for Smartphone Cameras 提出的一个数据集

利用多张有噪声图像,利用对齐技术和fusion技术,生成 无噪声图像作为ground truth.

官方网站上有 small , medium, full三个版本的数据集。我下载了medium的数据集, full的太大内存。

medium 版本包含raw 和 sRGB两个文件夹
在这里插入图片描述

命名方式:

<scene-instance-number>_<scene_number>_<smartphone-code>_<ISO-level>_<shutter-speed>_<illuminant-temperature>_<illuminant-brightness-code>

raw:
160 x (2 + 2) = 640 张图像
sRGB:
对应raw的 640张 sRGB 图像。
下载的数据集中有详细说明。

对应的mat数据, wb, ccm, gamma后的图像如下:
在这里插入图片描述

code:

import colour_demosaicing
import scipy.io as sio
import glob
import os

import cv2
import matplotlib.pyplot as plt
import numpy as np
import rawpy

import colour
from colour_demosaicing import demosaicing_CFA_Bayer_Menon2007
import h5py


def extract_metainfo(path='0151_METADATA_RAW_010.MAT'):
    meta = sio.loadmat(path)['metadata']
    mat_vals = meta[0][0]
    mat_keys = mat_vals.dtype.descr

    keys = []
    for item in mat_keys:
        keys.append(item[0])

    py_dict = {}
    for key in keys:
        py_dict[key] = mat_vals[key]

    device = py_dict['Model'][0].lower()
    bitDepth = py_dict['BitDepth'][0][0]
    if 'iphone' in device or bitDepth != 16:
        noise = py_dict['UnknownTags'][-2][0][-1][0][:2]
        iso = py_dict['DigitalCamera'][0, 0]['ISOSpeedRatings'][0][0]
        pattern = py_dict['SubIFDs'][0][0]['UnknownTags'][0][0][1][0][-1][0]
        time = py_dict['DigitalCamera'][0, 0]['ExposureTime'][0][0]

    else:
        noise = py_dict['UnknownTags'][-1][0][-1][0][:2]
        iso = py_dict['ISOSpeedRatings'][0][0]
        pattern = py_dict['UnknownTags'][1][0][-1][0]
        time = py_dict['ExposureTime'][0][0]  # the 0th row and 0th line item

    rgb = ['R', 'G', 'B']
    pattern = ''.join([rgb[i] for i in pattern])

    asShotNeutral = py_dict['AsShotNeutral'][0]
    b_gain, _, r_gain = asShotNeutral

    # only load ccm1
    ccm = py_dict['ColorMatrix1'][0].astype(float).reshape((3, 3))

    return {'device': device,
            'pattern': pattern,
            'iso': iso,
            'noise': noise,
            'time': time,
            'wb': np.array([r_gain, 1, b_gain]),
            'ccm': ccm, }


def extract_metainfo2(file):
    meta = sio.loadmat(file)['metadata']
    mat_vals = meta[0][0]
    mat_keys = mat_vals.dtype.descr

    keys = []
    for item in mat_keys:
        keys.append(item[0])

    py_dict = {}
    for key in keys:
        py_dict[key] = mat_vals[key]

    return py_dict


def fix_orientation(image, orientation):
    # 1 = Horizontal(normal)
    # 2 = Mirror horizontal
    # 3 = Rotate 180
    # 4 = Mirror vertical
    # 5 = Mirror horizontal and rotate 270 CW
    # 6 = Rotate 90 CW
    # 7 = Mirror horizontal and rotate 90 CW
    # 8 = Rotate 270 CW

    if type(orientation) is list:
        orientation = orientation[0]

    if orientation == 1:
        pass
    elif orientation == 2:
        image = cv2.flip(image, 0)
    elif orientation == 3:
        image = cv2.rotate(image, cv2.ROTATE_180)
    elif orientation == 4:
        image = cv2.flip(image, 1)
    elif orientation == 5:
        image = cv2.flip(image, 0)
        image = cv2.rotate(image, cv2.ROTATE_90_COUNTERCLOCKWISE)
    elif orientation == 6:
        image = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE)
    elif orientation == 7:
        image = cv2.flip(image, 0)
        image = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE)
    elif orientation == 8:
        image = cv2.rotate(image, cv2.ROTATE_90_COUNTERCLOCKWISE)

    return image

def process_mat_img(file, py_dict, pattern='bggr'):
    '''
    :param file: 输入 mat 文件
    :return: srgb image
    '''
    data = {}
    f = h5py.File(file)
    for k, v in f.items():
        data[k] = np.array(v)
    data0 = data['x']  # [1000:2000,2000:3000]
    data = fix_orientation(data0, py_dict['Orientation'])

    rgb = colour_demosaicing.demosaicing_CFA_Bayer_Menon2007(data, pattern)

    wb_gain = 1 / py_dict['AsShotNeutral']
    wb_gain = wb_gain.astype(np.float32).reshape(-1, 1, 3)
    rgb_wb = rgb * wb_gain
    rgb_wb = np.clip(rgb_wb, 0, 1)

    xyz2cam1 = np.reshape(np.asarray(py_dict['ColorMatrix1']),
                          (3, 3))  # 不同光源的标定矩阵,这里xyz2cam1应该是D65, 对应py_dict['CalibrationIlluminant1']
    xyz2cam2 = np.reshape(np.asarray(py_dict['ColorMatrix2']), (3, 3))
    # normalize rows (needed?)
    xyz2cam1 = xyz2cam1 / np.sum(xyz2cam1, axis=1, keepdims=True)
    xyz2cam2 = xyz2cam2 / np.sum(xyz2cam1, axis=1, keepdims=True)
    # inverse
    cam2xyz1 = np.linalg.inv(xyz2cam1)
    cam2xyz2 = np.linalg.inv(xyz2cam2)
    # for now, use one matrix  # TODO: interpolate btween both
    rgb_xyz = rgb_wb.reshape(-1, 3) @ cam2xyz1.T
    rgb_xyz = rgb_xyz.reshape(rgb_wb.shape)
    rgb_xyz = np.clip(rgb_xyz, 0.0, 1.0)
    xyz2srgb = np.array([[3.2404542, -1.5371385, -0.4985314],
                         [-0.9692660, 1.8760108, 0.0415560],
                         [0.0556434, -0.2040259, 1.0572252]])

    # normalize rows (needed?)
    rgb_ccm = rgb_xyz.reshape(-1, 3) @ xyz2srgb.T
    rgb_ccm = rgb_ccm.reshape(rgb_wb.shape)
    rgb_ccm = np.clip(rgb_ccm, 0.0, 1.0)

    rgb_gamma = rgb_ccm ** (1 / 2.2)
    rgb_gamma = np.clip(rgb_gamma, 0, 1)

    # rgb_gamma_save = np.clip(rgb_gamma * 255, 0, 255).astype(np.uint8)
    # cv2.imwrite('dd.png', rgb_gamma_save[::-1, :, ::-1])

    plt.figure()
    plt.subplot(221)
    plt.imshow(rgb)
    plt.subplot(222)
    plt.imshow(rgb_wb)
    plt.subplot(223)
    plt.imshow(rgb_ccm)
    plt.subplot(224)
    plt.imshow(rgb_gamma)
    plt.show()

if __name__ == "__main__":
    file1 = r'D:\dataset\SIDD_Medium_Raw_Parts\SIDD_Medium_Raw\Data\0055_003_N6_00800_01000_5500_N\0055_GT_RAW_010.MAT'
    file2 = r'D:\dataset\SIDD_Medium_Raw_Parts\SIDD_Medium_Raw\Data\0055_003_N6_00800_01000_5500_N\0055_GT_RAW_011.MAT'

    file3 = r'D:\dataset\SIDD_Medium_Raw_Parts\SIDD_Medium_Raw\Data\0055_003_N6_00800_01000_5500_N\0055_METADATA_RAW_010.MAT'
    file4 = r'D:\dataset\SIDD_Medium_Raw_Parts\SIDD_Medium_Raw\Data\0055_003_N6_00800_01000_5500_N\0055_METADATA_RAW_011.MAT'

    file5 = r'D:\dataset\SIDD_Medium_Raw_Parts\SIDD_Medium_Raw\Data\0055_003_N6_00800_01000_5500_N\0055_NOISY_RAW_010.MAT'
    file6 = r'D:\dataset\SIDD_Medium_Raw_Parts\SIDD_Medium_Raw\Data\0055_003_N6_00800_01000_5500_N\0055_NOISY_RAW_011.MAT'

    metainfo = extract_metainfo(file3)
    print(metainfo)
    py_dict = extract_metainfo2(file3)

    # isp: wb, ccm, gamma
    process_mat_img(file5, py_dict, metainfo['pattern'])
    print('py_dict info:', py_dict)
    print(py_dict['AsShotNeutral'], py_dict['ColorMatrix1'], py_dict['ColorMatrix2'])
    print(py_dict['CalibrationIlluminant1'], py_dict['CalibrationIlluminant2'])
    print(py_dict['Orientation'])
    print(py_dict['Height'], py_dict['Width'], py_dict['BitDepth'])

ELD dataset

下载地址:https://github.com/Vandermode/ELD
在这里插入图片描述

以其中一个场景的文件夹举例:
iso level 设置为100, 曝光时间3.2为正常, gain = 100 * 3.2

另外生成iso level 分布为 800, 1600, 3200的
曝光时间满足:gain_noise = gain / factor(factor = 1, 10, 100, 200)

在这里插入图片描述

camera:SonyA7S2, NikonD850, CanonEOS70D, CanonEOS700D

DNG camera pipeline

https://github.com/AbdoKamel/sidd-ground-truth-image-estimation
sidd 论文中给出了处理dng raw图的pipiline python程序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/616063.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实战演练 | 在 Navicat 16 中创建视图

为了规范化数据库表&#xff0c;常常会将高级别表中的冗余列抽取到单独的子表中。这通常是由于某些字段与父实体具有一对多关系而发生的。例如&#xff0c;请参考以下使用 Navicat Data Modeler 生成的模型&#xff1a; 评估最初是 ups 表的一部分&#xff0c;但这导致了数据冗…

没素材也可以剪辑,根据画面描述搜索影片素材!

随着社交媒体的普及&#xff0c;越来越多的人开始喜欢用短视频分享自己的生活。但是&#xff0c;在剪辑过程中&#xff0c;素材的质量和多样性是很重要的。如果你缺乏素材&#xff0c;可以考虑根据画面描述去搜索一些适合的影片素材。 首先&#xff0c;你需要确定自己需要什么…

自学黑客(网络安全),学习集锦奉上!

想学网络安全&#xff0c;不知道学习方向&#xff1f;我整理了一份渗透测试学习方法&#xff0c;话不多说&#xff0c;上干货。 web安全知识学习&#xff08;理论期&#xff09; 学习web安全基础知识、html语言、python、java、数据库等等。另外端口也可以学习一下3306、3389…

安全中级3:apache中间件漏洞

一、apache换行解析漏洞&#xff08;apache版本在2.4.0~2.4.29&#xff09; 1.原理 该程序是采用黑名单的形式&#xff0c;如果文件后缀名不在名单内即可上传&#xff0c;所以 a.php\x0A不在黑名单列表中&#xff0c;可以上传。但是在fpm-php中x0A是换行符&#xff0c;所以apa…

数据中台浅析(之二)

数据中台浅析 1. 引言 在当今的数字化时代&#xff0c;数据被誉为"新的石油"&#xff0c;越来越多的企业和组织开始深度挖掘数据的价值。在这个过程中&#xff0c;数据中台逐渐成为了数据管理和分析的核心架构&#xff0c;让我们来深入了解一下它。 1.1 数据中台…

数据结构基础-队列

队列 概述 计算机科学中&#xff0c;queue 是以顺序的方式维护的一组数据集合&#xff0c;在一端添加数据&#xff0c;从另一端移除数据。习惯来说&#xff0c;添加的一端称为尾&#xff0c;移除的一端称为头&#xff0c;就如同生活中的排队买商品 In computer science, a qu…

chatgpt赋能python:Python声音分析的应用

Python 声音分析的应用 Python是一种强大的编程语言&#xff0c;具有广泛的应用和使用场景&#xff0c;而其在声音分析领域中的应用也是相当广泛的。本文将会介绍Python在声音分析方面的应用。 什么是声音分析&#xff1f; 声音分析是指通过计算机技术对声音信号进行分析&am…

centos 7 安装部署MySQL主主模式

主机&#xff1a;192.168.1.108&#xff0c;192.168.1.109 192.168.1.108主机上操作 上传mysql安装包&#xff08;略&#xff09; tar zxf mysql.5.7.35.tar.gz –C /data mkdir /var/log/mariadb 使用root用户创建 chown –R unioncloud. /var/log/mariadb 使用root用户执行 切…

SCM Manager XSS漏洞复现(CVE-2023-33829)

一、漏洞描述 漏洞简述 SCM-Manager 是一款开源的版本库管理软件&#xff0c;同时支持 subversion、mercurial、git 的版本库管理。安装简单&#xff0c;功能较强&#xff0c;提供用户、用户组的权限管理 &#xff0c;有丰富的插件支持。由于在MIT的许可下是开源的&#xff0…

如何给证件照替换背景颜色?一键替换证件照背景色的方法

证件照换背景的优点 在申请各种证件时&#xff0c;一张合格的证件照是必不可少的。然而&#xff0c;在拍摄证件照时&#xff0c;往往因为背景、光线等问题导致照片质量不佳。因此&#xff0c;将证件照的背景更换为统一的纯色背景就显得尤为重要。 证件照换背景的主要优点包括…

合并文件解决HiveServer2内存溢出方案

一、文件过多导致HiveServer2内存溢出 1.1查看表文件个数 desc formatted yanyu.tmp• 表文件数量为6522102 1.2查看表文件信息 hadoop fs -ls warehouse/yanyu.db/tmp• 分区为string 类型的time字段&#xff0c;分了2001个区。 1.3.查看某个分区下的文件个数为10000个 …

Jmter压测试

1、常规性能测试--压测 1、添加线程组 线程数模拟用户数&#xff0c;线程数1表示1个用户&#xff0c;如果模拟10个用户就设置线程数为10 Ramp-Up表示在多长时间内开启多少个线程&#xff0c;如果设置为10&#xff0c;表示10s内开启对应的线程数 循环次数 永远表示如果不惦记…

Hibernate+Lombok进行表与表之间关系时插入数据时栈溢出

报错信息如下&#xff1a; 当使用Hibernate和Lombok处理表与表之间的关系时&#xff0c;在插入数据时可能会遇到栈溢出错误。这篇博客将详细讨论此问题的原因&#xff0c;并提供解决办法。 标题: HibernateLombok进行表与表之间关系时插入数据时栈溢出 问题背景 Hibernate是一…

如何在Windows 10中创建屏幕保护程序设置快捷方式

屏幕保护程序是指你在电脑上未处于活动状态并等待指定时间后,电脑屏幕上显示的动态图片或图案。 屏幕保护程序最初用于保护旧的单色显示器免受损坏,但现在它们主要是通过提供密码保护来个性化你的电脑或增强其安全性的一种方式。 一、右键单击或按住桌面上的空白区域,然后…

linuxOPS基础_linux umask

1、什么是umask umask表示创建文件时的默认权限&#xff08;即创建文件时不需要设置而天生的权限&#xff09; 例如&#xff1a; root用户下&#xff0c;touch a &#xff0c;文件a的默认权限是644 普通用户下&#xff0c;touch b &#xff0c;文件b的默认权限是664 644和…

AOSP+WSL+adb搭建安卓开发ebpf环境

0.写在前面 首先我们要明白&#xff0c;安卓的AOSP包含了海量的代码&#xff0c;他包含了包括了&#xff1a; 1.不同架构下&#xff08;音响&#xff0c;手机&#xff0c;电视等等各种基于安卓的设备&#xff09;的上层应用 2.Java API Framework&#xff08;大部分安卓开发…

叉积求二维空间两直线交点以及过两点的直线数学原理

叉积求二维空间两直线交点以及过两点的直线数学原理_wang.chen.xue的博客-CSDN博客

ThreeJS教程:屏幕坐标转标准设备坐标

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 屏幕坐标转标准设备坐标 在讲解下节课鼠标点击选中模型之前&#xff0c;先给大家讲解下坐标系的问题。 获取鼠标事件坐标 先来了解一些&#xff0c;普通的web前端相关知识。 鼠…

aop原理

1. 使用 1.1 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>1.2 定义切面类 定义一个切面类&#xff0c;指定增强的方法&#xff0c;方法前两个注解必须…

Axure教程—滚动加载(中继器 )

本文将教大家如何用AXURE中的中继器制作滚动加载效果 一、效果介绍 如图&#xff1a; 预览地址&#xff1a;https://awjggr.axshare.com 下载地址&#xff1a;https://download.csdn.net/download/weixin_43516258/87867798?spm1001.2014.3001.5503 二、功能介绍 向下滚动鼠…