【DPC:Dead Pixel Correction】

ISP_DPC坏点矫正是一种图像预处理技术,主要用于检测和矫正图像传感器上的坏点。由于制造过程中的不完美或长时间使用导致的磨损,图像传感器上可能会出现一些不能正常工作的像素点,这些点被称为坏点。这些坏点会影响图像质量,从而影响后续的图像处理和分析结果。因此,在图像信号处理(ISP)流程中,坏点校正(DPC)是一个重要的步骤。

1. 静态坏点,
常用的方法是依靠标定进行矫正。这通常需要sensor厂商提供一个静态坏点表,其中列出了所有已知坏点的坐标信息。在实际应用中,通过比较当前像素的坐标与坏点表中的坐标是否一致来判断是否为坏点,然后采用中值滤波等方法对其进行矫正。然而,由于存储坏点信息的内存有限,且静态坏点校正可能无法完全覆盖所有坏点,因此动态坏点校正方法更为关键。
(1) 静态坏点:分为静态亮点和静态暗点。

静态亮点:一般来说像素点的亮度值是正比于入射光的,而亮点的亮度值明显大于入射光乘以相应比例,并且随着曝光时间的增加,该点的亮度会显著增加;

静态坏点:无论在什么入射光下,该点的值接近于0;

(2) 动态坏点:在一定像素范围内,该点表现正常,而超过这一范围,该点表现的比周围像素要亮。与sensor 温度、增益有关,sensor 温度升高或者gain 值增大时,动态坏点会变的更加明显。

为什么图像处理的过程中需要做坏点校正,而且坏点校正(DPC)通常在ISP的pipeline靠前位置?

(1) 如果图像中存在坏点的话,ISP后续进行插值和滤波处理时,会影响周围的像素点值,因此需要在插值和滤波之前对坏点进行校正 ;

(2) 图像存在坏点比较多或动态坏点很多的情况下,会造成图像的边缘出现伪色彩的情况,这种现象不但影响图像的清晰度,而且会影响边缘的色彩;

(3) 坏点也会造成图像部分pixel闪烁的现象;

在这里插入图片描述
在黑暗坏境下标定亮点坏点。
在有光均匀图像的环境下标定暗点。
合并坏点表。
2. 动态坏点
校正方法不依赖标定,能够实时检测和矫正sensor中的亮点与暗点,且不受坏点个数的限制。这种方法相对于静态坏点校正具有更大的灵活性和不确定性。动态坏点校正分为两个主要步骤:

  • 坏点检测
    坏点检测通常采用基于邻域比较的方法。例如,PINTO算法主要基于一个邻域内的极亮或极暗点来进行坏点识别。该算法计算中心像素与周围八个像素值的差异,若差值均大于或小于某个设定阈值,则判定为坏点。梯度法也是一种常用的检测方法,它计算四个方向(水平、竖直、45°和135°)的梯度值,通过判断梯度关系来检测坏点。

  • 坏点矫正。
    坏点矫正通常采用中值滤波方法。对于已识别为坏点的像素,用其邻域内其他像素的中位值替换该坏点值,从而避免坏点对图像质量的负面影响
    在这里插入图片描述
    思想:坏点像素点比周围里亮或者暗
    1.计算中心点与周围8个像素点的像素差值;
    2.如果有正有负,则判断该点为正常点;
    3.如果8个值全为正或者全为负值,则进行下一步判断;
    4.如果8个差值的绝对值均大于阈值,则认为该点是坏点,用8个邻域像素的中位值代替该点,反之则判断该点为正常点。

算法缺点:对边缘处的坏点检测无效,因为边缘处也有较大的像素差值波动

在这里插入图片描述
该算法的作者针对三个通道都使用这一种窗口进行检测(Gr和Gb分开计算就是如图5*5的邻域)。思想:在边缘方向,坏点在该方向上的梯度是很高的。

具体步骤如下:

1.计算四个方向的梯度:
水平方向三个二阶梯度:Dh1 = |P1+P3-2P2|, Dh2 = |P4+P5-2Pc|,Dh3 = |P6+P8-2P7|;
数值方向三个二阶梯度:Dv1 = |P1+P6-2P4|, Dv2 = |P2+P7-2Pc|,Dv3 = |P3+P8-2P5|;
45°三个二阶梯度:D45_1 = 2*|P4-P2|, D45_2 =|P3+P6-2Pc|, D45_3 = 2|P7-P5|;
135°三个二阶梯度: D135_1 = 2*|P2-P5|, D135_2 =|P1+P8-2Pc|, D135_3 = 2|P7-P4|;
2.取出各个方向梯度绝对值的中值median_Dh = median(Dh1,Dh2,Dh3),同理求出其他三个方向的中值;
3.求出四个中值的最小值作为边缘方向:min_grad = min(median_Dh,median_Dv,median_D45,median_D135);
4.如果最小梯度方向为水平或者竖直,若过Pc那个梯度的绝对值大于同方向的另外两个梯度绝对值和的4倍,则Pc为坏点;
5.如果是45°方向,则计算135°三个梯度绝对值两两之差的绝对值的和

如果D135_sum小于100,若此时D45_2>3x(D45_1+D45_3)且D135_2>3x(D135_1+D135_3),则Pc为坏点。如果D135_sum大于等于100,则D45_2>3x(D45_1+D45_3)就为坏点;
6.135°方向和45°相反的方向计算和判断即可;
7.为减少漏判,当Pc小于15且周围点都大于Pc40以上,则Pc为坏点。如果Pc大于230,且周围的点都下于Pc30以下,则该点为坏点;
8.边缘为水平方向,且判断为坏点,如过|P4-Pc|<|Pc-P5|则Pc更靠近P4,根据同一颜色通道亮度的渐变性可以推导出ouput=P4+(P2+P7-P1-P6)/2;否则ouput=P5+(P2+P7-P3-P8)/2;
9.如果为竖直方向可以参考水平方向求出;
10.边缘为45°,如果|P3-Pc|<|P6-Pc|则根据同一原则output=P3+(P4+P7-P2-p5)/2;否则为output=P6+(P2+P5-P7-p4)/2;
11.边缘为135°则按照45°的方式反过来计算即可。
在这里插入图片描述
DPC和demosaic结合法
先插值,变成RGB图像,再根据所估计的值和PINTO算法进行DPC
在这里插入图片描述

4.行检测法
根据单行或者多行数据进行检测和矫正,降低对硬件buffer的要求。

#!/usr/bin/python
import numpy as np

class DPC:
    '死像素校正'

    def __init__(self, img, thres, mode, clip):
        # 初始化类,传入图像、阈值、模式和裁剪值
        self.img = img
        self.thres = thres
        self.mode = mode
        self.clip = clip

    def padding(self):
        # 对图像进行边缘反射填充,填充2像素
        img_pad = np.pad(self.img, (2, 2), 'reflect')
        return img_pad

    def clipping(self):
        # 将图像的像素值限制在0到clip之间
        np.clip(self.img, 0, self.clip, out=self.img)
        return self.img

    def execute(self):

        """
        像素数组在代码中展示如下:

        p1 p2 p3
        p4 p0 p5
        p6 p7 p8

        这对于计算后续像素值的梯度(水平、垂直、左/右对角线)非常有意义。
        """


        img_pad = self.padding()
        raw_h = self.img.shape[0]
        raw_w = self.img.shape[1]
        dpc_img = np.empty((raw_h, raw_w), np.uint16) 
        # 将uint16改为int,仍然存在溢出警告在以下的abs计算中
        for y in range(img_pad.shape[0] - 4):
            for x in range(img_pad.shape[1] - 4):



                p0 = img_pad[y + 2, x + 2].astype(int)
                p1 = img_pad[y, x].astype(int)
                p2 = img_pad[y, x + 2].astype(int)
                p3 = img_pad[y, x + 4].astype(int)
                p4 = img_pad[y + 2, x].astype(int)
                p5 = img_pad[y + 2, x + 4].astype(int)
                p6 = img_pad[y + 4, x].astype(int)
                p7 = img_pad[y + 4, x + 2].astype(int)
                p8 = img_pad[y + 4, x + 4].astype(int)



                if (abs(p1 - p0) > self.thres) and (abs(p2 - p0) > self.thres) and (abs(p3 - p0) > self.thres) \
                        and (abs(p4 - p0) > self.thres) and (abs(p5 - p0) > self.thres) and (abs(p6 - p0) > self.thres) \
                        and (abs(p7 - p0) > self.thres) and (abs(p8 - p0) > self.thres):
                    if self.mode == 'mean':
                        # 如果模式为平均值,则将p0设置为周围像素的平均值
                        p0 = (p2 + p4 + p5 + p7) / 4
                    elif self.mode == 'gradient':
                        # 如果模式为梯度,则计算梯度最小的方向,并根据该方向调整p0的值
                        dv = abs(2 * p0 - p2 - p7)
                        dh = abs(2 * p0 - p4 - p5)
                        ddl = abs(2 * p0 - p1 - p8)
                        ddr = abs(2 * p0 - p3 - p6)
                        if (min(dv, dh, ddl, ddr) == dv):
                            p0 = (p2 + p7 + 1) / 2
                        elif (min(dv, dh, ddl, ddr) == dh):
                            p0 = (p4 + p5 + 1) / 2
                        elif (min(dv, dh, ddl, ddr) == ddl):
                            p0 = (p1 + p8 + 1) / 2
                        else:
                            p0 = (p3 + p6 + 1) / 2
                dpc_img[y, x] = p0.astype('uint16')
        self.img = dpc_img
        return self.clipping()


总结:
1、计算领域,检测异常,
2、替换像素,a: 四方向的均值 b: 梯度最小方向的均值

海思
Defect Pixel Correction
坏点校正模块通过使用内部坏点校正逻辑完成坏点检测,校正过程完成之后,获取到了坏点坐标,通常的做法是将坏点坐标存在 Flash 中,以后断电重新启动之后加载坏点坐标,无须重新校正。

Hi3519V101 坏点校正算法实现主要是通过一个窗口为 5×5 的模块找出该窗口内像素明显异于临近像素的坏点。

该模块的实现了以下两种模式

静态坏点检测/校正会对 R,Gr,Gb,B 四个分量分别处理,若 Bayer 图像中出现
图 7-3 所示的坏点类型,则可以对其校正;
在这里插入图片描述

图 7-4 所示的坏点类型不能完全校正。其中 黑色块表示某一颜色通道(R/Gr/Gb/B)上的坏点。支持的最大坏点数为 4095,分 为亮点和暗点流程。
!](https://img-blog.csdnimg.cn/direct/79798243b7e44cf1a9e43937d53c3da4.png)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在亮点流程中,光圈处于关闭状态,启动坏点检测程序,得到坏点坐标。得到 的坏点通过临近像素的中值滤波进行校正。
在暗点流程中,光圈处于正常打开状态,要求平坦背景,最好使用照度均匀的 光源,图像整体平均亮度大约为最大亮度 50%,或 Bayer 格式中 B 通道亮度为 最大亮度 20%左右,启动坏点检测程序,得到坏点坐标。得到的坏点通过临近 像素的中值滤波进行校正
静态坏点校正最多可以校正 4095 个静态坏点;
动态坏点检测/校正

在这种模式中,校正模块动态进行坏点检测和校正,对 R,Gr,Gb,B 四个分量分别 处理,只能处理单个坏点,能够校正的坏点个数没有限制。正常照度下,可以不 使用动态坏点校正功能;在低照度情况下,较弱的坏点被放大成刺眼的白点和明 显的黑点,推荐使用动态坏点校正功能。
由于存储坏点信息的 memory 有限,静态坏点校正有可能无法完全校正 sensor 中的坏点,因 此静态坏点校正应当校正对图像质量影响最大的坏点,而动态坏点校正方法则校正其余的坏 点;

  1. ISP——坏点矫正(Defective Pixel Correction,DPC) - CSDN博客
  2. ISP——DPC(Defective Pixel Correction)_isp中dpc-CSDN博客
  3. ISP之DPC(坏点校正)模块-CSDN博客
  4. 优秀的 Verilog/FPGA开源项目介绍(二十六)- ISP (图像 …
  5. ISP_DPC坏点矫正 - 吴建明wujianming - 博客园
  6. 海思平台ISP各模块介绍
  • 15
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值