ISP算法之黑电平BLC校正
黑电平形成原因
Sensor本身问题
CMOS Sensor本身的电路会存在暗电流(dark current),在没有光照条件下,感光器件等也会存在流动的电流,在光敏二极管器的伏安特性曲线中反向截止区电流并不为零(如下图)。导致在Sensor遮黑状态下光电转换输出的电压不是零,且这个暗电流与温度、电压稳定性、曝光时间(按行来计算)、模拟增益都有关系,且不同的位置暗电流一般是不同的。如果这个暗电流比较大,在拍摄正常图像的时候就会有色差。
曝光时间:非全局曝光的CMOS Sensor(卷帘曝光Rolling Shutter),曝光控制是以行为单位进行的(最小单位为行),在对1行进行曝光前,需将其reset(清0),然后等待一段时间(曝光时间,以行为单位),再读取这1行,读完这1行才算曝光完毕,在下一次reset之前,这些行处于自由曝光状态。因此曝光时间越长,暗电流积攒的越多。
模拟增益:在上述CMOS Sensor构造中,有一个AMP(amplifier),也就是放大器,这个放大器是用于控制模拟增益的,因此模拟增益越大,暗电流增益也会越大。
并且对于Bayer滤光片来说,四个通道(R、Gr、Gb、B)的这个暗电流值也有可能是不一样的。
AD转换过程添加的固定值
在CMOS Sensor中有一个ADC模数转换过程,目的是将光电感应的模拟电压转换为10/12/14位的数字信号(RAW10//RAW12/RAW14),而AD芯片都会有一个灵敏度,当电压低于这个阈值的时候无法进行AD转换,从而导致暗态细节损失。所以通常会在ADC模数转换之前添加一个稳定的参考电压REF,使整体信号值放大,有效保留了电压值很小的暗部细节,使得低于阈值部分的电压也能被转换。而这个固定的REF电压模数转换后是一个固定的偏移,对于Bayer图像的四个通道来说应该是一样的。因此这个值一般在ISP端减去固定值即可,一般厂家会给出,没给出就得自己标定了,且不一定准,因为由于暗电流引起的黑电平存在不好确定。
黑电平BLC校正
通常Sensor端的黑电平在Sensor端已经处理好了,例如下列OV5640手册给出的像素阵列。
在感光阵列中会有一片遮黑区域(光学暗区OB区域),这些区域镀的膜是不透光的,通过该区域可以统计出当前Bayer四个通道的暗电流值,遮黑区域与其他正常的像素区域经过相同的曝光时间和模拟增益后经过ADC后会有一个BLC数值,后续将正常像素区域的值减去遮黑区域的均值(分通道进行)合并为一路即可。如下OV5640手册中描述:
而在后续ISP中,只需要减去为了AD转换而认为添加的一个固定偏移即可(我自己使用的Mate30拍摄出来的DNG RAW图给出的这个值四个Bayer通道值都是256,是RAW12 RGGB格式的)。
当然也有的CMOS Sensor这些遮黑区域的值也是可以读出的,这就需要在ISP端同时对这两种黑电平进行处理,处理算法也可以自行设计。
其他的方法参考文末其他优秀的博客,这里 不过多解释。
MATLAB仿真
%raw_image:输入RAW
%Bayer_Pattern:RAW格式
%width:宽度
%height:高度
%BITS:RAW像素深度
%blacklevel:黑电平值
function raw_out = blc(raw_image, Bayer_Pattern, width, height, BITS, blacklevel)
raw_image = int32(raw_image); %涉及减法需要转为有符号数
raw_out = zeros(height,width);% raw_out = raw_image - blacklevel;for row = 1:heightfor col =1:widthpix_tmp = raw_image(row,col) - blacklevel; %对四个通道减去的固定值都相同if(pix_tmp<0)raw_out(row,col) = 0; %钳位为0elseraw_out(row,col) = pix_tmp;endend
endend
Verilog设计:
/*************************************************************************> File Name: isp_blc.v************************************************************************/
`timescale 1 ns / 1 ps/** ISP - Black Level Correction*/module isp_blc
#(parameter BITS = 8,parameter WIDTH = 1280,parameter HEIGHT = 960,parameter BAYER = 0 //0:RGGB 1:GRBG 2:GBRG 3:BGGR
)
(input pclk,input rst_n,input [BITS-1:0] black_r, //黑电平参数input [BITS-1:0] black_gr,input [BITS-1:0] black_gb,input [BITS-1:0] black_b,input in_href,input in_vsync,input [BITS-1:0] in_raw,output out_href,output out_vsync,output [BITS-1:0] out_raw
);reg odd_pix; //奇偶列判断always @ (posedge pclk or negedge rst_n) beginif (!rst_n)odd_pix <= 0;else if (!in_href)odd_pix <= 0;elseodd_pix <= ~odd_pix; endreg prev_href;always @ (posedge pclk or negedge rst_n) beginif (!rst_n) prev_href <= 0;elseprev_href <= in_href;end reg odd_line; //奇偶行判断always @ (posedge pclk or negedge rst_n) beginif (!rst_n) odd_line <= 0;else if (in_vsync)odd_line <= 0;else if (prev_href & (~in_href))odd_line <= ~odd_line;elseodd_line <= odd_line;endwire [1:0] format = BAYER[1:0] ^ {odd_line, odd_pix}; //pixel format 0:[R]GGB 1:R[G]GB 2:RG[G]B 3:RGG[B]reg [BITS-1:0] raw_now;assign out_raw = raw_now;always @ (posedge pclk or negedge rst_n) begin //该模块仅需一个时钟周期的延时if (!rst_n) raw_now <= 0;elseraw_now <= blc_sub(in_raw, format);end//该模块仅占用一个时钟周期,控制信号也打一拍对齐时序reg href_now, vsync_now;always @(posedge pclk) href_now <= in_href;always @(posedge pclk) vsync_now <= in_vsync;assign out_href = href_now;assign out_vsync = vsync_now;//该函数减去黑电平,且保证输出值不小于0(产生负数会回滚)function [BITS-1:0] blc_sub;input [BITS-1:0] value;input [1:0] format;//0:R 1:Gr 2:Gb 3:Bcase (format)2'b00: blc_sub = value > black_r ? value - black_r : {BITS{1'b0}}; 2'b01: blc_sub = value > black_gr ? value - black_gr : {BITS{1'b0}};2'b10: blc_sub = value > black_gb ? value - black_gb : {BITS{1'b0}};2'b11: blc_sub = value > black_b ? value - black_b : {BITS{1'b0}};default: blc_sub = {BITS{1'b0}};endcaseendfunction
endmodule
需要注意的是:
当Black Level值扣除过少时,整体图像画面灰蒙蒙的,整画面对比度没有那么高,画面偏亮偏粉。
当Black Level值扣除过多时,整体画面暗沉沉,动态范围变低细节损失多,黑色部分偏色无法通过白平衡纠正,画面偏绿(黑电平是加性参数,而白平衡增益是乘性参数)。
如有任何问题,欢迎大家批评指正!!!
参考
黑电平校正(BLC-Black Level Correction)-CSDN博客
ISP——BLC(Black Level Correction)_blc为什么在dpc之前-CSDN博客
ISP之黑电平矫正 - 知乎
相关文章:
ISP算法之黑电平BLC校正
黑电平形成原因 Sensor本身问题 CMOS Sensor本身的电路会存在暗电流(dark current),在没有光照条件下,感光器件等也会存在流动的电流,在光敏二极管器的伏安特性曲线中反向截止区电流并不为零(如下图)。导致在Sensor遮…...
《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(四)
《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(四) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《拉…...
【Python】利用函数模拟创建【栈】的数据结构操作
知识解读:来自:https://fishc.com.cn[#FwSB,M 9xKOA!^6fP)_EC(nsd什么是栈呢?Powered by https://fishc.com.cn3>A?5JXL#_}YBGD"FWdubKeyhQP栈是一种具有 FILO 特性的数据结构,即先放入的数据反而后取出。e&"%b…...
10 JVM内置锁
我们先想明白一个问题,什么是锁? 我们去给自己家锁门的时候,只有对应的一把钥匙能开锁。当用钥匙去开锁的时候,锁孔的内置型号会验证钥匙能不能对的上。能对上就能把锁打开,然后进到家里使用家里的资源。否则就在外面等…...
前端项目部署方法
ngnix服务器部署 下载nignx,我下的是windows版本的 下载链接:[https://nginx.org/en/download.html](https://nginx.org/en/download.html) 解压文件 如果原本的80端口号被占用了,可以改为其他的端口号 可以点击nginx.exe文件启动nginx,它可能…...
【1.排序】
排序 笔记记录 1.排序的基本概念1.1 排序的定义 2. 插入排序2.1 直接插入排序2.2 折半插入排序2.3 希尔排序 3. 交换排序3.1 冒泡排序3.2 快速排序 4. 选择排序4.1 简单选择排序4.2 堆排序 5. 归并排序、基数排序和计数排序5.1 归并排序4.2 基数排序4.3 计数排序 6. 各种内部排…...
visual studio添加滚动条预览
如何在vs中添加如图的滚动条呢? 打开VS 工具栏 选项 - 文本编辑器 - C/C - 滚动条 行为-使用缩略图 -- 确定...
[SAP ABAP] ALV状态栏GUI STATUS的快速创建
使用事务码SE38进入到指定程序,点击"显示对象列表"按钮 鼠标右键,选择"GUI状态" 弹出【创建状态】窗口,填写状态以及短文本描述以后,点击按钮 点击"调整模板",复制已有程序的状态栏 填…...
鸿蒙元服务项目实战:备忘录UI页面开发
前言 之前写过一篇关于元服务项目的上架流程,为了更好的了解及开发元服务,准备从0到1简单开发一个小项目,也希望能够帮助到刚刚介入到鸿蒙开发的同学,具体项目呢,也是十分的简单,就是一个小巧的备忘录项目&…...
【Java基础面试题022】什么是Java内部类?有什么作用?
回答重点 Java内部类是指:在一个类的内部定义的类,Java支持多种类型的内部类,包括成员内部类、局部内部类、匿名内部类和静态内部类。实际上内部类是一个编译层面的概念,像一个语法糖一样,经过编译器之后其实内部类会…...
量子芯片在新医疗领域的应用研究展望
一、引言 (一)研究背景 随着科技的不断发展,量子芯片在新医疗领域有望在多个技术方面实现创新突破,进而持续拓展其应用范围与深度。 在提高纠错能力方面,当前量子比特的易错性是制约量子芯片广泛应用的关键因素之一…...
不可重入锁与死锁
不可重入锁确实可能导致死锁,特别是在同一线程尝试多次获取同一把锁时。如果锁是不可重入的,那么线程在第二次尝试获取锁时会永远阻塞,从而导致死锁。 不可重入锁与死锁的关系 不可重入锁不允许同一个线程多次获取同一把锁。在以下情况下&am…...
Linux(Ubuntu)命令大全——已分类整理,学习、查看更加方便直观!(2024年最新编制)
Hello! 认真好学的小伙伴们,大家好呀(Respect~)!我是 H u a z z i Huazzi Huazzi,欢迎观看本篇博客,接下来让我们一起来学习 Ubuntu命令大全 吧!祝你有所收获! 文章目录 前言&#x…...
画一颗随机数
代码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>codePen - Random Tree</title> </head> <body><canvas></canvas><script>const canvas doc…...
机器人变换关系
rigid 刚性变换(平移、旋转): 只改变位置和方向,拥有6个自由度,保持变换物体的形状。 affine 仿射变换(平移、旋转、缩放、倾斜等): 改变物体形状、位置、方向,拥有12…...
2024年企业中生成式 AI 的现状报告
从试点到生产,企业 AI 格局正在被实时改写。我们对 600 名美国企业 IT 决策者进行了调查,以揭示新兴的赢家和输家。 从试点到生产 2024 年标志着生成性人工智能成为企业关键任务的一年。这些数字讲述了一个戏剧性的故事:今年人工智能支出飙升…...
共创共建!葡萄城 SpreadJS 完成 HarmonyOS NEXT 操作系统兼容认证
最新技术资源(建议收藏) https://www.grapecity.com.cn/resources/ 近日,华为“企业工作必备应用鸿蒙化论坛”在北京圆满落幕,论坛汇聚了众多行业精英和合作伙伴,聚焦讨论企业数字化转型与原生鸿蒙生态融合等话题。葡萄…...
webAPI clean architecture
文章目录 项目地址一、Restaurants.Domain 核心业务层1.1 Entities实体层1.2 Repositories 数据操作EF的接口二、Restaurants.Infrastructure 基础设施层2.1 Persistence 数据EF CORE配置2.2 Repositories 数据查询实现2.3 Extensions 服务注册三、Restaurants.Application用例…...
JS使用random随机数实现简单的四则算数验证
1.效果图 2.代码实现 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</ti…...
在Linux中使用`scp`进行远程目录文件复制
在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令。它允许在远程主机之间复制文件和目录,具有很强的安全性,是一种常用的文件传输工具。以下是如何使用…...
【C++游记】string的使用和模拟实现
枫の个人主页 你不能改变过去,但你可以改变未来 算法/C/数据结构/C Hello,这里是小枫。C语言与数据结构和算法初阶两个板块都更新完毕,我们继续来学习C的内容呀。C是接近底层有比较经典的语言,因此学习起来注定枯燥无味…...
解决Linux访问HuggingFace的问题(操作记录)
目录 一、软件下载 二、软件使用 1、启动软件 2、设置网络 3、注意事项 三、linux命令行访问 1、问题分析 2、设置命令行代理 一、软件下载 MrQiguan/cfw-linux 二、软件使用 1、启动软件 ./cfw 注:先选择节点,再开启Start with Linux&#…...
《向量数据库指南》——Milvus Cloud 2.5:Sparse-BM25引领全文检索新时代
Milvus Cloud BM25:重塑全文检索的未来 在最新的Milvus Cloud 2.5版本中,我们自豪地引入了“全新”的全文检索能力,这一创新不仅巩固了Milvus Cloud在向量数据库领域的领先地位,更为用户提供了前所未有的灵活性和效率。作为大禹智库的向量数据库高级研究员,以及《向量数据…...
verilog+systemVerilog写代码bug总结
前言 此文用来记录我在写verilog项目时遇到的bug,方便回顾,也供大家参考。 语言:verilog、systemverilog 平台:vivado 2021.01 bug记录和解决 如何让计数从0开始,而不是从1开始? 情景描述:我现在要实现…...
【Java基础面试题014】for循环与增强for的区别是什么?
回答重点 for for是一种传统的循环结构,允许开发者控制循环的初始值,终止条件和步进方式 主要特点: 灵活性:可以控制循环的初始值、终止条件和步进方式使用于数组:可以通过索引访问,使用索引进行反向遍…...
2412d,d的8月会议
原文 总结 替换D的逃逸分析 Rikki说,他一个月前曾与Dennis讨论过简化D的逃逸分析,但没有结果.在BeerConf上,他再次提起了它,Dennis说他一直在考虑它. Rikki也与Walter谈过这件事,Walter曾说过DIP1000并没有完全如期工作,且有点太复杂了. 因此,Rikki想讨论按D逃逸分析方法替…...
如何在Qt中应用html美化控件
在Qt中应用HTML美化控件,主要可以通过以下几种方式: 使用QWebEngineView:QWebEngineView是基于Chromium引擎的控件,用于显示和交互HTML内容。它支持现代Web标准和技术,如HTML5、CSS3和JavaScript。你可以通过以下步骤…...
vue3实现商城系统详情页(前端实现)
目录 写在前面 预览 实现 图片部分 详情部分 代码 源码地址 总结 写在前面 笔者不是上一个月毕业了么?找工作没找到,准备在家躺平两个月。正好整理一下当时的毕业设计,是一个商城系统。还是写篇文章记录下吧 预览 商品图片切换显示…...
[Pro Git#4] 标签 | 理解 | 创建 | push
目录 一、理解标签 二、创建标签 三、操作标签 一、理解标签 标签定义:在Git中,标签(tag)是对某次提交(commit)的一个标识,相当于起了一个别名。应用场景示例: 在项目发布某个版…...
在M系列芯片的Mac上使用Uniapp开发的依赖安装指南
在M系列芯片的Mac上使用Uniapp开发的依赖安装指南 在基于M系列芯片(例如M3、M4)的Mac上进行Uniapp开发时,使用esbuild和rollup等依赖包时需要注意处理不同架构的支持。具体问题出现在darwin-arm64(ARM架构)和darwin-x…...
delve调试环境搭建—golang
原文地址:delve调试环境搭建—golang – 无敌牛 欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等 由于平时不用 IDE 开发环境,习惯在 linux终端vim 环境下开发,所以找了golang的调试工具,delve类似gdb的调试界…...
暂停一下,给Next.js项目配置一下ESLint(Next+tailwind项目)
前提 之前开自己的GitHub项目,想着不是团队项目,偷懒没有配置eslint,后面发现还是不行。eslint的存在可以帮助我们规范代码格式,同时 ctrl s保存立即调整代码格式是真的很爽。 除此之外,团队使用eslint也是好处颇多…...
vscode 使用说明
文章目录 1、文档2、技巧显示与搜索宏定义和包含头文件 3、插件4、智能编写5、VSCode 与 C(1)安装(2)调试(a)使用 CMake 进行跨平台编译与调试(b)launch.json(cÿ…...
单片机:实现蜂鸣器数码管的显示(附带源码)
单片机实现蜂鸣器数码管显示 蜂鸣器和数码管在嵌入式系统中广泛应用。蜂鸣器可以发出声音警告或提示,而数码管则用于显示数字或字母。在本项目中,我们将通过8051单片机实现一个控制蜂鸣器和数码管显示的系统,结合使用蜂鸣器和数码管…...
Next.js v15-基于NextAuth进行身份验证
NextAuth.js 抽象化了管理会话、登录和注销以及身份验证的其他方面所涉及的大部分复杂性操作。虽然您可以手动实现这些功能,但该过程可能非常耗时且容易出错。NextAuth.js简化了流程,为 Next.js 应用程序中的身份验证提供了统一的解决方案。 步骤 通过…...
解锁Vue组件的奇妙世界
文章目录 一、Vue 组件概述(一)什么是 Vue 组件(二)Vue 组件的优点 二、Vue 组件的创建方式(一)全局注册(二)局部注册(三)单文件组件(SFC…...
二分查找【Lecode_HOT100】
文章目录 1.搜索插入位置No.352.搜索二维矩阵No.743.在排序数组中查找元素的第一个和最后一个位置No.344.搜索旋转排序数组No.335.寻找旋转排序数组中的最小值No.153 1.搜索插入位置No.35 class Solution {public int searchInsert(int[] nums, int target) {int l 0;int r n…...
解决git clone时报错“authentication failed for huggingface repository”
问题1: 已经获取了模型的授权,但是git clone时,弹出弹窗 输入huggingface的用户名和密码后,报错如下 解决方式1: 阅读红框标注的说明,“password authentication in git is no longer supported.”&#…...
力扣-图论-16【算法学习day.66】
前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非…...
【异常】GL-SFT1200路由器中继模式,TL-CPE1300D无法搜寻5G网问题分析
【异常】GL-SFT1200路由器中继模式,TL-CPE1300D无法搜寻5G网问题 情况实验结论情况 在用GL-SFT1200路由器切换中继模式时,由于web密码忘却,需要重置,但根据官网使用手册,或者对应的中文版手册,重置失败。通过跟商家联系,进行uboot刷机,提供了指导文档,尝试后刷机成功…...
LeetCode 热题 100_K 个一组翻转链表(31_25_困难_C++)(四指针法)
LeetCode 热题 100_K 个一组翻转链表(31_25) 题目描述:输入输出样例:题解:解题思路:思路一(四指针法): 代码实现代码实现(思路一(四指针法&#x…...
【LeetCode】35.搜索插入位置
目录 LeetCode35.搜索插入位置题解解题思路code1 暴力解法2 二分查找什么是二分查找?二分查找的原理二分查找图解二分查找的优缺点……更新中 LeetCode35.搜索插入位置题解 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如…...
拿到小米 Offer,却迷茫了。。
大家好,我是程序员鱼皮,12 月了,很多小伙伴也拿到了秋招的 Offer(没拿到也不要灰心),但即使拿到 Offer,可能还会有一些其他的顾虑。今天分享我们编程导航一位鱼友的提问,给大家作为学…...
redis集群 服务器更换ip,怎么办,怎么更换redis集群的ip
redis集群 服务器更换ip,怎么办,怎么更换redis集群的ip 1、安装redis三主三从集群2、正常状态的redis集群3、更改redis集群服务器的ip 重启服务器 集群会down4、更改redis集群服务器的ip 重启服务器 集群down的原因5、更改redis集群服务器的ip后…...
运行 Mongodb Server
如何使用 mongod 命令通过配置文件启动 MongoDB Server 适用于通过 Homebrew 安装的 MongoDB Server 如果您的 MongoDB Server 是通过 Homebrew 安装的,则安装过程中会自动创建必要的文件夹和配置文件(如 mongod.conf)。您可以直接使用以下…...
“年轻科技旗舰”爱玛A7 Plus正式发布,全国售价4999元
12月18日,备受行业瞩目的“A7上场 一路超神”爱玛旗舰新品发布会在爱玛台州智造工厂盛大举行。 作为年末“压轴产品”的“两轮豪华轿跑”爱玛A7Plus重磅上场,以“快、稳、帅、炫、智、爽”六大超神技惊艳四座,不仅践行了爱玛科技的精品战略&…...
深入探索 C++ 编程技巧:从案例中学习高效实践
深入探索 C 编程技巧:从案例中学习高效实践 C 是一门功能强大且灵活的编程语言,被广泛应用于系统开发、高性能计算、游戏引擎等领域。然而,初学者和有经验的开发者常常会在代码优化、设计模式和语言特性中面临挑战。这篇文章将通过实际案例&…...
鸿蒙操作系统简介
华为鸿蒙系统(HUAWEI HarmonyOS),是华为公司于2019年8月9日在东莞举行的华为开发者大会(HDC.2019)上正式发布的面向全场景的分布式操作系统,可以创造一个超级虚拟终端互联的世界,将人、设备、场…...
LabVIEW起落架震台检测
在现代飞机制造与维护过程中,起落架的性能测试是保障飞机安全的重要环节。通过LabVIEW开发的起落架小落震台检测系统,通过模拟飞机着陆过程,准确捕捉起落架在着陆时承受的各种动力学特性和应力响应,有效提升起落架设计的精度与可靠…...
git remote -v(--verbose)显示你的 Git 仓库配置的远程仓库的详细信息
git remote -v 是一个 Git 命令,用于显示你的 Git 仓库配置的远程仓库的详细信息。 当你执行 git remote -v 命令时,你会看到类似以下的输出: origin https://github.com/your-username/your-repo.git (fetch) origin https://github.com…...