ISP_DPC坏点矫正

1. 坏点介绍

图像坏点(Bad pixel) : 图像传感器上光线采集点(像素点)所形成的阵列存在工艺上的缺陷,或光信号进行转化为电信号的过程中出现错误,从而会造成图像上像素信息错误,导致图像中的像素值不准确,这些有缺陷的像素即为图像坏点。

由于来自不同工艺技术和传感器制造商,尤其对一些低成本、消费品的sensor来说,坏点数会有很多。另外,sensor在长时间、高温环境下坏点也会越来越多,从而破坏了图像的清晰度和完整性。坏点校正的目的就是修复这类问题,通常坏点分为一下两种:

(1) 静态坏点:分为静态亮点和静态暗点。

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

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

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

2. 坏点产生的原因

1)半导体技术本身的缺陷。由于半导体本身的缺陷与位错在所难免,这就是CMOS/CCD图像传感器(sensor)产生坏点的基本原因。一般来说,将响应不在某个区间内的点称为疵点或者坏点。宇宙射线的轰击会造成越来越多的缺陷,某些处在响应区间边界的点就可能超越阈值,由“响应相对正常点”落到“响应相对不正常点”,自然随着存储时间的增加,缺陷越来越多,坏点也就越来越多。

2)图像传感器中的传感器上每一光线采集的点形成的阵列工艺存在缺陷。光信号进行转化的过程中出现错误,或者CMOS/CCD传感器上某些像素点没有接收到电源,没能正常工作。从而造成图像上有些像素的信息有误,导致图像中的像素值不准确,一般在画面上显示成白色或者黑色的点。

3)由于来自不同工艺技术和传感器制造商,尤其对一些低成本、消费品的sensor来说,坏点数会有很多。此外,sensor在长时间、高温环境下坏点也会越来越多,从而破坏了图像的清晰度和完整性。

3. 坏点校正成因

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

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

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

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

4. 坏点校正策略

图像的坏点校正(DPC)通常在Bayer域(灰度图原理一致)进行。若Bayer域为R/G/B三通道,则分别进行坏点校正;若Bayer域为RGBIR格式,则分别对R/Gr/Gb/B四通道独立进行。动态坏点校正和静态坏点校正是两个相互独立的过程,可以同时开启,也可以只开启一个,视需要设置。

静态坏点校正:基于已有的静态坏点表,比较当前点的坐标是否与静态坏点表中的某个坐标一致,若一致则判定为坏点,然后再计算校正结果对其进行校正。一般情况下,每个sensor的坏点都不一样,需要sensor厂商给出每个sensor的静态坏点表,但是出于成本的考虑,很多sensor厂商并没有给出,而用户校正的话只能一个一个对其进行校正,因此对于一些低成本的sensor,静态坏点校正的实用性不是很强。另外,由于在硬件设计的时候需要占用大量的memory,考虑到芯片面积以及一些其他原因,因此静态坏点有大小的限制,不可以无限制的校正。

动态坏点校正:可以实时的检测和校正sensor 的亮点与暗点,并且校正的坏点个数不受限制。动态坏点校正相对。

5. tuning

每个平台标定方法各不相同,但是一般情况下都是根据以下几个步骤进行标定:

在黑暗坏境下标定亮点坏点。

在有光均匀图像的环境下标定暗点。

合并坏点表。

动态坏点校正

动态坏点的校正可以实时的检测和校正sensor 的亮点与暗点,并且校正的坏点个数不受限制。动态坏点校正相对静态坏点校正具有更大的不确定性。 

动态dpc可以分为两个步骤,分别为坏点检测和坏点校正。

6. 源码实现(Matlab Version)

该算法是动态坏点校正策略实现,算法使用梯度百分比的方式去检测坏点,检测到坏点之后通过中值滤波进行坏点校正,最终通过alpha混合的方式计算出最终的计算结果。代码如下:

close all;

clear;

clc;

%% variable

dp_slope = 0.02;

dp_thresh = -0.3;

r=3;        %Stencil radius

%% read raw image

% x = 0:255;

% y = dp_slope * x + dp_thresh;

% y(y<0) = 0;

% y(y>1) = 1;

% figure,

% plot(0:255,y)

% axis([0 255 0 1.5])

[filename, pathname] = ...

uigetfile({'*.raw'}, 'select picture');

str = [pathname filename];

fp = fopen(str, 'rb');

[X,l] = fread(fp, [1920,1080],
'uint16');

fclose(fp);

img = uint8(X/16)';

[height, width] = size(img);

img_correct = zeros(height, width);

%% Image edge extension

imgn=zeros(height+2*r,width+2*r);

imgn(r+1:height+r,r+1:width+r)=img;

imgn(1:r,r+1:width+r)=img(1:r,1:width);

imgn(1:height+r,width+r+1:width+2*r+1)=imgn(1:height+r,width:width+r);

imgn(height+r+1:height+2*r+1,r+1:width+2*r+1)=imgn(height:height+r,r+1:width+2*r+1);

imgn(1:height+2*r+1,1:r)=imgn(1:height+2*r+1,r+1:2*r);

%% dp algorithm

for i = r+1:height-r

for j = r+1:width-r

img_r = imgn(i-r:2:i+r, j-r:2:j+r);

data_r_center = img_r(r, r);

data_r_diff(1:r+1, 1:r+1) = abs(img_r - img_r(r,r));

data_r_sort = sort(img_r(:));

data_r_median = data_r_sort(r*2+1);

data_r_detect = data_r_diff * dp_slope + dp_thresh;

data_r_detect(data_r_detect <
0) = 0;

data_r_detect(data_r_detect > 1) = 1;

data_r_judge = sum(sum(data_r_detect > 0));

data_r_weight = sum(sum(data_r_detect)) / data_r_judge;

if i-r == 18 && j-r == 43

a = 1;

end

if data_r_judge >= 7

data_r_correct = data_r_median *
data_r_weight + (1-data_r_weight) * data_r_center;

else

data_r_correct = data_r_center;

end

img_correct(i-r, j-r) = data_r_correct;

end

end

%% show

figure,imshow(uint8(img));

figure,imshow(uint8(img_correct));

ISP_DPC坏点矫正的更多相关文章

  1. ISP PIPLINE(零) 知识综述预热

    本文为camera isp pipline概述 ISP,即image signal processing.为图像成型做的处理工作.适应不同光学环境下图像的还原. pipline流程如下: 光通过LEN ...

  2. ISP-OB, pedestal 以及ISP概述

    网上的直接参考资料 1. https://zhuanlan.zhihu.com/p/36896537 2. https://blog.csdn.net/m0_38049850/article/deta ...

  3. 简述安霸pipeline及其关键参数--raw域模块

    何为pipeline: sensor输出是一种叫Bayer 格式的RAW数据图像.ISP 对RAW数据图像的处理流程就是我们说的ISP PipeLine.通过PipeLine的处理,我们可以从一副RA ...

  4. 代码的坏味道(22)——不完美的库类(Incomplete Library Class)

    坏味道--不完美的库类(Incomplete Library Class) 特征 当一个类库已经不能满足实际需要时,你就不得不改变这个库(如果这个库是只读的,那就没辙了). 问题原因 许多编程技术都建 ...

  5. 代码的坏味道(19)——狎昵关系(Inappropriate Intimacy)

    坏味道--狎昵关系(Inappropriate Intimacy) 特征 一个类大量使用另一个类的内部字段和方法. 问题原因 类和类之间应该尽量少的感知彼此(减少耦合).这样的类更容易维护和复用. 解 ...

  6. 代码的坏味道(20)——过度耦合的消息链(Message Chains)

    坏味道--过度耦合的消息链(Message Chains) 特征 消息链的形式类似于:obj.getA().getB().getC(). 问题原因 如果你看到用户向一个对象请求另一个对象,然后再向后者 ...

  7. 代码的坏味道(21)——中间人(Middle Man)

    坏味道--中间人(Middle Man) 特征 如果一个类的作用仅仅是指向另一个类的委托,为什么要存在呢? 问题原因 对象的基本特征之一就是封装:对外部世界隐藏其内部细节.封装往往伴随委托.但是人们可 ...

  8. 代码的坏味道(16)——纯稚的数据类(Data Class)

    坏味道--纯稚的数据类(Data Class) 特征 纯稚的数据类(Data Class) 指的是只包含字段和访问它们的getter和setter函数的类.这些仅仅是供其他类使用的数据容器.这些类不包 ...

  9. 代码的坏味道(17)——夸夸其谈未来性(Speculative Generality)

    坏味道--夸夸其谈未来性(Speculative Generality) 特征 存在未被使用的类.函数.字段或参数. 问题原因 有时,代码仅仅为了支持未来的特性而产生,然而却一直未实现.结果,代码变得 ...

随机推荐

  1. vuex 引用方法

    引入Vuex(前提是已经用Vue脚手架工具构建好项目) 1.利用npm包管理工具,进行安装 vuex.在控制命令行中输入下边的命令就可以了. npm install vuex --save 要注意的是 ...

  2. PHP生成随机数的几种方法

    第一种方法用mt_rand() function GetRandStr($length){ $str='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUV ...

  3. PE文件附加数据感染之Worm.Win32.Agent.ayd病毒分析

    一.基本信息 样本名称:1q8JRgwDeGMofs.exe 病毒名称:Worm.Win32.Agent.ayd 文件大小:165384 字节 文件MD5:7EF5D0028997CB7DD3484A ...

  4. Intel汇编程序设计-整数算术指令(上)

    第七章 整数算术指令 7.1 简介 每种汇编语言都有进行操作数移位的指令,移位和循环移位指令在控制硬件设备.加密数据,以及实现高速的图形操作时特别有用.本章讲述如何进行移位和循环移位操作以及如何使用移 ...

  5. Portswigger web security academy:OS command injection

    Portswigger web security academy:OS command injection 目录 Portswigger web security academy:OS command ...

  6. Day009 面向对象和方法回顾

    面向过程&面向对象 面向过程思想 步骤清晰简单,第一步做什么,第二步做什么..... 面象过程适合处理一些较为简单的问题 面向对象思想 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些 ...

  7. 远程分支git换地址了,本地重新关联

    由于本人把github远程仓库的名字修改了所以做了以下步骤修改 步骤:两步 (1)先把之前关联的git清除掉 git remote rm origin (2)再关联新的地址 git remote ad ...

  8. PhpStorm个性化设置推荐

    预览 字体 字体使用jetbrains的mono,前往下载:如何安装,字体安装完成之后Restart,可在PhpStorm settings中搜索 font 进行启用 mono 字体 主题 主题推荐使 ...

  9. 在服务器上使用 smart http 搭建 Git 服务器

    前言 最近一直在写 django 网页的代码,随着代码的量越来越大,管理起来也有点复杂(当然,有在使用 git 进行代码管理).同时由于有不同的工作环境,有些工作环境对 ssh 的访问有限制,所以想到 ...

  10. postman Variables变量的详解与应用

    变量 变量类型(按照作用域划分) 全局变量(全局环境里面的变量) 集合变量(请求集合里声明的变量) 自定义环境变量 数据变量(在runner时文件变量) 本地变量 变量权重类型 全局变量 < 集 ...