去壞點小談

一、基本概念

  1. 壞點:在sensor的制造過程中儡羔,無法保證每個sensor中的像素點都是完好的。一半會存在較少的一些像素會存在損壞的情況。
  2. 壞點的一些類型:
    2.1 亮度 -- 一直保持高亮的點
    2.2 暗點 -- 一直保持黑暗的點
    2.3 灰點 -- 在一定的范圍內(nèi)正常场梆,但是超過一定的閾值即無法顯示正常
  3. 處理的方法
    3.1 靜態(tài)壞點標(biāo)定法
    即在全亮的環(huán)境中把暗點標(biāo)記出來,在全黑的環(huán)境下把亮點標(biāo)記出來纯路。用靜態(tài)表把壞點存放起來或油,再進行標(biāo)定。
    好處是精確感昼,壞處是需要每個批次都需要校準(zhǔn)以及需要比較大的空間來放靜態(tài)表装哆。
    3.2 動態(tài)壞點標(biāo)定法
    即動態(tài)的識別判斷出壞點,然后進行矯正定嗓。好處是不用進行每個sensor進行標(biāo)定蜕琴。往往通過以下兩種方式進行對壞點的識別。1. 梯度的方式宵溅,通過當(dāng)前點像素的與附近同色像素的梯度差異來判斷出是否為壞點凌简。 2.色差的方式,根據(jù)一般現(xiàn)實世界中的顏色過渡比較平緩恃逻,所以有一些會根據(jù)g/r,g/b的比例或者差值來進行判別出壞點雏搂。

二藕施、一個簡單的動態(tài)壞點標(biāo)定法

  1. CN103297717B上的插值方法
1. 使用5*5的區(qū)域來獲取差異性,T值為區(qū)域中相同元素的值,g為菱形凸郑,r/b為正方形裳食。
dN = |T1 - T2| + |T2 - T3| + ... + |Tn - T1|
2. 計算壞點的門限閾值,DPC與拍攝中的感光度有關(guān)
DPC_TH= dN * DPC
3. 計算當(dāng)前值與領(lǐng)域的值的差異
DIFF = dC = |T - T1| + |T - T2| + ... + |T - Tn|
4. 如果DIFF大于DPC_TH則為壞點芙沥,進入5
5. 計算出邊緣的梯度诲祸,計算出水平和垂直的梯度以下圖G為中心來示例。
VG=|G3-G7|+|R0-R1|
HG=|G1-G5|+|B0-B1|
6. 根據(jù)梯度來計算出待插值的方向
  6.1 如果VG<HG×DR,DR為預(yù)設(shè)的邊緣補償?shù)谋壤?      AVG_V=(G3+G7)/2
  6.2 如果HG<VG×DR
      AVG_H=(G1+G5)/2
  6.3 如果VG≧HG×DR&HG≧VG×DR
      AVG_T=(G1+G2+G3+G4+G5+G6+G7+G8)/8
G為中心
void xxx_dpc_lianyong_run(void* handle)
{
    if (NULL == handle)
    {
        printf("xxx_dpc_chen_run handle is null! \n");
        return;
    }
    xxx_isp_handle* isp_handle = (xxx_isp_handle*)handle;
    u16 Width = isp_handle->raw_handle.raw_wide;
    u16 Height = isp_handle->raw_handle.raw_high;

    const u8 Green = 1 - ((isp_handle->demosaic_handle.red_x + \
        isp_handle->demosaic_handle.red_y) & 1);

    u16* data = isp_handle->raw_handle.data;
    u16 search_step = isp_handle->dpc_handle.dpc_chan_handle.search_step;
    u16* ptr;
    ptr = (u16*)malloc(Width * Height * sizeof(u16));// 全部按16位讀出來
    if (ptr == NULL) return ;
    memcpy(ptr, data, Width * Height * sizeof(u16));

    u16 x, y;
    u16 dN,dpc_th,diff;
    u16 vg, hg;
    u32 hist_g = 0;
    u32 hist_g_v = 0;
    u32 hist_g_h = 0;
    u32 hist_g_t = 0;
    u32 hist_rb_v = 0;
    u32 hist_rb_h = 0;
    u32 hist_rb_t = 0;
    u32 hist_rb = 0;
    // 暫時先不管最外層的問題而昨,不考慮邊界
    for (y = search_step + 1; y < Height - search_step - 1; y++)
    {
        for (x = search_step + 1; x < Width - search_step - 1; x++)
        {
            // green取菱形
            if (((x + y) & 1) == Green)
            {
                dN = abs(data[y * Width + x - 2] - data[(y - 1) * Width + x - 1]) + \
                    abs(data[(y - 1) * Width + x - 1] - data[(y - 2) * Width + x]) + \
                    abs(data[(y - 2) * Width + x] - data[(y - 1) * Width + x + 1]) + \
                    abs(data[(y - 1) * Width + x + 1] - data[(y)*Width + x + 2]) + \
                    abs(data[(y)*Width + x + 2] - data[(y + 1) * Width + x + 1]) + \
                    abs(data[(y + 1) * Width + x + 1] - data[(y + 2) * Width + x]) + \
                    abs(data[(y + 2) * Width + x] - data[(y + 1) * Width + x - 1]) + \
                    abs(data[(y + 1) * Width + x - 1] - data[(y)*Width + x - 2]);
                diff = abs(data[y * Width + x] - data[(y - 1) * Width + x - 1]) + \
                    abs(data[y * Width + x] - data[(y - 2) * Width + x]) + \
                    abs(data[y * Width + x] - data[(y - 1) * Width + x + 1]) + \
                    abs(data[y * Width + x] - data[(y)*Width + x + 2]) + \
                    abs(data[y * Width + x] - data[(y + 1) * Width + x + 1]) + \
                    abs(data[y * Width + x] - data[(y + 2) * Width + x]) + \
                    abs(data[y * Width + x] - data[(y + 1) * Width + x - 1]) + \
                    abs(data[y * Width + x] - data[(y)*Width + x - 2]);
                dpc_th = dN * isp_handle->dpc_handle.dpc_lianyong_handle.dpc;
                if (diff > dpc_th)
                {
                    hist_g++;
                    vg = abs(data[(y - 2) * Width + x] - data[(y + 2) * Width + x]) + \
                        abs(data[(y - 1) * Width + x] - data[(y + 1) * Width + x]);
                    hg = abs(data[(y) * Width + x - 2] - data[(y ) * Width + x + 2]) + \
                        abs(data[(y ) * Width + x - 1] - data[(y) * Width + x] + 1);
                    if (vg * 100 < hg * isp_handle->dpc_handle.dpc_lianyong_handle.dr)
                    {
                        hist_g_v++;
                        ptr[(y)*Width + x] = (data[(y - 2) * Width + x] + data[(y + 2) * Width + x]) / 2;
                    }
                    else if (hg * 100 < vg * isp_handle->dpc_handle.dpc_lianyong_handle.dr)
                    {
                        hist_g_h++;
                        ptr[(y)*Width + x] = (data[(y)*Width + x - 2] + data[(y)*Width + x + 2]) / 2;
                    }
                    else
                    {
                        hist_g_t++;
                        ptr[(y)*Width + x] = (data[y * Width + x - 2] + data[(y - 1) * Width + x - 1] + \
                            data[(y - 2) * Width + x] + data[(y - 1) * Width + x + 1] + \
                            data[(y)*Width + x + 2] + data[(y + 1) * Width + x + 1] + \
                            data[(y + 2) * Width + x] + data[(y + 1) * Width + x - 1])/8;
                    }
                }
            }// r/b取正方形
            else
            {
               
                dN = abs(data[y * Width + x - 2] - data[(y - 2) * Width + x - 2]) + \
                    abs(data[(y - 2) * Width + x - 2] - data[(y - 2) * Width + x]) + \
                    abs(data[(y - 2) * Width + x] - data[(y - 2) * Width + x + 2]) + \
                    abs(data[(y - 2) * Width + x + 2] - data[(y)*Width + x + 2]) + \
                    abs(data[(y)*Width + x + 2] - data[(y + 2) * Width + x + 2]) + \
                    abs(data[(y + 2) * Width + x + 2] - data[(y + 2) * Width + x]) + \
                    abs(data[(y + 2) * Width + x] - data[(y + 2) * Width + x - 2]) + \
                    abs(data[(y + 2) * Width + x - 2] - data[(y)*Width + x - 2]);
                diff = abs(data[y * Width + x] - data[(y - 2) * Width + x - 2]) + \
                    abs(data[y * Width + x] - data[(y - 2) * Width + x]) + \
                    abs(data[y * Width + x] - data[(y - 2) * Width + x + 2]) + \
                    abs(data[y * Width + x] - data[(y)*Width + x + 2]) + \
                    abs(data[y * Width + x] - data[(y + 2) * Width + x + 2]) + \
                    abs(data[y * Width + x] - data[(y + 2) * Width + x]) + \
                    abs(data[y * Width + x] - data[(y + 2) * Width + x - 2]) + \
                    abs(data[y * Width + x] - data[(y)*Width + x - 2]);
                dpc_th = dN * isp_handle->dpc_handle.dpc_lianyong_handle.dpc;
                if (diff > dpc_th)
                {
                    hist_rb++;
                    vg = abs(data[(y - 2) * Width + x] - data[(y + 2) * Width + x]) + \
                        abs(data[(y - 1) * Width + x] - data[(y + 1) * Width + x]);
                    hg = abs(data[(y)*Width + x - 2] - data[(y)*Width + x + 2]) + \
                        abs(data[(y)*Width + x - 1] - data[(y)*Width + x] + 1);
                    if (vg * 100 < hg * isp_handle->dpc_handle.dpc_lianyong_handle.dr)
                    {
                        hist_rb_v++;
                        ptr[(y)*Width + x] = (data[(y - 2) * Width + x] + data[(y + 2) * Width + x]) / 2;
                    }
                    else if (hg * 100 < vg * isp_handle->dpc_handle.dpc_lianyong_handle.dr)
                    {
                        hist_rb_h++;
                        ptr[(y)*Width + x] = (data[(y)*Width + x - 2] + data[(y)*Width + x + 2]) / 2;
                    }
                    else
                    {
                        hist_rb_t++;
                        ptr[(y)*Width + x] = (data[(y - 2) * Width + x - 2] + data[(y - 2) * Width + x] + \
                            data[(y - 2) * Width + x + 2] + data[(y)*Width + x + 2] + \
                            data[(y + 2) * Width + x + 2] + data[(y + 2) * Width + x] + \
                            data[(y + 2) * Width + x - 2] + data[(y)*Width + x - 2]) / 8;
                    }
                }
            }
        }
    }
    memcpy(data, ptr, Width * Height * sizeof(u16));
    printf("hist_g = %d;hist_rb = %d\n", hist_g, hist_rb);
    printf("hist_g_v = %d;hist_g_h = %d;hist_g_t = %d\n", hist_g_v, hist_g_h, hist_g_t);
    printf("hist_rb_v = %d;hist_rb_h = %d;hist_rb_t = %d\n", hist_rb_v, hist_rb_h, hist_rb_t);
}

感覺整體效果還可以,基本上該去的壞點都去掉了,邏輯簡單救氯,看起來很舒服。
修改DR和DPC的強度值就可以調(diào)整效果了歌憨。DPC越小着憨,可以檢測到越多的壞點。DR越小則越容易做中值濾波务嫡,可以應(yīng)對多個壞點的簇甲抖,也會帶來一些細(xì)節(jié)的模糊。


去壞點前后

待完成的植袍。色比的方式惧眠。多幀的時候,防止壞點閃爍于个。
多說一句氛魁,在對于tone_curve等提亮之后會存在一部分的壞點出來,所以去壞點放的位置是不是在提亮之后會合適一點呢厅篓?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秀存,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子羽氮,更是在濱河造成了極大的恐慌或链,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件档押,死亡現(xiàn)場離奇詭異澳盐,居然都是意外死亡,警方通過查閱死者的電腦和手機令宿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門叼耙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人粒没,你說我怎么就攤上這事筛婉。” “怎么了癞松?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵爽撒,是天一觀的道長入蛆。 經(jīng)常有香客問我,道長硕勿,這世上最難降的妖魔是什么哨毁? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任魂奥,我火速辦了婚禮,結(jié)果婚禮上砚偶,老公的妹妹穿的比我還像新娘蒸痹。我一直安慰自己,他們只是感情好咱扣,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般查排。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抄沮,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天跋核,我揣著相機與錄音,去河邊找鬼叛买。 笑死砂代,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的率挣。 我是一名探鬼主播刻伊,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼椒功!你這毒婦竟也來了捶箱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤动漾,失蹤者是張志新(化名)和其女友劉穎丁屎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旱眯,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡晨川,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了删豺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片共虑。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吼鳞,靈堂內(nèi)的尸體忽然破棺而出看蚜,到底是詐尸還是另有隱情,我是刑警寧澤赔桌,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布供炎,位于F島的核電站渴逻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏音诫。R本人自食惡果不足惜惨奕,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望竭钝。 院中可真熱鬧梨撞,春花似錦、人聲如沸香罐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽庇茫。三九已至港粱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旦签,已是汗流浹背查坪。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宁炫,地道東北人偿曙。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像羔巢,于是被迫代替她去往敵國和親望忆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容