天天看點

【數字圖像處理】五.MFC圖像點運算之灰階線性變化、灰階非線性變化、門檻值化和均衡化處理詳解

        本文主要講述基于vc++6.0 mfc圖像處理的應用知識,主要結合自己大三所學課程《數字圖像處理》及課件進行講解,主要通過mfc單文檔視圖實作顯示bmp圖檔點運算處理,包括圖像灰階線性變換、灰階非線性變換、圖像門檻值化處理、圖像均衡化處理等知識,并結合前一篇論文灰階直方圖進行展示

。同時文章比較詳細基礎,希望該篇文章對你有所幫助,尤其是初學者和學習圖像處理的學生。

        免費資源下載下傳位址:

        圖像的點運算是圖像進行中非常基礎的技術,它主要用于改變一篇圖像的灰階分布範圍,通過一定的變換函數将圖像的像素進行轉換,最終生成一幅新的圖像。點運算的最大特點就是輸出像素值隻與目前輸入像素值相關。定義如下。

        點運算(point operation)指對于一幅輸入圖像,将産生一幅輸出圖像,輸出圖像的每個像素點的灰階值由輸入像素點決定。

        點運算由灰階變換函數(grap scale transformation,gst)确定:b(x,y)=f[a(x,y)]

        需要注意一下幾點:

        (1).與局部或鄰域運算的差别,輸入像素和輸出像素是一一對應的;(2).與幾何運算的差别,不改變圖像的空間關系;(3).又稱為對比增強,對比拉伸或灰階變換。

        第一步:在資源視圖中menu中添加“圖像點運算”菜單欄如下所示:

【數字圖像處理】五.MFC圖像點運算之灰階線性變化、灰階非線性變化、門檻值化和均衡化處理詳解

        對應的id值為:

        線性變換 id_dys_xxyd(點運算 線性移動) id_dys_xxzq( 點運算 線性增強)

                       id_dys_xxjx(點運算 線性減小)  id_dys_xxqb(點運算 線性求補)

        非線性變換 id_dys_fxxpf(點運算 非線性平方) id_dys_fxxhs(非線性函數)

        門檻值變換 id_dys_yzbh(點運算 門檻值變換) 圖像均衡化 id_dys_jhh

        第二步:打開類向導(ctrl+w),為點運算每個id菜單添加相應的功能處理函數,如下圖所示:選擇類cimageprocessingview,在選擇ids為id_dys_...(點運算)添加函數ondysxxqb()線性求補。

【數字圖像處理】五.MFC圖像點運算之灰階線性變化、灰階非線性變化、門檻值化和均衡化處理詳解

        圖像線性變換是通過建立灰階映射來調整資源圖像的灰階,進而達到圖像增強的目的。其中gst函數f(d)為線性的,即:

【數字圖像處理】五.MFC圖像點運算之灰階線性變化、灰階非線性變化、門檻值化和均衡化處理詳解

        若a=1,b=0圖像像素不發生變化

        若a=1,b!=0圖像所有灰階值上移或下移

        若a>1輸出圖像對比度增強

        若0<a<1輸出圖像對比度減小

        若a<0暗區域變亮,亮區域變暗,圖像求補

【數字圖像處理】五.MFC圖像點運算之灰階線性變化、灰階非線性變化、門檻值化和均衡化處理詳解

        1.d(b)=d(a)+50

        首先是圖像移動,代碼如下:

        同時修改void cimageprocessingview::showbitmap(cdc *pdc, 

cstring bmpname)函數中的代碼:

        運作效果如下圖所示,同時我截取了直方圖(rgb相同隻顯示一種)。

【數字圖像處理】五.MFC圖像點運算之灰階線性變化、灰階非線性變化、門檻值化和均衡化處理詳解

        可以發現圖像的灰階上移了50,圖像更白了(黑0-255白)。

        2.d(b)=1.5*d(a)

        運作效果如下圖所示,圖像對比度增強,平均灰階122*1.5=181

【數字圖像處理】五.MFC圖像點運算之灰階線性變化、灰階非線性變化、門檻值化和均衡化處理詳解

        3.d(b)=0.8*d(a)

        運作如下圖所示,圖像減弱。

【數字圖像處理】五.MFC圖像點運算之灰階線性變化、灰階非線性變化、門檻值化和均衡化處理詳解

        4.d(b)=-1*d(a)+255

        運作效果如下圖所示,它是圖像的求補,發現直方圖是互補的。

【數字圖像處理】五.MFC圖像點運算之灰階線性變化、灰階非線性變化、門檻值化和均衡化處理詳解

        ps:注意圖檔下面的直方圖應該還有一個處理後的直方圖,但原理都一樣,我不想重複工作,你自己可以去簡單實作下,參考第四篇文章。同時這些圖檔制作還挺麻煩的,隻是為了給你更好的呈現它們的變化,希望對你有用和尊重作者,不喜勿噴~

        灰階非線性變換主要包括對數變換、幂次變換、指數變換、分段函數變換,通過非線性關系對圖像進行灰階處理,下面主要講解課件中的兩個函數對其進行處理。其中對數變換實作了擴充低灰階值而壓縮高灰階值的效果,圖像灰階分布更符合而你的視覺特征。

【數字圖像處理】五.MFC圖像點運算之灰階線性變化、灰階非線性變化、門檻值化和均衡化處理詳解

        1.d(b)=d(a)*d(a)/252

        運作效果如下圖所示:

【數字圖像處理】五.MFC圖像點運算之灰階線性變化、灰階非線性變化、門檻值化和均衡化處理詳解

        2.d(b)=d(a)+0.8*d(a)*(255-d(a))/255

【數字圖像處理】五.MFC圖像點運算之灰階線性變化、灰階非線性變化、門檻值化和均衡化處理詳解

        寫到此處你會發現圖像灰階的線性變換和非線性變換是非常簡單的,主要是通過以下步驟完成:

        第一步:指派處理後圖像的bmp頭資訊

            file *fpo = fopen(bmpname,"rb");

            file *fpw = fopen(bmpnamelin,"wb+");

            fread(&bfh,sizeof(bitmapfileheader),1,fpo);

            fread(&bih,sizeof(bitmapinfoheader),1,fpo);

            fwrite(&bfh,sizeof(bitmapfileheader),1,fpw);

            fwrite(&bih,sizeof(bitmapinfoheader),1,fpw);

        第二步:通過循環和線性變換或非線性便函函數處理每一個像素

            for( i=0; i<m_nimage/3; i++ )

            {

                 fread(&red,sizeof(char),1,fpo);

                 處理像素rbg 如:red=(int)red*(int)red/255;

                 fwrite(&red,sizeof(char),1,fpw);

            }

         第三步:調用showbitmap自定義函數并重繪圖像

            numpicture = 2;

            level=101;

            invalidate();

        而它的主要應用包括:光度學标定,希望數字圖像的灰階能夠真實反映圖像的實體特性;對比度增強和對比度擴充;顯示标定和輪廓線确定(門檻值化)。

        門檻值又稱為臨界值,它的目的是确定出一個範圍,然後這個範圍内的部分使用同一種方法處理,而門檻值之外的部分則使用另一種處理方法或保持原樣。常用的包括産生二值圖:當x<t時y=0,當x>=t時y=255(其中t是門檻值)。門檻值變換在生物學上的應用比較廣泛,常用語細胞圖像分割等。

        打開類向導(ctrl+w)生成選擇imageprocessingview類,ids選擇id_dys_yzbh後添加相應的函數。代碼如下:

        運作效果如下圖所示,感覺還挺好看的,顯然此時的直方圖就是0和255兩條直線。

【數字圖像處理】五.MFC圖像點運算之灰階線性變化、灰階非線性變化、門檻值化和均衡化處理詳解

        灰階均衡化的目的是使一輸入圖像轉換為在每一灰階級上都有相同的像素點(即輸出的直方圖是平的),它可以産生一幅灰階級分布機率均衡的圖像。

        換句話說,經過均衡化後的圖像在每一級灰階上像素點的數量相差不大,對應的灰階直方圖的每一級高度也相差不大。它是增強圖像的有效手段之一。

        研究思路是通過直方圖變換公式實作:

【數字圖像處理】五.MFC圖像點運算之灰階線性變化、灰階非線性變化、門檻值化和均衡化處理詳解

        它的步驟如下圖所示:

【數字圖像處理】五.MFC圖像點運算之灰階線性變化、灰階非線性變化、門檻值化和均衡化處理詳解

        例:有一幅圖象,共有16級灰階,其直方圖分布為pi, i=0,1,…,15,求經直方圖均衡化後,量化級别為10級的灰階圖象的直方圖分布qi,其中pi和qi為分布的機率,即灰階i出現的次數與總的點數之比。

        pi:0.03, 0, 0.06, 0.10, 0.20, 0.11, 0, 0, 0, 0.03, 0, 0.06, 0.10, 0.20, 0.11, 0

        步驟1:用一個數組s記錄pi,即s[0]=0.03,s[1]=0,s[2]=0.06,…,s[14]=0.11,s[15]=0

        步驟2:i從1開始,令s[i]=s[i]+s[i-1],得到的結果是s: 0.03,  0.03, 0.09,  0.19,  0.39, 0.50,  0.50,  0.50, 0.50,  0.53,  0.53, 0.59,  0.69,  0.89, 1.0,  1.0

        步驟3:用一個數組l記錄新的調色闆索引值,即令l[i]=s[i]×(10-1),得到的結果是l:0,0,1,2,4,5,5,5,5,5,5,5,6,8,9,9

        這樣就找到了原來的調色闆索引值和新的調色闆索引值之間的對應關系,即

        0→0,  1→0, 2→1,  3→2,  4→4, 5→5,  6→5,  7→5, 8→5,  9→5,  10→5, 11→5,  12→6,  13→8, 14→9,  15→9。

       步驟4:将老的索引值對應的機率合并,作為對應的新的索引值的機率。例如,原來的索引值0,1都對應了新的索引值0,則灰階索引值為0的機率為p0+p1=0.03;新的索引值3和7找不到老的索引值與之對應,是以令q3和q7為0。最後得到的結果是qi:0.03,  0.06, 0.10,  0,  0.20, 0.20, 

0.10,  0, 0.20,  0.11 

【數字圖像處理】五.MFC圖像點運算之灰階線性變化、灰階非線性變化、門檻值化和均衡化處理詳解

        代碼中有詳細注釋如下:

        運作結果如下圖所示,圖像增強而且異常清晰:

【數字圖像處理】五.MFC圖像點運算之灰階線性變化、灰階非線性變化、門檻值化和均衡化處理詳解
【數字圖像處理】五.MFC圖像點運算之灰階線性變化、灰階非線性變化、門檻值化和均衡化處理詳解

        最後介紹下圖像對比度拉伸,它就是把你感興趣的灰階範圍拉開,使得該範圍内像素,亮的更亮,暗的更暗,進而達到增強對比度的目的。

        如下圖所示,a、b、c為三段直線的斜率,g1old和g2old表示途中要進行對比度擴充的範圍,g1new和g2new表示對應的新值。當g1old=g2old就是二值圖像門檻值化處理。

【數字圖像處理】五.MFC圖像點運算之灰階線性變化、灰階非線性變化、門檻值化和均衡化處理詳解
【數字圖像處理】五.MFC圖像點運算之灰階線性變化、灰階非線性變化、門檻值化和均衡化處理詳解

          由于灰階界别也是255這個限制,是以滿足

【數字圖像處理】五.MFC圖像點運算之灰階線性變化、灰階非線性變化、門檻值化和均衡化處理詳解

       其中g1old=100,g2old=150,b=3.0的運作效果如下所示:

【數字圖像處理】五.MFC圖像點運算之灰階線性變化、灰階非線性變化、門檻值化和均衡化處理詳解

        最後還是希望文章對你有所幫助,如果文章有不足或錯誤之處,請海涵。最近挺忙的,寫這些古老的文章有人說在浪費青春,但我還是準備把這個系列講完,非常高興以前的代碼注釋和風格都不錯,回憶起來挺好的,希望你也能養成好的代碼和注釋風格~

繼續閱讀