当前位置: 首页 > news >正文

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代码可以从这里提取:代码链接

相关文章:

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

接上一篇,上一篇是原理篇,这一篇是实战篇,为了实现下面框图中的不完美ISP。 第一章 做一张RAW图自己用 不是所有的人都能获得raw图,即使获得了raw图也需要对应的sensor参数才能把它用起来,所以我找了一条野路子可以把…...

Qt / Qt Quick程序打包的一些坑 (四)

【写在前面】 打包方法见 Qt / Qt Quick程序打包的方法。 这里是再次记录一些坑。 【正文开始】 直接进入正题: 在 Qt5 中,如果我们的 Qml 中使用了【Qt Shapes】模块,那么在打包的时候,会缺少Qt5QuickShapes.dll。 然后&#xff…...

《传统视觉算法在视觉算法中的地位及应用场景

一、引言 在计算机视觉领域的发展历程中,传统视觉算法扮演了至关重要的角色。尽管近年来深度学习算法在视觉任务中取得了巨大的成功,但传统视觉算法依然具有不可替代的地位。传统视觉算法通常基于数学模型和手工设计的特征,具有计算效率高、…...

老老实实干一辈子程序员是没出息的!这本证书你早该学!

一、程序员有没有必要学软考? 当然有,因为你不可能一辈子都是程序员。 你了解或者接触过30岁、35岁以上的程序员去向吗? 我毕业快十年了,当初正赶上互联网时代的浪潮,好几个学计算机的同学毕业后去了一线城市或者深…...

鸿蒙next版开发:相机开发-录像(ArkTS)

在HarmonyOS 5.0中,ArkTS提供了一套完整的API来管理相机功能,特别是录像功能。本文将详细介绍如何在ArkTS中实现录像功能,并提供代码示例进行详细解读。 录像功能开发步骤 1. 导入相关接口 首先,需要导入相机相关的接口&#x…...

闯关leetcode——3206. Alternating Groups I

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/alternating-groups-i/description/ 内容 There is a circle of red and blue tiles. You are given an array of integers colors. The color of tile i is represented by colors[i]: colors[i…...

多个摄像机画面融合:找到同一个目标在多个画面中的伪三维坐标,找出这几个摄像头间的转换矩阵

搞算法,重要的是解决问题的思想,不要再局限于语言、框架、性能!!! 要解决的问题是:在某一个摄像头画面中,目标会被遮挡或者丢失,但在另外一个摄像机画面中,目标完整&…...

Three.js性能优化和实践建议

Three.js 是一个功能强大的 3D 引擎,当场景足够大的时候,就会出现卡顿的现象,首先要保证电脑的性能够用,然后看看下面方法,帮助你提高应用的运行效率。 1. 使用 stats.js 监视性能 在进行任何优化之前,首…...

C#入门 023 什么是类(Class)

什么是“类” 是一种数据结构 是一种数据类型 代表现实世界中的“种类” 构造器和析构器 析构器 析构器(Destructor)是一种特殊的成员方法,用于在对象被垃圾回收器(Garbage Collector, GC)回收之前执行清理操作。…...

一篇Spring Boot 笔记

一、Spring Boot 简介 Spring Boot 是一个用于创建独立的、基于 Spring 的生产级应用程序的框架。它简化了 Spring 应用的初始搭建和开发过程,通过自动配置等功能,让开发者能够快速地构建应用,减少了大量的样板代码和复杂的配置。 二、核心特…...

一生一芯 预学习阶段 NEMU代码学习(2)

接上回&#xff1a;一生一芯 预学习阶段 NEMU代码学习&#xff08;1&#xff09; 上次说到这里 static int cmd_c(char *args) {cpu_exec(-1);return 0; } 当输入c时&#xff0c;会执行&#xff1a;cpu_exec(-1); void cpu_exec(uint64_t n) {g_print_step (n < MAX_IN…...

《手写Spring渐进式源码实践》实践笔记(第二十章 实现简单ORM框架)

文章目录 第二十章 简单ORM框架实现背景技术背景基本概念工作原理优点缺点常见的ORM框架 业务背景 目标设计实现代码结构类图实现步骤 测试事先准备属性配置文件测试用例(selectOne)测试结果测试用例(selectList)测试结果 总结 第二十章 简单ORM框架实现 背景 技术背景 ORM&…...

AI技术赋能电商行业:创新应用与未来展望

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《热点时事》 期待您的关注 引言 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;技术正逐步渗透到各行各业&a…...

windows 11编译安装ffmpeg(包含ffplay)

一、源码及安装包下载 1.1&#xff0c;ffmpeg源码包下载 下载地址&#xff1a;Download FFmpeg 1.2&#xff0c;mysys下载 下载地址&#xff1a;MSYS2 1.3&#xff0c;libx264源码包下载 下载地址&#xff1a;x264, the best H.264/AVC encoder - VideoLAN 二、软件安装 2.1&…...

系统启动时将自动加载环境变量,并后台启动 MinIO、Nacos 和 Redis 服务

服务器信息 服务器 IP&#xff1a;192.168.1.44服务器用户&#xff1a;changzhou用户密码&#xff1a;XXXXXXXX Nacos 数据库用户信息&#xff1a; 账号&#xff1a;cz_nacos密码&#xff1a;XXXXXXXX Nacos 内网地址&#xff1a;http://192.168.1.44:8848/nacos 账号&#x…...

[ACTF2020 新生赛]Upload 1--详细解析

信息收集 题目告诉我们是一道upload&#xff0c;也就是文件上传漏洞题目。 进入界面&#xff0c;是一个灯泡&#xff0c;将鼠标放在图标上就会出现文件上传的相应位置&#xff1a; 思路 文件上传漏洞&#xff0c;先看看有没有前端校验。 在js源码中找到了前端校验&#xff…...

power bi中的related函数解析

在Power BI中&#xff0c;RELATED函数是一种用于检索相关表中数据的函数。它用于在一个表中检索与当前行相关联的另一个表中的数据。 销售成本 [销售数量]*related(商品表[进价])...

目前区块链服务商备案支持的区块链技术类型

status"success"data1-name"比特币/Bitcoin/BTC"3-name"以太坊/Ethereum/ETH"875-name"超级账本/Hyperledger"5-name"柚子/EOS/EOS"6-name"恒星链/Stellar/XLM"1055-name"Quorum"7-name"莱特币/Li…...

CatBoost中的预测偏移和排序提升

在 CatBoost 中&#xff0c;预测偏移&#xff08;Prediction Shift&#xff09; 和 排序提升&#xff08;Ordered Boosting&#xff09; 是其关键概念和创新点。CatBoost 通过引入 排序提升 解决了梯度提升决策树&#xff08;GBDT&#xff09;算法中常见的 预测偏移问题&#x…...

python: postgreSQL using psycopg2 or psycopg

psycopg2 # encoding: utf-8 # 版权所有 2024 ©涂聚文有限公司 # 許可資訊查看&#xff1a;言語成了邀功的功臣&#xff0c;還需要行爲每日來值班嗎&#xff1f; # 描述&#xff1a; pip install --upgrade pip PostgreSQL database adapter for Python # pip install…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...