ISP——你可以从这里起步(二)

接上一篇,上一篇是原理篇,这一篇是实战篇,为了实现下面框图中的不完美ISP。

 第一章 做一张RAW图自己用

不是所有的人都能获得raw图,即使获得了raw图也需要对应的sensor参数才能把它用起来,所以我找了一条野路子可以把任意一张.jpg、.bmp或.png图像做成raw图,这样就可以避免对设备的依赖。

ISP的pipeline正向使用可以把raw图解析成人眼适宜观看的rgb图像,把rgb图像沿着ISP的pipeline反着推导回去,也可以获得raw图,而且参数可调。

1.1. 挑选一张输入图像

我喜欢使用色卡,色卡图像没有复杂的线条,并且包含丰富的色块,所以pipeline的第一张测试图,我选择用色卡开始,fig.1是我挑选的测试图。

1.2. 模糊图像——锐化的反变换

采用高斯滤波,把fig.1模糊掉,效果如fig.2所示:

1.3. 加高斯噪声——降噪的反变换

挑选一个力度的高斯噪声,加到fig.2的图像上,得到的效果如fig.3所示:

1.4. 亮度调整——Gamma的反变换

 gamma系数选择2.2,得到的效果如fig.4所示:

1.5. RGB域转到XYZ域——CCM的反变换

这步可能会有争议,毕竟CCM和一些相机参数有关,但是我现在没有相机参数,而我手里有标准RGB域和XYZ域互转的3x3矩阵,所以我选择把CCM转到XYZ域,得到的效果如fig.5所示:

1.6. 设置k系数——白平衡的逆变换

得到的效果如fig.6所示:

1.7. 拆成bayer模式——demosaic的逆变换

把RGB图按照byaer模式抽点,得到的效果如fig.7所示,图片中分方块是分辨率的问题,显示的分辨率过大matlab会出现这样的情况,全屏就可以了。

 1.8. 加入椒盐噪声——坏点的反变换

加入椒盐噪声的效果如fig.8所示,图像中的块仍然是显示问题,全屏或者设置imshow函数的参数就能解决。

1.9. 加入偏置——black level的反变换

得到的效果如fig.9所示,这一步其实也可以忽略,因为原理很简单,且sensor参数会明确告知,省掉也不影响算法理解。

1.10. 保存图像

直接用save保存成.mat文件,不要用imwrite函数写成.bmp或者其他的格式的输出文件,因为.bmp格式的文件会压缩,压缩就意味着数据精度有一定的丢失,且用眼睛几乎看不出来,这样后面调试ISP的时候都不知道是在哪里丢失了精度。

具体代码可以参考input_to_raw.m

第二章 用做出来的RAW图调试ISP

有了raw图就可以进行ISP中每一步的调试了,现在要开始走正向的ISP了,先把刚才保存的.mat文件load进来。pipeline中的每个模块都写成了函数的形式,直接调用就可以,只是有些参数在函数里面,未使用传参统一管理。

2.1. Black Level

前面加了多少偏置还记得吧,减掉就可以了,得到的效果图如fig.10所示,块效应仍然是显示问题,全屏可以解决。

2.2. 坏点矫正

坏点矫正的原理见本专栏:坏点矫正,效果图如fig.11所示:

2.3. Demosaic

Demosaic的原理见本专栏:Demosaic,效果图如fig.12所示,边缘看起来似乎没有问题?这是因为这张色卡图的边缘很规整,测试不了复杂的边缘,所以调试一个ISP用一张图像就远远不够的,需要很多张图像。

2.4. 白平衡

白平衡的原理见本专栏:白平衡,效果图如fig.13所示,右下角的白色由fig.12中的偏粉色变成了白色,说明白平衡效果正常。

2.5. CCM

CCM的原理见本专栏:CCM和Gamma,效果图如fig.14所示,这个效果明显不正常,这说明即使我用的是标准的RGB和XYZ互转的矩阵,在加入了其他模块之后,也变不回原来的颜色了,需要用其他的方法做进一步的调整,或者可以考虑关闭input_to_raw.m里面的RGB转到XYZ域的功能。

2.6.  Gamma

Gamma的原理见本专栏:CCM和Gamma,效果图如fig.15所示,CCM不正确,Gamma很难正确。

2.7. Denoise

Denoise的原理见本专栏:Denoise,效果图如fig.16所示,denoise函数内化了双边、导向双边和NLM共3个降噪算法,通过mode控制,目前使用的是双边降噪。

2.8. Sharpen

Sharp的原理见本专栏:sharpen,效果图如fig.17所示:

2.9. 总结

一个完整的ISP pipeline流程已经走完了,运行代码中的isp_basic.m就可以看见文章中的效果,能直接看出来的两个问题是CCM和降噪做的不好,CCM需要标定,也可以借助专业的软件Imatest或者是其他的软件对色卡做色差计算。降噪的问题是力度不够,但是在YUV域做很大的降噪会损失细节,可以考虑在RAW域增加一个降噪和后面的YUV域降噪相互配合。

不管怎么说,已经拥有了一个ISP的雏形,且刚需模块都在里面了,能够做的工作也变多了,接下来就是一步一步完善它,给每个模块用上更复杂更有效的算法,或者是增加更高级的模块获得更好的效果。

如果需要matlab代码可以从这里提取:代码链接

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

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

相关文章

Istio分布式链路监控搭建:Jaeger与Zipkin

分布式追踪定义 分布式追踪是一种用来跟踪分布式系统中请求的方法,它可以帮助用户更好地理解、控制和优化分布式系统。分布式追踪中用到了两个概念:TraceID 和 SpanID。 TraceID 是一个全局唯一的 ID,用来标识一个请求的追踪信息。一个请求…

前端隐藏元素的方式有哪些?HTML 和 CSS 中隐藏元素的多种方法

当面试官突然问你:“前端隐藏元素的方式有哪些?”你还是只知道 display: none 吗? 其实,在前端开发的世界里,隐藏元素的方法非常多。每种方法都有自己的小技巧和使用场景,了解它们不仅能让你应对自如&…

【论文阅读】主动推理:作为感知行为的理论

文章目录 主动推理:作为感知行为的理论摘要1.引言2. 主动推理的概念和历史根源3. 主动推理的规范视角—以及它的发展历程 未完待续 主动推理:作为感知行为的理论 Active inference as a theory of sentient behavior 摘要 这篇文章综述了主动推理的历…

2411rust,异步函数

原文 Rust异步工作组很高兴地宣布,在实现在特征中使用异步 fn的目标方面取得了重大进度.将在下周发布稳定的Rust1.75版,会包括特征中支持impl Trait注解和async fn. 稳定化 自从RFC#1522在Rust1.26中稳定下来以来,Rust就允许用户按函数的返回类型(一般叫"RPIT")编…

【MySQL】MySQL数据库入门:构建你的数据基石

🍑个人主页:Jupiter. 🚀 所属专栏:MySQL初阶探索:构建数据库基础 欢迎大家点赞收藏评论😊 目录 🦅数据库基础🐀什么是数据库🐏主流数据库🦆MySQL数据库的基本…

linux企业中常用NFS、ftp服务

1.静态ip配置 修改ip地址为静态vim /etc/sysconfig/network-scripts/ifcfg-enxxx BOOTPROTO"static" IPADDR192.168.73.10 GATEWAY192.168.73.2 # 该配置与虚拟机网关一致 NETMASK255.255.255.0重启网卡:systemctl restart network.service ping不通域名…

6.584-Lab1:MapReduce

前置知识/概念 Raft 是一个基于“Leader”的协议,能够保证分布式网路的一致性。 RPC(Remote Producer Call) 参考链接1 参考链接2 Go中RPC的简单实现 Golang中regexp正则表达式的用法 https://gukaifeng.cn/posts/golang-zheng-ze-biao-…

抽象java入门1.5.3.1——类的进阶

前言:在研究神技代码Hello word的时候,发现了一个重大公式bug,在代码溯源中,我发现了一个奇怪的东西,就是OUT不是类中类(不是常规类的写法) 内容总结: 代码运行的顺序复习 正片开始…

人力资源招聘系统的革新之路:从传统到智能的转变

在全球化与数字化交织的今天,企业间的竞争日益激烈,而人才作为企业发展的核心驱动力,其重要性不言而喻。传统的人力资源招聘方式,如依赖纸质简历、人工筛选、面对面面试等,不仅效率低下,且难以精准匹配企业…

Bootstrap和jQuery开发案例

目录 1. Bootstrap和jQuery简介及优势2. Bootstrap布局与组件示例:创建一个响应式的表单界面 3. jQuery核心操作与事件处理示例:使用jQuery为表单添加交互 4. Python后端实现及案例代码案例 1:用户登录系统Flask后端代码前端代码 5. 设计模式…

使用python-Spark使用的场景案例具体代码分析

使用场景 1. 数据批处理 • 日志分析:互联网公司每天会产生海量的服务器日志,如访问日志、应用程序日志等。Spark可以高效地读取这些日志文件,对数据进行清洗(例如去除无效记录、解析日志格式)、转换(例如…

AXI DMA IP BUG踩坑记录

1. 问题描述 在突发的过程中总是一旦使用XAxiDma_SimpleTransfer函数就会出现AXI STREAM信号的READY信号先拉高4个数据(32位)的时钟后会迅速拉低,换句话说就是一旦PS端发起了XAxiDma_SimpleTransfer,AXI总线的READY信号就会拉高四个节拍,这样就会导致传输的数据出现问题。…

Vue2教程001:初识Vue

文章目录 1、初识Vue1.1、Vue2前言1.2、创建Vue实例1.3、插值表达式1.4 Vue响应式特性 1、初识Vue 1.1、Vue2前言 Vue是什么? 概念:Vue是一个用于构建用户界面的渐进式框架。 Vue的两种使用方式: Vue核心包开发 场景:局部模块…

【jvm】HotSpot中方法区的演进

目录 1. 说明2. JDK1.6及以前3. JDK1.74. JDK1.8及以后 1. 说明 1.在HotSpot虚拟机中,方法区(Method Area)的演进是一个重要的内存管理优化过程。2.从JDK1.6到JDK1.8,HotSpot虚拟机中的方法区经历了从永久代到元空间的重大变化。…

API 数据处理与 SQL 批量更新技巧:CASE 语句优化操作指南

前言 在现代应用程序开发中,数据处理和数据库操作是不可或缺的一部分。特别是在处理大量数据时,如何高效地更新数据库记录成为了关键问题。本文将对比两种常见的数据库更新方法:一种是使用 CASE 语句进行批量更新,另一种是通过循…

高级java每日一道面试题-2024年11月10日-框架篇[SpringBoot篇]-你对SpringBoot了解多少?

如果有遗漏,评论区告诉我进行补充 面试官: 你对SpringBoot了解多少? 我回答: 在Java高级面试中,SpringBoot是一个经常被提及的话题。以下是对SpringBoot的详细解析: SpringBoot概述 SpringBoot是Spring开源组织下的子项目,是Spring组件…

Linux dpkg命令详解

一、简介 dpkg 是基于 Debian 发行版 Linux 系统的低级包管理工具&#xff0c;可以手动安装、配置、移除 .deb 包&#xff0c;与 apt 命令不同的是&#xff0c;dpkg 不会自动处理包之间的依赖关系。 二、常用选项 安装包 sudo dpkg -i <package_name>.deb手动处理包依…

vscode vite+vue3项目启动调试

1、经常我们在普通的项目中&#xff0c;如果算法并不复杂&#xff0c;那么基本上console.log就可以搞定&#xff0c;当然也可以直接alert&#xff0c;打包的时候如果不去掉&#xff0c;还会在发版中上接弹出&#xff0c;给你个惊喜。 2、碰到了有些算法过程比较复杂的情况下&a…

如何给openshift 单节点集群配置hugepage

目前我有一台arm服务器, 是配置的单节点集群, 这个节点为是master, 也是worker. 理论上我应该用worker 标签给node 配置hugepage. 所以使用了以下方法: cat << EOF > hugepageconfig.yaml apiVersion: machineconfiguration.openshift.io/v1 kind: MachineCo…

Jdbc学习笔记(三)--PreparedStatement对象、sql攻击(安全问题)

目录 &#xff08;一&#xff09;使用PreparedStatement对象的原因&#xff1a; 使用Statement对象编写sql语句会遇到的问题 ​编辑 &#xff08;二&#xff09;sql攻击 1.什么是sql攻击 2.演示sql攻击 &#xff08;三&#xff09;防止SQL攻击 1.PreparedStatement是什么 …