概述
介紹
圖像傳感器中的傳感器上每一光線采集的點形成的陣列工藝存在缺陷,或光信號進行轉化的過程中出現錯誤,會造成圖像上有些像素的信息有誤,導致圖像中的像素值不准確,這些有缺陷的像素即為圖像壞點(Bad pixel)。
由於來自不同工藝技術和傳感器制造商,尤其對一些低成本、消費品的sensor來說,壞點數會有很多。此外,sensor在長時間、高溫環境下壞點也會越來越多,從而破壞了圖像的清晰度和完整性。
壞點校正(Defect Pixel Correction)即是解決此問題的方法,壞點的分類有以下幾種:
-
靜態壞點:
- 亮點:一般來說像素點的亮度值是正比於入射光的,而亮點的亮度值明顯大於入射光乘以相應比例,並且隨着曝光時間的增加,該點的亮度會顯著增加;
- 暗點:無論在什么入射光下,該點的值接近於0;
-
動態壞點:在一定像素范圍內,該點表現正常,而超過這一范圍,該點表現的比周圍像素要亮。與sensor 溫度、增益有關,sensor 溫度升高或者gain 值增大時,動態壞點會變的更加明顯。
原因
如果圖像中存在壞點的話,在進行插值和濾波處理的時候,會影響周圍的像素點,因此需要在插值和濾波之前對壞點進行校正。
圖像存在壞點比較多或動態壞點很多的情況下,會造成圖像的邊緣出現偽色彩的情況,這種現象不但影響圖像的清晰度,而且會影響邊緣的色彩。此外,壞點也會造成圖像部分pixel閃爍的現象。
校正
這里給的校正方法是基於bayer圖像,對於灰度圖原理一致。
bayer格式的DPC方法,將圖像分為R、G、B三幅圖像,分別進行壞點校正。若sensor的圖像格式為RGBIR,則需要將圖像分為R、Gr、Gb、B四個通道。
動態壞點校正和靜態壞點校正是兩個相互獨立的過程。
靜態壞點校正
靜態壞點的校正是基於已有的靜態壞點表,比較當前點的坐標是否與靜態壞點表中的某個坐標一致,若一致則判定為壞點,然后再計算校正結果對其進行校正。,每個sensor的壞點都不一樣,需要sensor廠商給出每個sensor的靜態壞點表,但是出於成本的考慮,很多sensor廠商並沒有給出,而用戶校正的話只能一個一個對其進行校正,因此對於一些低成本的sensor,靜態壞點校正的實用性不是很強。
由於在硬件設計的時候需要占用大量的memory,考慮到芯片面積以及一些其他原因,因此靜態壞點有大小的限制,不可以無限制的校正。
sensor的靜態壞點表一旦寫入存儲,dpc模塊會自動替換壞點表中所示壞點。
算法
略
tuning
每個平台標定方法各不相同,但是一般情況下都是根據以下幾個步驟進行標定:
- 在黑暗壞境下標定亮點壞點。
- 在有光均勻圖像的環境下標定暗點。
- 合並壞點表。
動態壞點校正
動態壞點的校正可以實時的檢測和校正sensor 的亮點與暗點,並且校正的壞點個數不受限制。動態壞點校正相對靜態壞點校正具有更大的不確定性。
動態dpc可以分為兩個步驟,分別為壞點檢測和壞點校正。
算法
這里自己寫了一個dpc的算法,有興趣的話可以看看。
此算法使用梯度百分比的方式去檢測壞點,檢測到壞點之后通過中值濾波進行壞點校正,最終通過alpha混合的方式計算出最終的計算結果。
code
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));
效果展示:
tunning
dpc的調試可以提升圖像的多個方面,很大程度上改善圖像質量,一般情況下在不同的iso下調出不同的值,需要考慮的一是blend的混合程度,二是壞點檢測的力度。在噪聲比較多的情況下可以加強dpc的強度,但是建議不要把dpc當成去噪來使用,dpc校正太強依舊會造成邊緣偏色、整體偏色的現象。