主要內容:函數
一、圖像的表示
spa
圖像是由一個個的像素表示的,一個圖像的像素點能夠用 (x,y) 來表示位置,v來表示像素值(灰度圖像的話表示一個0~255的值),所以整個圖像的表示就是 {(x,y,v)} 像素點的集合。我在以前看不少圖像處理的書,基本都是這樣介紹的,可是CMU的課件上提出了一個我認爲特別好的介紹,是把圖像做爲一個函數來介紹,f(x,y)=v,函數的自變量爲像素點位置,函數值爲像素值,畫出來的函數圖像以下(它把不一樣的像素值賦予了對應的顏色)。這個表示對後續的邊緣檢測、特徵點獲取理解幫助很大。
.net
圖像的變換基本有兩個方面,一是不改變大小,改變像素點的值(即改變函數f(x,y)的值),這個操做是基於像素點的(CMU課件2.0_Point_Processing這一節對此舉了很多例子 )。第二種是改變大小和像素值,這種操做通常能夠改爲描述爲兩部,第一步更改特定像素的值,第二步,在集合中刪除掉部分像素點。(好比高斯圖像金字塔)code
二、高斯濾波對象
爲何須要濾波?個人理解是使圖像更平滑(或者說更模糊),同時去除掉了一些噪聲的干擾,爲何能夠作到這樣,個人理解是濾波本質上至關於把一個像素的值,跟他周圍的像素值緊密聯繫起來,那麼一個干擾點會把他的干擾分散到周圍像素上,干擾強度縮小,而其自己受周圍像素影響,包含了周圍像素的特徵,干擾強度更是大大減少,所以干擾項便不存在。blog
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的矩形,矩形內的全部像素值的平均值。
ci
除了均值濾波,還有中值濾波比較常見(CMU課件上沒寫),並且我以前應用比較多,對其很有好感,中值濾波的原理其實根均值濾波同樣,畫一個矩陣,可是中值濾波中取的的是像素的中位數,這其實更適合去噪,由於咱們噪聲通常都是像素值比周圍突出的點(這樣咱們人眼才能看出來他是噪聲,若是隱藏在周圍像素點,隱藏的比較好,那就不是噪聲了),這樣中值化後,它就不存在了。而後就是CMU課件中瘋狂介紹的高斯濾波。博客
爲何是高斯濾波?首先須要明白高斯分佈,高中和本科數學都學過正態分佈,高斯分佈其實就是正態分佈,那麼正態分佈當初的那些性質就適合高斯分佈(關於正態分佈和高斯分佈的介紹請移步 http://blog.csdn.net/rns521/article/details/6953591)。經過上面的介紹,其實濾波操做就是對像素進行取周圍全部像素的加權和,根據經驗咱們知道距離該像素點越遠的點對當前像素影響越小,可是不管中值濾波仍是均值濾波均沒考慮纔到這一點,而一維高斯分佈值是經過終將向兩端不斷減小的,二維高斯分佈是向四面八方遞減,那麼把高斯分佈做爲濾波器,就能夠實現不一樣距離的像素點的影響不一樣這一目的。下圖左邊是二維高斯分佈,右邊是一維高斯分佈(兩張圖片來源於下述博客,此外關於高斯濾波的濾波矩陣推導見 http://blog.csdn.net/lonelyrains/article/details/46463987)。數學
那麼高斯濾波有什麼做用呢?CMU的課件給出了一個特別有意思的例子,就是去實現一個簡單的移軸攝影,就是怎麼樣把左邊的圖像變成右邊的圖像。其實很簡單,把第二幅圖像中跟第一幅圖像同樣清晰的像素塊取出來,加上第一幅圖像中剩餘的像素點,作一次高斯濾波。
課件上給出的解決方案:
三、圖像金字塔
提出圖像金字塔的主要目的是爲了壓縮圖像。好比把一個圖像壓縮到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 #加上偏差
四、邊緣檢測
什麼是邊緣?從圖像上來講是像素值的分解線,從第一小節中的二維函數圖像中來看,就是周圍函數值發生忽然變化的像素點就是邊緣。這樣目的就明確了,找到附近函數值變化比較大的點,高中學的導數的定義就是函數的變化率,導數大的地方函數值變化大。問題在於圖像函數是沒法用表達式表達出來,所以不能用既定的求導公式去計算,在高等數學的極限和中學數學中,咱們學過用下面這個公示去近似導數
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的這個特性,能夠更好的定位邊緣。