1. 黑电平校正
任务目标
实现传感器黑电平校正(Black Level Correction, BLC),去除暗电流引起的固定模式偏移,使图像暗区像素值接近零。本案例针对RAW域单通道数据,采用全局减除校正法,适用于CMOS传感器输出的Bayer RAW图像。
实现原理
传感器在无光照条件下仍会输出非零像素值,称为黑电平(Black Level)。该偏移由暗电流、ADC偏置等因素引起,通常在传感器数据手册中给出标称值,也可通过遮挡镜头采集暗帧统计均值获得。校正方法为:I_corrected = max(I_raw - black_level, 0),其中black_level为全局黑电平偏移量。
完整代码
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
// 黑电平校正:全局减除,钳位到0
void black_level_correction(uint16_t *raw, uint32_t width, uint32_t height, uint16_t black_level) {
uint32_t total = width * height;
for (uint32_t i = 0; i < total; i++) {
if (raw[i] > black_level) {
raw[i] -= black_level;
} else {
raw[i] = 0;
}
}
}
// 计算暗帧均值(用于自动获取黑电平)
uint16_t compute_black_level(const uint16_t *dark_frame, uint32_t width, uint32_t height) {
uint64_t sum = 0;
uint32_t total = width * height;
for (uint32_t i = 0; i < total; i++) {
sum += dark_frame[i];
}
return (uint16_t)(sum / total);
}
int main() {
// 模拟 4x4 单通道RAW数据(含黑电平偏移)
const uint32_t W = 4, H = 4;
uint16_t raw[16] = {
64, 66, 65, 63,
65, 64, 66, 65,
63, 65, 64, 66,
66, 64, 65, 63
};
uint16_t dark_frame[16] = {
64, 64, 64, 64,
64, 64, 64, 64,
64, 64, 64, 64,
64, 64, 64, 64
};
// 方式1:从暗帧自动计算黑电平
uint16_t bl = compute_black_level(dark_frame, W, H);
printf("自动计算黑电平: %u\n", bl);
// 方式2:执行校正
black_level_correction(raw, W, H, bl);
// 输出校正结果
printf("校正后像素值:\n");
for (uint32_t i = 0; i < H; i++) {
for (uint32_t j = 0; j < W; j++) {
printf("%3u ", raw[i * W + j]);
}
printf("\n");
}
// 验证:所有像素应为0(因为暗帧均值=64,所有像素=64)
uint32_t nonzero = 0;
for (uint32_t i = 0; i < W * H; i++) {
if (raw[i] != 0) nonzero++;
}
if (nonzero == 0) {
printf("验证通过:所有像素已归零\n");
} else {
printf("验证失败:%u 个像素非零\n", nonzero);
}
return 0;
}
编译与运行
gcc -o blc blc.c -std=c99
./blc
验证方法
- 输入构造:模拟4×4全为64的RAW数据,暗帧均值也为64,代表传感器暗电流偏移。
- 预期输出:自动计算黑电平输出64;校正后所有像素值为0;验证输出“验证通过:所有像素已归零”。
- 判定标准:程序退出码为0,且控制台输出与上述预期一致,即证明校正逻辑正确。
实际应用说明
真实ISP流程中,黑电平值通常从传感器寄存器读取(如OV5640的BLACK_LEVEL寄存器),或由暗帧统计获得。本代码的compute_black_level函数演示了暗帧统计法,可直接替换为寄存器读取值。校正操作应在RAW域、去马赛克之前执行。对于Bayer格式,若传感器各通道黑电平不同,需分别对R/Gr/Gb/B通道使用不同偏移量,此时需按像素位置判断通道后再减除。