See In The Dark之RAW图片读取-rawpy

2024-01-27 20:20
文章标签 读取 图片 dark raw see rawpy

本文主要是介绍See In The Dark之RAW图片读取-rawpy,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:处理不同相机的RAW格式图片,并放入卷积运算,输入到see in the dark模型进行夜间识别

1. 保存RAW图片为RGB的JPG格式

import rawpy
import imageio
import numpy as np# .ARW为索尼Sony相机RAW格式
# .CR2为佳能canon相机RAW格式
raw = rawpy.imread('IMG_0001.CR2')# use_camera_wb 是否执行自动白平衡,如果不执行白平衡,一般图像会偏色
# half_size 是否图像减半
# no_auto_bright 不自动调整亮度
# output_bps bit数据, 8或16
img = raw.postprocess(use_camera_wb=True, half_size=False, no_auto_bright=False, output_bps=16)# img = np.float32(img / (2**16-1)*255.0)
# img = np.asarray(img,np.uint8)imageio.imsave('take.jpg', img)

2. bayer阵列解析

拜耳阵列(Bayer pattern)分为GBRG、GRBG、BGGR、RGGB四种模式:
在这里插入图片描述
使用rawpy把不同模式下raw解析为四通道:

import rawpy
import numpy as np
from PIL import Image
import imageio
import exifreaddef gray_ps(rgb):return np.power(np.power(rgb[:, :, 0], 2.2) * 0.2973 + np.power(rgb[:, :, 1], 2.2) * 0.6274+ np.power(rgb[:, :, 2], 2.2) * 0.0753, 1 / 2.2) + 1e-7def do_HDR(x, curve_ratio):gray_scale = np.expand_dims(gray_ps(x), axis=-1)gray_scale_new = np.power(gray_scale, curve_ratio)return np.minimum(x * gray_scale_new / gray_scale, 1.0)def adjust_out_matrix(RAW_path, out=None):raw = open(RAW_path, 'rb')exif_info = exifread.process_file(raw, details=False, strict=True)orientation_str = 'EXIF Orientation'if exif_info.__contains__('Image Orientation'):orientation_str = 'Image Orientation'orientation_info = exif_info[orientation_str].printableif orientation_info == 'Rotated 180':if out is None:return Trueelse:if out.shape[2] == 3:out0 = out[:, :, :1]out1 = out[:, :, 1:2]out2 = out[:, :, 2:3]out = np.concatenate((out2, out1, out0), 2)elif out.shape[2] == 4:out0 = out[:, :, :1]out1 = out[:, :, 1:2]out2 = out[:, :, 2:3]out3 = out[:, :, 3:4]out = np.concatenate((out3, out2, out1, out0), 2)else:raisereturn np.flip(out)elif orientation_info == 'Horizontal (normal)':if out is None:return Falseelse:return outelse:raise# pack Bayer image to 4 channels
def pack_raw(raw_path, white_balance=True, auto_bright=True, HDR=True, save_JPEG=True):raw = rawpy.imread(raw_path)im = raw.raw_image_visible.astype(np.float32)# subtract the black level# 16383(2^14) is the camera's maximal pixel value, you can get it by "np.max(raw.raw_image)" . Ensure full exposure!im = np.maximum(im - raw.black_level_per_channel[0], 0) / (16383 - raw.black_level_per_channel[0])im = np.expand_dims(im, axis=2)H = im.shape[0]W = im.shape[1]if raw.raw_pattern[0, 0] == 0:  # RGGBout = 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)elif raw.raw_pattern[0, 0] == 2:  # BGGRout = np.concatenate((im[1:H:2, 1:W:2, :],im[0:H:2, 1:W:2, :],im[0:H:2, 0:W:2, :],im[1:H:2, 0:W:2, :]), axis=2)elif raw.raw_pattern[0, 0] == 1 and raw.raw_pattern[0, 1] == 0:  # GRBGout = np.concatenate((im[0:H:2, 1:W:2, :],im[0:H:2, 0:W:2, :],im[1:H:2, 0:W:2, :],im[1:H:2, 1:W:2, :]), axis=2)elif raw.raw_pattern[0, 0] == 1 and raw.raw_pattern[0, 1] == 2:  # GBRGout = np.concatenate((im[1:H:2, 0:W:2, :],im[0:H:2, 0:W:2, :],im[0:H:2, 1:W:2, :],im[1:H:2, 1:W:2, :]), axis=2)# 启用白平衡可以防止图片偏蓝或者偏红if white_balance:wb = np.array(raw.camera_whitebalance, np.float32)wb[3] = wb[1]wb = wb / wb[1]out = np.minimum(out * wb, 1.0)if auto_bright:mean_G = (out[:, :, 1].mean() + out[:, :, 3].mean()) / 2.0out = np.minimum(out*0.2/mean_G, 1.0)out = adjust_out_matrix(raw_path, out)# 检测RAW格式解析后的图片是否正常if save_JPEG:out0 = out[:, :, 0:1]out1 = out[:, :, 1:2]out2 = out[:, :, 2:3]out3 = out[:, :, 3:4]out_JPEG = np.concatenate((out0, (out1 + out3) / 2., out2), axis=2)if HDR:out_JPEG = do_HDR(out_JPEG, 0.35)Image.fromarray(np.uint8(out_JPEG * 255)).save('result.jpg')return outif __name__ == '__main__':raw = rawpy.imread('IMG_0001.CR2')np_channel = pack_raw('IMG_0001.CR2', auto_bright=False, HDR=False)img = raw.postprocess(use_camera_wb=True, half_size=False, no_auto_bright=True, output_bps=16)imageio.imsave('rawpy.jpg', img)

3. 苹果相机iphone 13 pro max 的RAW图片

	raw = rawpy.imread("IMG_0001.DNG")im = raw.raw_image_visible.astype(np.float32)  # (h, w, c) = (h, w, 4)# 手机竖直拍摄需要加上下面两行,横向拍摄不需要if vertical:out = np.swapaxes(im,1,0)		# (h w) axis change 20220808out = out[:,::-1,:]   			# Horizontal mirror 20220810

4. 小米12pro 的RAW图片

def pack_raw(raw):#pack Bayer image to 4 channelsim = raw.raw_image_visible.astype(np.float32)im = np.maximum(im - 63,0)/ (255 - 63) #subtract the black levelim = np.expand_dims(im,axis=2)img_shape = im.shapeH = 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)# 手机竖直拍摄需要加上下面两行,横向拍摄不需要if vertical:out = np.swapaxes(out,1,0)    # (h w) axis change 20220808out = out[:,::-1,:]           # Horizontal mirror 20220810print("pack_raw out.shape: ", out.shape)return outraw = rawpy.imread("IMG_0001.DNG")
im = raw.raw_image_visible.astype(np.float32)  # (h, w)
input_images = np.expand_dims(pack_raw(raw),axis=0)

这篇关于See In The Dark之RAW图片读取-rawpy的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/blog_xu/article/details/126368544
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/651376

相关文章

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

基于Python实现高效PPT转图片工具

《基于Python实现高效PPT转图片工具》在日常工作中,PPT是我们常用的演示工具,但有时候我们需要将PPT的内容提取为图片格式以便于展示或保存,所以本文将用Python实现PPT转PNG工具,希望... 目录1. 概述2. 功能使用2.1 安装依赖2.2 使用步骤2.3 代码实现2.4 GUI界面3.效

Python实现AVIF图片与其他图片格式间的批量转换

《Python实现AVIF图片与其他图片格式间的批量转换》这篇文章主要为大家详细介绍了如何使用Pillow库实现AVIF与其他格式的相互转换,即将AVIF转换为常见的格式,比如JPG或PNG,需要的小... 目录环境配置1.将单个 AVIF 图片转换为 JPG 和 PNG2.批量转换目录下所有 AVIF 图

详解如何通过Python批量转换图片为PDF

《详解如何通过Python批量转换图片为PDF》:本文主要介绍如何基于Python+Tkinter开发的图片批量转PDF工具,可以支持批量添加图片,拖拽等操作,感兴趣的小伙伴可以参考一下... 目录1. 概述2. 功能亮点2.1 主要功能2.2 界面设计3. 使用指南3.1 运行环境3.2 使用步骤4. 核

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("