黑电平校正原理及长曝光校正方案浅析
黑电平产生的原因
传感器受到材质、热量和外部干扰等因素的影响,即使没有光照射,像素单元也会产生电荷,形成暗电流。暗电流很难与光照产生的电荷区分开来。
黑电平是指图像数据为“0”时对应的信号电平。由于暗电流的影响,传感器实际输出的原始数据并不是我们想要的黑平衡(数据不为“0”)。
黑电平校正原理
为了减少暗电流对图像信号的影响,可以采用一种有效的方法,即从已获得的图像信号中减去参考暗电流信号。通常情况下,在传感器中,实际像素比有效像素多,像素区的前几行被用作不感光区(实际上,这部分区域也使用了RGB的彩色滤波器),用于自动黑电平校正。校正值的平均值被用作参考值,然后下面区域的像素都减去这个校正值,从而实现黑电平校正。
没有进行黑电平校正的图像通常整体或局部会偏紫色(品红),过度校正的图像整体或局部会偏绿色。黑电平校正的缺失也会影响图像的对比度。
关于黑电平(Black Level)的概念
Black Level Subtraction(BLS)黑电平减法
Black Level Clamping(BLC)黑电平箝位
Linearization(LZ)线性化
Off Bit(OB)在数字电子系统中,通常使用二进制编码来表示数据,其中"1"表示高电平或开启状态,而"0"表示低电平或关闭状态。因此,当电信号处于低电平时,人们也称之为"OB"或"黑电平"。
以上概念所代表的含义和处理流程不完全相同,一般提到时都属于黑电平校正的概念和范畴。
黑电平校正方法
以高通平台为例,在ISP流程中,sensor output后,进行黑电平校正,工具根据导入的raw图,分别将R,Gr,Gb,B 四个通道减去计算出的校正值(4个通道的校正值可能略有不同,总体比较接近),然后再进行AWB校正。
通常,经过这样的校正后,会得到比较理想的效果。如图:
在特定条件下,以上方案存在缺陷。例如:
1) 当需要较大的gain值(如512x gain以上)时,A gain和D gain不能满足,需要叠加ISP gain,高gain区间校正值敏感度过高,可调性变差,很难平衡正常光和全黑环境的效果。
如图,正常光效果趋于平衡,但全黑偏紫;此时如果再增加扣除黑电平强度,全黑效果会更好,但正常光环境暗区会偏绿。
2) 当需要长曝光时,此时由于长曝光期间由暗电流累积引起的暗电压(OB)上升没有被OB箝位补偿,并且OB没有被足够地扣除,导致整体偏紫,品红色浮动。
长曝光方案浅析
上面我们简析了高通平台黑电平校正的机制,即在AWB校正前,先进行黑电平的校正,将R,Gr,Gb,B 四个通道减去校正值。这样的方案不能满足长曝光时黑电平的校正需求。我们不妨再来分析一下信号处理流程。
通过流程的组合和拆解可以看出,在WB校正的前或后,可以获取动态的OB钳制值,将其写入处理的流程中,这样即便是长曝光,既可以保留部分暗信号,理论上又可以实现正常的颜色和白平衡效果。
动态调整方案的实现
在开篇的时候我们提到,黑电平校正使用到了非有效像素的区域,即Optical Black,我们将这个控制分成3个步骤:
任务(1):计算传感器Optical Black区域(8行)中R、Gr、Gb和B的平均值
1) 获取图像数据:从传感器读取原始图像数据(RAW数据)。
2) 定义OB区域:确定传感器图像中光学黑区域的位置和大小。通常,光学黑区域位于图像的顶部或底部。例如,假设OB区域是图像顶部的8行。
3) 提取OB区域数据:从图像数据中提取前8行的OB区域数据。
4) 分离颜色通道:根据Bayer阵列将OB区域的数据按颜色通道(R、Gr、Gb、B)分离。Bayer阵列中颜色通道排列如下:
R Gr
Gb B
每4个像素组成一个Bayer单元,依次提取每个颜色通道的数据。
5) 计算平均值:分别计算R、Gr、Gb和B通道的平均值。
python代码示例:
import numpy as np
def calculate_ob_averages(image, ob_lines=8):
ob_region = image[:ob_lines, :] # 提取前8行的OB区域
height, width = ob_region.shape
# 分离颜色通道
R_channel = ob_region[0:height:2, 0:width:2]
Gr_channel = ob_region[0:height:2, 1:width:2]
Gb_channel = ob_region[1:height:2, 0:width:2]
B_channel = ob_region[1:height:2, 1:width:2]
# 计算各通道的平均值
R_avg = np.mean(R_channel)
Gr_avg = np.mean(Gr_channel)
Gb_avg = np.mean(Gb_channel)
B_avg = np.mean(B_channel)
return R_avg, Gr_avg, Gb_avg, B_avg
# 示例用法
# 假设 raw_image 是从传感器获取的RAW图像数据
# R_avg, Gr_avg, Gb_avg, B_avg = calculate_ob_averages(raw_image)
任务(2):为(1)中的值计算多个帧的平均值(例如,32帧、LiveView、Movie only)
1) 初始化存储器:创建一个存储器来保存每个帧的OB平均值。
2) 累积帧数据:循环处理每一帧,计算并存储每一帧的OB平均值。
3) 计算多帧平均值:在累积了一定数量(例如32帧)的数据后,计算每个通道的多帧平均值。
python代码示例:
def calculate_multi_frame_averages(frames, num_frames=32):
R_avgs = []
Gr_avgs = []
Gb_avgs = []
B_avgs = []
for frame in frames[:num_frames]:
R_avg, Gr_avg, Gb_avg, B_avg = calculate_ob_averages(frame)
R_avgs.append(R_avg)
Gr_avgs.append(Gr_avg)
Gb_avgs.append(Gb_avg)
B_avgs.append(B_avg)
# 计算多个帧的平均值
R_multi_avg = np.mean(R_avgs)
Gr_multi_avg = np.mean(Gr_avgs)
Gb_multi_avg = np.mean(Gb_avgs)
B_multi_avg = np.mean(B_avgs)
return R_multi_avg, Gr_multi_avg, Gb_multi_avg, B_multi_avg
# 示例用法
# 假设 frames是一个包含32帧RAW图像数据的列表
#R_multi_avg,Gr_multi_avg,Gb_multi_avg,B_multi_avg=calculate_multi_frame_averages(frames)
任务(3):实时校正传感器钳制值与(2)的差值
1) 获取实时帧数据:从传感器获取实时帧。
2) 计算当前帧的OB平均值:使用(1)中的方法计算当前帧的R、Gr、Gb和B通道的OB平均值。
3) 计算差值:将当前帧的OB平均值与(2)中计算的多帧平均值进行比较,计算差值。
4) 应用校正:根据差值调整当前帧的钳制值。
python代码示例:
def correct_frame_with_ob_diff(current_frame, multi_frame_avgs):
R_avg, Gr_avg, Gb_avg, B_avg = calculate_ob_averages(current_frame)
R_multi_avg, Gr_multi_avg, Gb_multi_avg, B_multi_avg = multi_frame_avgs
# 计算差值
R_diff = R_avg - R_multi_avg
Gr_diff = Gr_avg - Gr_multi_avg
Gb_diff = Gb_avg - Gb_multi_avg
B_diff = B_avg - B_multi_avg
# 钳制值校正(根据实际需要调整校正公式)
corrected_frame = current_frame.copy()
corrected_frame[:, :] -= (R_diff + Gr_diff + Gb_diff + B_diff) / 4
return corrected_frame
# 示例用法
# 假设 current_frame 是当前实时帧,multi_frame_avgs 是多帧平均值
# corrected_frame = correct_frame_with_ob_diff(current_frame, (R_multi_avg, Gr_multi_avg, Gb_multi_avg, B_multi_avg))
以上步骤完成了计算OB区域平均值、多帧平均值和实时校正传感器钳制值的过程。具体的实现可能需要根据传感器和系统的具体情况进行调整和优化。
- 分享
- 举报
![易百纳技术社区](https://ebaina.oss-cn-hangzhou.aliyuncs.com/production/direct/resource/202306/14/empty.png)
-
浏览量:3221次2020-07-28 18:03:59
-
浏览量:1157次2023-07-27 17:57:42
-
浏览量:6822次2022-03-21 09:00:27
-
浏览量:2169次2020-08-05 20:49:45
-
浏览量:621次2023-12-11 11:01:31
-
浏览量:1426次2018-01-28 21:38:49
-
浏览量:3079次2021-12-04 14:20:29
-
浏览量:1467次2019-12-26 13:49:54
-
浏览量:938次2023-11-01 11:09:37
-
浏览量:5814次2021-04-01 16:50:31
-
浏览量:869次2024-02-23 18:01:42
-
2024-02-01 15:28:12
-
浏览量:1400次2019-12-21 15:08:38
-
浏览量:1331次2020-01-13 14:22:32
-
浏览量:2045次2022-10-09 10:38:23
-
浏览量:10338次2020-12-12 23:47:07
-
浏览量:1783次2024-03-14 14:15:25
-
浏览量:6643次2021-04-01 17:04:01
-
浏览量:1878次2019-11-18 14:31:41
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
![易百纳技术社区](https://ebaina.oss-cn-hangzhou.aliyuncs.com/res/images/user/avatar/202310/31/BLMxWMs4kmOElw6nBebPZPj9rKYviwm0Q4bivuso.png)
易木雨
![易百纳技术社区](/img/web/choose_active.png)
![易百纳技术社区](/img/web/choose_active.png)
![易百纳技术社区](/img/web/choose_active.png)
![易百纳技术社区](/img/web/choose_active.png)
![易百纳技术社区](/img/web/choose_active.png)
![易百纳技术社区](/img/web/paywx.png)
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明