DPC 坏点矫正
DPC: Defective Pixel Correction
简介
这是真实世界,一颗传感器上难免会有瑕疵,成像上就表现为坏点。
坏点一般分为两种类型:像素值固定比较大/小,或者像素值感光线性度和其他像素差异很大。
DPC 算法也是两个重点:检测和修复;其中检测是比较重要的,修复则没啥特别标新立异的方法,因为 DPC 一般都是独立点或者很小的点簇(如果有一个 4x4 的坏点,厂商就有极大可能作为不良品不出货了),所以很小的点一般都是用周围点均值或者中值替代,无非是有的方法简单判断边缘,只用对应方向的点来修复。
写给自己的
DPC 之前简单弄过一些,工作目录:D:\Work\DPC。
静态校正(SDPC)
由 sensor 厂商在生产后进行标定,把所有坏点的坐标位置记录下来,然后矫正的时候直接通过查表得方式找到坏点进行矫正。
个人的经验分享
除了直接通过均值方差比较,坏点有可能会影响周围的点,导致出现下面的形状:

所以适当降低检查的标准,然后找出这种形状,即 3x3 窗口里面有多个坏点的。而且均值和方差最好用小窗口来做,而不是全局的,这个思想在任何时候都有用。
动态校正(DPC)
随着时间,坏点会增加,而且有些坏点也不好说清楚到底是不是坏点,所以需要动态检测坏点并进行矫正。
PINTO算法
主要思想是坏点往往是在一个邻域中的极亮或极暗点,所以以一个5x5的邻域为检测区域

如图所示5x5的邻域内同意颜色通道相对于中心像素都有8个临近像素。那么矫正按以下步骤操作:
- 计算中心像素与周围八个像素值的差;
- 判断八个差值是否都为正值或者都为负值;
- 如果有的为正有的为负,那么就为正常值,否则进行下一步;
- 设置一个阈值,如果八个差值的绝对值都查过阈值,那么就判断为坏点;
- 判断为坏点后就用八个临近的像素值的中位值来替换当前的像素值;
梯度法

该算法的作者针对三个通道都使用这一种窗口进行检测,具体步骤如下:
-
计算四个方向的梯度:
-
水平方向三个二阶梯度:Dh1 = |P1+P3-2*P2|, Dh2 = |P4+P5-2*Pc|,Dh3 = |P6+P8-2*P7|;
- 数值方向三个二阶梯度:Dv1 = |P1+P6-2*P4|, Dv2 = |P2+P7-2*Pc|,Dv3 = |P3+P8-2*P5|;
- 45°三个二阶梯度:D45_1 = 2*|P4-P2|, D45_2 =|P3+P6-2*Pc|, D45_3 = 2*|P7-P5|;
- 135°三个二阶梯度: D135_1 = 2*|P2-P5|, D135_2 =|P1+P8-2*Pc|, D135_3 = 2*|P7-P4|;
- 取出各个方向梯度绝对值的中值:median_Dh = median(Dh1,Dh2,Dh3),同理求出其他三个方向的中值;
- 求出四个中值的最小值作为边缘方向:min_grad = min(median_Dh,median_Dv,median_D45,median_D135);
- 根据边缘方向进行判断:
-
如果边缘方向为水平或者竖直:以水平方向为例,若|Dh2|>4(|Dh1|+|Dh3|),则为坏点
-
如果边缘方向是对角线方向:以45°方向为例,计算135°三个梯度绝对值两两之差的绝对值的和:sum,
-
如果sum小于100,若此时D45_2>3(D45_1+D45_3) 且 D135_2>3(D135_1+D135_3),则Pc为坏点。
-
如果sum大于100,若D45_2>3x(D45_1+D45_3)就为坏点;
-
-
为减少漏判,当Pc小于15且周围点都大于Pc40以上,则Pc为坏点。如果Pc大于230,且周围的点都下于Pc30以下,则该点为坏点;
同时由于算出了边缘方向,因此可以根据这个进行坏点补充:
- 边缘为水平方向,如|P4-Pc|<|Pc-P5|,则Pc更靠近P4,ouput=P4+(P2+P7-P1-P6)/2
- 边缘为45°,如果|P3-Pc|<|P6-Pc|,则Pc更靠近P3,output=P3+(P4+P7-P2-p5)/2
和 demosaic 结合法
没必要看了
行检测法
在这个硬件已经相当便宜的时代,没有必要看了