第二章 基本圖像處理(Image Processing)


主要內容:

  1. 圖像的表示----介紹圖像是如何表示的,以及所有基本操作的作用對象
  2. 高斯濾波-----濾波操作的原理與應用
  3. 圖像金字塔-----高斯和拉普拉斯
  4. 邊緣檢測-----Sobel算子和Laplace算子

 


1、圖像的表示

       圖像是由一個個的像素表示的,一個圖像的像素點可以用 (x,y) 來表示位置,v來表示像素值(灰度圖像的話表示一個0~255的值),因此整個圖像的表示就是 {(x,y,v)} 像素點的集合。我在之前看很多圖像處理的書,基本都是這樣介紹的,但是CMU的課件上提出了一個我認為特別好的介紹,是把圖像作為一個函數來介紹,f(x,y)=v,函數的自變量為像素點位置,函數值為像素值,畫出來的函數圖像如下(它把不同的像素值賦予了對應的顏色)。這個表示對后續的邊緣檢測、特征點獲取理解幫助很大。

 

 

      圖像的變換基本有兩個方面,一是不改變大小,改變像素點的值(即改變函數f(x,y)的值),這個操作是基於像素點的(CMU課件2.0_Point_Processing這一節對此舉了不少例子 )。第二種是改變大小和像素值,這種操作一般可以改成描述為兩部,第一步更改特定像素的值,第二步,在集合中刪除掉部分像素點。(比如高斯圖像金字塔)

 

2、高斯濾波

      為什么需要濾波?我的理解是使圖像更平滑(或者說更模糊),同時去除掉了一些噪聲的干擾,為什么可以做到這樣,我的理解是濾波本質上相當於把一個像素的值,跟他周圍的像素值緊密聯系起來,那么一個干擾點會把他的干擾分散到周圍像素上,干擾強度縮小,而其本身受周圍像素影響,包含了周圍像素的特征,干擾強度更是大大減小,因此干擾項便不存在。

     OK,CMU的課件上來講了一個均值濾波的例子(CMU課件2.0_Box_Filter)。均值濾波的濾波器是左下這種樣子的,濾波操作的公式

               

      濾波操作的基本公式如下:h[m,n]是經過濾波操作之后,(m,n)位置處的像素值,相當於f(m+k,n+l)*g(k,l)的和,k,l是濾波器的大小,g(0,0)是中心位置。均值濾波其實就是把每個像素值,變成已它為中心,繪制1個3*3的矩形,矩形內的所有像素值的平均值。

                                    

 

     除了均值濾波,還有中值濾波比較常見(CMU課件上沒寫),而且我之前應用比較多,對其頗有好感,中值濾波的原理其實根均值濾波一樣,畫一個矩陣,但是中值濾波中取的的是像素的中位數,這其實更適合去噪,因為我們噪聲一般都是像素值比周圍突出的點(這樣我們人眼才能看出來他是噪聲,如果隱藏在周圍像素點,隱藏的比較好,那就不是噪聲了),這樣中值化后,它就不存在了。然后就是CMU課件中瘋狂介紹的高斯濾波。

     為什么是高斯濾波?首先需要明白高斯分布,高中和本科數學都學過正態分布,高斯分布其實就是正態分布,那么正態分布當初的那些性質就適合高斯分布(關於正態分布和高斯分布的介紹請移步  http://blog.csdn.net/rns521/article/details/6953591)。通過上面的介紹,其實濾波操作就是對像素進行取周圍所有像素的加權和,根據經驗我們知道距離該像素點越遠的點對當前像素影響越小,但是無論中值濾波還是均值濾波均沒考慮才到這一點,而一維高斯分布值是通過終將向兩端不斷減少的,二維高斯分布是向四面八方遞減,那么把高斯分布作為濾波器,就可以實現不同距離的像素點的影響不同這一目的。下圖左邊是二維高斯分布,右邊是一維高斯分布(兩張圖片來源於下述博客,此外關於高斯濾波的濾波矩陣推導見 http://blog.csdn.net/lonelyrains/article/details/46463987)。

   

    那么高斯濾波有什么作用呢?CMU的課件給出了一個特別有意思的例子,就是去實現一個簡單的移軸攝影,就是怎么樣把左邊的圖像變成右邊的圖像。其實很簡單,把第二幅圖像中跟第一幅圖像一樣清晰的像素塊取出來,加上第一幅圖像中剩余的像素點,做一次高斯濾波。

課件上給出的解決方案:

 

3、圖像金字塔

      提出圖像金字塔的主要目的是為了壓縮圖像。比如把一個圖像壓縮到1/2,可以怎么辦?

      高斯金字塔解決方案:1、將原圖做一次高斯濾波  2、把做完高斯濾波圖像的所有偶數行列全去掉。

      整個方法看上去很不錯,但是存在一個問題,怎么還原?我們先復原大小(位置值先用0表示,然后再做一次類似逆濾波的操作),但是這個時候還原回去之后,數據會存在誤差。Laplacian金字塔就是把誤差保存下來——其實是每次高斯濾波之后丟棄的數據。用代碼去實現整個壓縮過程如下:

 

for i from 0 to sacle:
     li=blur(fi) #對圖像fi做一次濾波
     hi=li-fi #保存丟失信息,Laplacian金字塔
     fi+1=subSample(li)  #更改圖像大小

######復原代碼
for i for scale to 0:
     li=unSample(fi) #大小復原
     fi+1=li+hi #加上誤差

 

4、邊緣檢測

      什么是邊緣?從圖像上來說是像素值的分解線,從第一小節中的二維函數圖像中來看,就是周圍函數值發生突然變化的像素點就是邊緣。這樣目的就明確了,找到附近函數值變化比較大的點,高中學的導數的定義就是函數的變化率,導數大的地方函數值變化大。問題在於圖像函數是無法用表達式表達出來,因此不能用既定的求導公式去計算,在高等數學的極限和中學數學中,我們學過用下面這個公示去近似導數

                                                        

 

      CMU的課件(4.0_Image_Gradients_And_Gradient_Filtering)中列出了下面的一個例子,假設下面這一行數據是某個圖像中的x方向一行的像素值,利用近似導數的方法求某個像素點附件的x導數,其實相當於乘以了右側的過濾器。假設成了多個過濾器,即跟X在同一列上的相鄰像素的近似梯度值,這樣,如果這個梯度值比較大,其實就相當於這塊有一條近似垂直的邊界線(y方向)。

         

     圖像都是二維的,因此求x方向梯度值大的求出來都是近似垂直的邊界,同時需要再利用同樣的方法在求一遍y方向的梯度值變化,最后把梯度值轉換成灰度值。這就是Sobel算子的原理

     

      在CMU的課件中,還提到了一點,當然也是實際應用中非常重要的一點,Sobel算子對噪聲比教敏感,因此需要在處理之前進行去噪(高斯濾波等)。

      在介紹完Sobel算子之后,CMU的課件又介紹了Laplace過濾器。Laplace的原理在於求像素點的二階導數(實際上是二階梯度,表達式沒有,二階導數求不出來o(╯□╰)o),二階導數是對一階導數求導的結果,二階導數為0,意味着一階導數再次取到了極值,一階導數表示灰度值的變換情況,一階導數取到了極值,也就是說原圖在此灰度值變換巨大。下圖是截取自CMU課件中關於Laplace過濾器推倒的過程。

     

  下面這張圖展示了圖像經過Sobel算子和Laplace過濾器之后的不同,可以看到利用Laplace過濾器的中間為0的這個特性,可以更好的定位邊緣。

  

 

 

 

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM