ISP——BLC(Black Level Correction)
BL产生的原因
暗电流

暗电流(dark current),也称无照电流,指在没有光照射的状态下,在太阳电池、光敏二极管、光导电元件、光电管等的受光元件中流动的电流,一般由于载流子的扩散或者器件内部缺陷造成。目前常用的CMOS就是光电器件,所以也会有暗电流,导致光照为0的时候也有电压输出。

如图是二极管的伏安特性曲线,从图中可以看出在反向截止区域电流并不是完全为0,而我们的COMS内部其实也是PN结构成的,所以符合该特性,并且光电二极管是工作在反向电压下,所以无光照是的这个微小电流就是暗电流。

AD前添加一个固定值

1.sensor到ISP会有一个AD转换的过程,而AD芯片都会有一个灵敏度,当电压低于这个阈值的时候无法进行AD转换,所以就人为添加一个常量使得原本低于阈值的这部分值也能被AD转换;

2.因为人眼对暗部细节更加敏感,而对高亮区没那么敏感,所以就增加一个常量牺牲人眼不敏感的亮区来保留更大暗区细节。

以上两点的意思就是将AB提升到A’B’,使得这个区间的值都能完成AD转换,而且这段区域能更好的保留暗区,也就是人眼敏感的部分,牺牲BC部分,因为这部分信息是人眼不敏感的,这样就更符合人眼的需求。

BLC校正

BL的校正现在一般会分为sensor端和ISP端两部分,但是我们专栏重点讨论ISP PIPELINE里的算法,所以sensor中的算法不重点讨论。
SENSOR端

如图这个是某一sensor像素阵列的分布,这个sensor最大出图分辨率为3280*2464,也就有效像素区。然后下面灰色部分还有个有效OPB区,这个区域就是sensor就行OB区域。这两个部分最大的区别在于,有效像素区是可以正常曝光的,而OB区在工艺上让它不能接受光子,最简单的想法就是在感光表明涂一层黑色的不感光物质,这样就能通过OB区无光照是的值来校正有效像素去的值。最简单的操作就是对OB去的像素值去平均,然后每个像素值减去这个值完成校正。当然现在sensor也会有些些高端的校正算法。

如图中思特威和比亚迪就提出了两种更加高级的算法,正如刚才所说,sensor端的处理不是本专栏的重点,所以不进行重点说明,有兴趣的可以自行研究,需要资料的可以留言。

ISP端

ISP端的算法都是通过一副黑帧RAW图,然后对RAW图进行操作。下面都是以8位的进行说明。

扣除固定值法

扣除固定值法就是每个通道扣除一个固定值,就如上图,将A’b’平移到AB就行。

具体的做法如下:

1.采集黑帧RAW图,将其分为Gr,Gb,R,B四个通道;

2.对四个通道求平均值(有的算法也用中位值或者别的方式);

3.后续图像每个通道都减去2中计算出的各个通道的校正值;

4.对Gr和Gb通道进行归一化,就是A’b’平移到AB后最大值就是B点的纵坐标,但是我们需要把这个值恢复到255使得恢复后的像素值范围依旧是0-255;

通过上述公式就可以完成校正。然后需要注意的是RB通道不用归一化到0-255区间,因为后续AWB中会通过gain将其范围提升到0-255,这个后续再AWB算法中再讨论。

目前这种方式用的比较多,比如我接触的海思和Sonix都是用这种简单粗暴的方法,因为上面也说过Sensor端自己会有一个BL处理,所以后端通过这种简单的方式也能完成校正。

ISO联动法

因为暗电流这些会和gain值还有温度等相关,所以通过联动的方式确定每个条件下的校正值。然后后面先通过参数查得相应的校正值进行校正。

具体做法如下:

1.初始化一个ISO值(其实就是AG和DG的组合),然后重复固定值中的做法,采集黑帧,标定出各个通道的校正值;
    2.在初始化ISO的基础通过等差或者等比数列的方式增长ISO,然后重复1步骤求取各个通道的校正值;
    3.将这个二维数据做成一个LUT,后续图像通过ISO值查找相应的校正值进行校正。不在LUT中的ISO值的参数可以通过插值的方式求得。

曲线拟合法

上面两个方法校正出来的每个通道的校正值是个固定值,但是我们知道,实际在像素不同位置黑帧的数据是不一样的,所以更准确的方式就是每个点都求出一个校正值对该点进行校正。但是现在一般像素值都很高,不可能把每个点的值都存下来,这样内存需求太大,所以就同过采样的方式。就是在黑帧中选择一些像素点求出该点的校正值,然后把坐标和校正值存在一个LUT中,后续其他的像素点的校正值就可一个通过坐标和这个LUT进性插值求得校正值,从而实现每个点的精准校正。

如图这篇专利中就是建立了AG的LUT,曝光时间的LUT,然后坐标的LUT,相当于在ISO联动方式的基础加上了坐标位置信息,实现了每个点的精准校正。

校正总结

如图是数据流程图,可以看出sensor端可以进行模拟处理和数字处理,而ISP端智能进行数字处理,因为ISP接受的信号是经过AD转换后的数字信号,所以在sensor端处理就可以有更加精细,如上面比亚迪的专利中提到的,sensor端粗条可以通过模拟信号来处理,然后细调再通过数字处理的方式来处理。所以综上分析一般ISP端可以通过比较简单的校正来完成,这样可以节省硬件资源。这也就是大多是ISP芯片用的处理方式都很简单的原因。

具体实现

%% --------------------------------
%% author:wtzhu
%% date: 20210629
%% fuction: main file of BLC
%% --------------------------------
clc;clear;close all;% ------------Raw Format----------------
filePath = 'images/HisiRAW_4208x3120_8bits_RGGB.raw';
bayerFormat = 'RGGB';
row = 4208;
col = 3120;
bits = 8;
% --------------------------------------%  I(1:2:end, 1:2:end) = R(1:1:end, 1:1:end);data = readRaw(filePath, bits, row, col);
% get the four channels by bayerFormat
switch bayerFormatcase 'RGGB'disp('bayerFormat: RGGB');R = data(1:2:end, 1:2:end);Gr = data(1:2:end, 2:2:end);Gb = data(2:2:end, 1:2:end);B = data(2:2:end, 2:2:end);case 'GRBG'disp('bayerFormat: GRBG');Gr = data(1:2:end, 1:2:end);R = data(1:2:end, 2:2:end);B = data(2:2:end, 1:2:end);Gb = data(2:2:end, 2:2:end);case 'GBRG'disp('bayerFormat: GBRG');Gb = data(1:2:end, 1:2:end);B = data(1:2:end, 2:2:end);R = data(2:2:end, 1:2:end);Gr = data(2:2:end, 2:2:end);case 'BGGR'disp('bayerFormat: BGGR');B = data(1:2:end, 1:2:end);Gb = data(1:2:end, 2:2:end);Gr = data(2:2:end, 1:2:end);R = data(2:2:end, 2:2:end);
end
% calculate the Correction coefficient of every channel
R_mean = round(mean(mean(R)));
Gr_mean = round(mean(mean(Gr)));
Gb_mean = round(mean(mean(Gb)));
B_mean = round(mean(mean(B)));% Correct each channel separately
cR = R-R_mean;
cGr = Gr-Gr_mean;
cGb = Gb-Gb_mean;
cB = B-B_mean;
fprintf('R:%d Gr:%d Gb:%d B:%d\n', R_mean, Gr_mean, Gb_mean, B_mean);cData = zeros(size(data));
% Restore the image with four channels
switch bayerFormatcase 'RGGB'disp('bayerFormat: RGGB');cData(1:2:end, 1:2:end) = cR(1:1:end, 1:1:end);cData(1:2:end, 2:2:end) = cGr(1:1:end, 1:1:end);cData(2:2:end, 1:2:end) = cGb(1:1:end, 1:1:end);cData(2:2:end, 2:2:end) = cB(1:1:end, 1:1:end);case 'GRBG'disp('bayerFormat: GRBG');cData(1:2:end, 1:2:end) = cGr(1:1:end, 1:1:end);datacData(1:2:end, 2:2:end) = cR(1:1:end, 1:1:end);cData(2:2:end, 1:2:end) = cB(1:1:end, 1:1:end);data(2:2:end, 2:2:end) = cGb(1:1:end, 1:1:end);case 'GBRG'disp('bayerFormat: GBRG');cData(1:2:end, 1:2:end) = cGb(1:1:end, 1:1:end);cData(1:2:end, 2:2:end) = cB(1:1:end, 1:1:end);cData(2:2:end, 1:2:end) = cR(1:1:end, 1:1:end);cData(2:2:end, 2:2:end) = cGr(1:1:end, 1:1:end);case 'BGGR'disp('bayerFormat: BGGR');cData(1:2:end, 1:2:end) = cB(1:1:end, 1:1:end);cData(1:2:end, 2:2:end) = cGb(1:1:end, 1:1:end);cData(2:2:end, 1:2:end) = cGr(1:1:end, 1:1:end);cData(2:2:end, 2:2:end) = cR(1:1:end, 1:1:end);
end
show(data, cData, bits, Gr_mean);

readRaw.m:

function rawData = readRaw(fileName, bitsNum, row, col)
% readRaw.m    get rawData from HiRawImage
%   Input:
%       fileName    the path of HiRawImage
%       bitsNum      the number of bits of raw image
%       row         the row of the raw image
%       col         the column of the raw image
%   Output:
%       rawData     the matrix of raw image data
%   Instructions:
%       author:     wtzhu
%       e-mail:     wtzhu_13@163.com
% Last Modified by wtzhu v1.0 2021-06-29
% Note: % get fileID
fin = fopen(fileName, 'r');
% format precision
switch bitsNumcase 8disp('bits: 8');format = sprintf('uint8=>uint8');case 10disp('bits: 10');format = sprintf('uint16=>uint16');case 12disp('bits: 12');format = sprintf('uint16=>uint16');case 16disp('bits: 16');format = sprintf('uint16=>uint16');
end
I = fread(fin, row*col, format);
% plot(I, '.');
z = reshape(I, row, col);
z = z';
rawData = z;
% imshow(z);
end

矫正效果:

————————————————
版权声明:本文为CSDN博主「wtzhu_13」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wtzhu_13/article/details/118460646

ISP——BLC(Black Level Correction)相关推荐

  1. 黑电平校正(BLC-Black Level Correction)

    黑电平产生的原因 Sensor的电路本身会存在暗电流. 暗电流(dark current),也称无照电流,指在没有光照射的状态下,在太阳电池.光敏二极管.光导电元件.光电管等的受光元件中流动的电流,一 ...

  2. ISP-BLC(Black Level Correction)

    ISP-BLC(Black Level Correction) 1. BL 的定义 BL 一般翻译为黑电平.实际AD芯片的精度不足以将电压值很小的一部分转换出来,芯片厂会刻意添加一个固定的偏移量ped ...

  3. ISP——LSC(Lens Shading Correction)

    ISP--LSC(Lens Shading Correction) 现象 如图所示就是拍摄纯灰色卡(正常所有像素值一样)时shading的具体现象,上侧称为Luma shading,下侧称为color ...

  4. ISP——黑电平矫正(Black Level correction, BLC)

    文章目录 一.产生原因 二.矫正方法 1.减去固定值法 2.ISO联动法 3.曲线拟合法 一.产生原因 1.暗电流:暗电流是目标物体无光照的条件下观测到的电流.意味着无光照情况下产生电压,不是纯黑. ...

  5. ISP BLC(BlackLevel Correction) -ISP端 BLC 黑电平矫正的学习理解

    个人理解:BLC(BlackLevel Correction)简单来说就是对全黑状态下对各通道不为0值的矫正(全黑状态下各通道值应该为0) 那么,要了解Black Leve Correction,首先 ...

  6. ISP--Black Level Correction(黑电平矫正)

    在上一篇文章中,我们已经知道了Sensor的构造,Sensor的成像原理.但是从光信号转换为图像,其中还有许多的工作,OBC就是其中之一. 在之前的文章中,我们已经知道了,每一个像素点都是由一个光电二 ...

  7. 【camera】【ISP】Lens Shading Correction镜头阴影校正

    ISP-LSC 镜头阴影校正 参考: https://zhuanlan.zhihu.com/p/389334269 https://blog.csdn.net/xiaoyouck/article/de ...

  8. ISP——DPC(Defective Pixel Correction)

    现象 造成坏点的原因 感光元件芯片自身工艺技术瑕疵造成: 光线采集存在缺陷: 制造商产品差异: 坏点分类 hot pixel: 固定保持较高的像素值,一般呈现为画面高亮的点: dead pixel: ...

  9. 手机影像ISP流程:BLC

    目录 BLC简介 黑电平校正的原因 黑电平校正的代码 黑电平校正对图像的影响 BLC简介 BLC(Black Level Correction),即黑电平校正. 首先我们先介绍一下黑电平(Black ...

最新文章

  1. 爬虫架构师得逆袭之路
  2. OC类导入Swift工程演示
  3. leetcode 721. 账户合并(并查集)
  4. 10. HTML基本标签
  5. 中国历史上影响最大的10首诗
  6. MySQL面试题1:MySQL架构体系相关
  7. Atitit.论图片类型 垃圾文件的识别与清理  流程与设计原则 与api概要设计 v2 pbj
  8. 埃及金字塔之谜最完美的解释
  9. 小工具-悬浮窗LogViewer在android手机上查看数据日志
  10. 数据分析中的概率分析经验总结:正态分布随机数置信水平
  11. 软件工程改错题例题:请将下面的非结构化程序改成结构化程序
  12. DeepStream 配置文件解析
  13. 转自于四火的唠叨(工程师的生活)
  14. python 蒙特卡罗法求π值
  15. 【Unity步步升】各类旋转逻辑的区别,如欧拉旋转、插值旋转、矢量朝向等...及游戏视角案例
  16. shing boot 做session共享 redis
  17. c语言设计生命游戏,C语言实现生命游戏.doc
  18. Tomcat 解决Several ports (8005, 8080, 8009) required的方法:
  19. javascript之jQuery:一个轻松编写js的库
  20. SimpleWayPointSystem的简单使用

热门文章

  1. 上海2017QCon个人分享总结
  2. 【观察】“凌动数据管理”方案应运而生,联想凌拓本地化提速以行践言
  3. In the last ten years (Superman?)
  4. redhat 9.0 制作openssh rpm包(9.0p1/9.1/9.2/9.3 p1) —— 筑梦之路
  5. fb50 sap 报记账码未定义_【FICO系列】SAP 关于SAP中的记账码的解释
  6. 隐终端效应和暴露终端效应
  7. Excel多个sheet页合并至一个sheet页
  8. keepalived原理 mysql_高可用实现KeepAlived原理简介
  9. Java pdf转jpg报错
  10. python中符号计算三维可视化_Python科学计算三维可视化章节答案