影象卷積與濾波
參考資料:
1.卷積的基本概念
首先,我們有一個二維的濾波器矩陣(有個高大上的名字叫卷積核)和一個要處理的二維影象。然後,對於影象的每一個畫素點,計算它的鄰域畫素和濾波器矩陣的對應元素的乘積,然後加起來,作為該畫素位置的值。這樣就完成了濾波過程。
注意:卷積和協相關的差別是,卷積需要先對濾波矩陣進行180的翻轉,但如果矩陣是對稱的,那麼兩者就沒有什麼差別了。
對於濾波器,也有一定的規則要求:
- 濾波器的大小應該是奇數,這樣它才有一箇中心,例如3x3,5x5或者7x7。有中心了,也有了半徑的稱呼,例如5x5大小的核的半徑就是2。
- 濾波器矩陣所有的元素之和應該要等於1,這是為了保證濾波前後影象的亮度保持不變。當然了,這不是硬性要求了。
- 如果濾波器矩陣所有元素之和大於1,那麼濾波後的影象就會比原影象更亮,反之,如果小於1,那麼得到的影象就會變暗。如果和為0,影象不會變黑,但也會非常暗。
- 對於濾波後的結構,可能會出現負數或者大於255的數值。對這種情況,我們將他們直接截斷到0和255之間即可。對於負數,也可以取絕對值。
2.各個卷積核的使用效果
2.1 啥也不做
2.2 影象銳化濾波器(Sharpness Filter)
影象的銳化和邊緣檢測很像,首先找到邊緣,然後把邊緣加到原來的影象上面,這樣就強化了影象的邊緣,使影象看起來更加銳利了。這兩者操作統一起來就是銳化濾波器了,也就是在邊緣檢測濾波器的基礎上,再在中心的位置加1,這樣濾波後的影象就會和原始的影象具有同樣的亮度了,但是會更加銳利。
我們把核加大,就可以得到更加精細的銳化效果
另外,下面的濾波器會更強調邊緣:
主要是強調影象的細節。最簡單的3x3的銳化濾波器如下:
實際上是計算當前點和周圍點的差別,然後將這個差別加到原來的位置上。另外,中間點的權值要比所有的權值和大於1,意味著這個畫素要保持原來的值。
2.3 邊緣檢測(Edge Detection)
我們要找水平的邊緣。需要注意的是,這裡矩陣的元素和是0,所以濾波後的影象會很暗(數字影象中,255對應純白,0對應純黑)
,只有邊緣的地方是有亮度的。
為什麼這個濾波器可以尋找到水平邊緣呢?因為用這個濾波器卷積相當於求導的離散版本:你將當前的畫素值減去前一個畫素值,這樣你就可以得到這個函式在這兩個位置的差別或者斜率。下面的濾波器可以找到垂直方向的邊緣,這裡畫素上和下的畫素值都使用:
再下面這個濾波器可以找到45度的邊緣:取-2不為了什麼,只是為了讓矩陣的元素和為0而已。
那下面這個濾波器就可以檢測所有方向的邊緣:
為了檢測邊緣,我們需要在影象對應的方向計算梯度。用下面的卷積核來卷積影象,就可以了。但在實際中,這種簡單的方法會把噪聲也放大了。另外,需要注意的是,矩陣所有的值加起來要是0.
2.4 浮雕(Embossing Filter)
簡單看一下實現浮雕效果所使用的卷積核:
浮雕濾波器可以給影象一種3D陰影的效果。只要將中心一邊的畫素減去另一邊的畫素就可以了。這時候,畫素值有可能是負數,我們將負數當成陰影,將正數當成光,然後我們對結果影象加上128的偏移。這時候,影象大部分就變成灰色了。
下面是45度的浮雕濾波器
我們只要加大濾波器,就可以得到更加誇張的效果了
2.5 均值模糊(Box Filter)
我們可以將當前畫素和它的四鄰域的畫素一起取平均,然後再除以5,或者直接在濾波器的5個地方(注意:圖中卷積核中心寫錯了,應該是0.2)
取0.2的值即可,如下圖:
可以看到,這個模糊還是比較溫柔的,我們可以把濾波器變大,這樣就會變得粗暴了:注意要將和再除以13.
所以,如果你想要更模糊的效果,加大濾波器的大小即可。或者對影象應用多次模糊也可以。
2.6 高斯模糊(Gaussian Blur)
均值模糊很簡單,但不是很平滑。高斯模糊就有這個優點,所以被廣泛用在影象降噪上
。特別是在邊緣檢測之前,都會用來移除細節。高斯濾波器是一個低通濾波器。
2.7 運動模糊(Motion Blur)
簡單看一下實現浮雕效果所使用的卷積核:
運動模糊可以通過只在一個方向模糊達到,例如下面9x9的運動模糊濾波器。注意,求和結果要除以9。
這個效果就好像,攝像機是從左上角移動的右下角。
3.卷積的計算
對影象處理而言,存在兩大類的方法:空域處理和頻域處理!空域處理
是指直接對原始的畫素空間進行計算,頻率處理
是指先對影象變換到頻域,再做濾波等處理。
3.1 空域計算-直接2D卷積
-
計算方法:
直接2D卷積就是一開始說的那樣,對於影象的每一個畫素點,計算它的鄰域畫素和濾波器矩陣的對應元素的乘積,然後加起來,作為該畫素位置的值。
直接的實現也稱為暴力實現brute force,因為它嚴格按照定義來實現,沒有任何優化。當然了,在並行實現裡面,它也是比較靈活的。另外,也存在一個優化版本,如果我們的kernel是separable可分的,那麼就可以得到一個快5倍左右的卷積方法。
-
邊界處理
那摺積核遇到影象邊緣怎麼辦?例如影象頂部的畫素,它的上面已經沒有畫素了,那麼它的值如何計算?目前有四種主流的處理方法,我們用一維卷積和均值濾波來說明下。
我們在1D影象中,用每個畫素和它的二鄰域的平均值來取代它的值。假設我們有個1D的影象I是這樣的:對非影象邊界的畫素的操作比較簡單。假設我們對I的第四個畫素3做區域性平均。也就是我們用2,3和7做平均,來取代這個位置的畫素值。也就是,平均會產生一副新的影象J,這個影象在相同位置J (4) = (I(3)+I(4)+I(5))/3 = (2+3+7)/3 = 4。同樣,我們可以得到J(3) = (I(2)+I(3)+I(4))/3 =(4+2+3)/3 = 3。需要注意的是,新影象的每個畫素都取決於舊的影象,在計算J (4)的時候用J (3)是不對的,而是用I(3),I(4)和I(5)。所以每個畫素都是它和它鄰域兩個畫素的平均。平均是線性的操作,因為每個新的畫素都是舊畫素的線性組合。
對卷積,也有必須要考慮的情況是,在影象邊界的時候,怎麼辦?J(1)的值應該是什麼?它取決於I(0),I(1)和I(2)。但是我們沒有I(0)呀!影象左邊沒有值了。有四種方式來處理這個問題:
方法一:想象I是無限長的影象的一部分,除了我們給定值的部分,其他部分的畫素值都是0。在這種情況下,I(0)=0。所以J(1) = (I(0) + I(1) + I(2))/3 = (0 + 5 + 4)/3= 3. 同樣,J(10) = (I(9)+I(10)+I(11))/3 = (3+ 6 + 0)/3 = 3.
方法二:想象I是無限影象的一部分。但沒有指定的部分是用影象邊界的值進行擴充。在我們的例子中,因為影象I最左邊的值I(1)=5,所以它左邊的所有值,我們都認為是5 。而影象右邊的所有的值,我們都認為和右邊界的值I(10)一樣,都是6。這時候J(1) = (I(0) + I(1) + I(2))/3 = (5 + 5 + 4)/3= 14/3. 而J(10) = (I(9)+I(10)+I(11))/3 = (3 + 6 + 6)/3 = 5。
方法三:認為影象是週期性的。也就是I不斷的重複。週期就是I的長度。在我們這裡,I(0)和I(10)的值就是一樣的,I(11)的值和I(1)的值也是一樣的。所以J(1) = (I(0) + I(1) + I(2))/3= (I(10) + I(1)+ I(2))/3 = (6 + 5 + 4)/3 = 5 。
3.2 頻域計算-快速傅立葉變換FFT卷積
後面的部分還沒學習,詳見:http://blog.csdn.net/zouxy09/article/details/49080029
4.影象濾波
4.1 影象濾波的目的
濾波就是要去除沒用的資訊,保留有用的資訊,可能是低頻,也可能是高頻
4.2 影象的濾波方法
影象的濾波方法很多,主要可以分為頻率域法
和空間域法
兩大類。頻率域法的處理是在影象的某種變換域內,對影象的變換系數值進行運算,然後通過逆變換獲得增強影象。這是一種間接的影象濾波方法。空間濾波方法是一類直接的濾波方法,它在處理影象時直接對影象灰度作運算。
-
頻率域濾波
將影象從空間或時間域轉換到頻率域,再利用變換系數反映某些影象特徵的性質進行影象濾波。
傅立葉變換是一種常用的變換。在傅立葉變換域,頻譜的直流分量正比於影象的平均亮度,噪聲對應於頻率較高的區域,影象實體位於頻率較低的區域。影象在變換具有的這些內在特性可被用於影象濾波。可以構造一個低通濾波器,使低頻分量順利通過而有效地阻於高頻分量,即可濾除影象的噪聲,再經過反變換來取得平滑的影象。
低通的數學表示式如下所示:
F(u,v)表示原圖的在傅立葉域的影象
H(u,v)表示傳遞函式(即低通濾波器)
G(u,v)表示經過低通濾波的F(u,v)選擇適當的傳遞函式H (u, v)對頻率域低通濾波關係重大。常用的傳遞函式有
梯形函式
、指數函式
、巴特沃思函式
等。
頻域常用的幾種低通濾波器為:理想低通濾波器(Ideal circular Iow-passfilter)
、巴特沃思(Butterworth)低通濾波器
、指數低通濾波器
及梯形低通濾波器
。這些低通濾波器,都能在影象內有噪聲干擾成分時起到改善的作用。
平面空間域濾波
平面空間域濾波法主要分為兩類:
- 擬合影象的方法,包括n階多項式擬合、離散正交多項式擬合、二次曲面擬合等
- 平滑影象的方法,包括領域平均法、中值濾波法、梯度倒數加權法、選擇式掩模法等
平面空間域濾波主要使用兩種濾波器:
- 高通濾波器:邊緣提取與增強。邊緣區域的灰度變換加大,也就是頻率較高。所以,對於高通濾波,邊緣部分將被保留,非邊緣部分將被過濾
- 低通濾波:將會是邊緣部分變得平滑。
注意:高斯濾波是一種線性平滑濾波,即低通濾波,適用於消除高斯噪聲。
常用的高斯模板有如下幾種形式:
高斯模板中的引數是通過高斯函式計算出來的。計算高斯模板引數時,通過如下公式:
x的平方和y的平方分別表示的是鄰域內其他畫素與鄰域內中心畫素的距離,Sigmma代表的是標準差。
實驗效果圖:(後面補)
常見的低通濾波實驗效果圖
線性與非線性濾波
- 線性濾波:
線性濾波器的原始資料與濾波結果是一種算術運算,即用加減乘除等運算實現,如均值濾波器(模板內畫素灰度值的平均值)
、高斯濾波器(高斯加權平均值)
等。由於線性濾波器是算術運算,有固定的模板,因此濾波器的轉移函式是可以確定並且是唯一的(轉移函式即模板的傅立葉變換)。 - 非線性濾波:
非線性濾波器的原始資料與濾波結果是一種邏輯關係,即用邏輯運算實現,如最大值濾波器
、最小值濾波器
、中值濾波器
等,是通過比較一定鄰域內的灰度值大小來實現的,沒有固定的模板,因而也就沒有特定的轉移函式(因為沒有模板作傅立葉變換),另外,膨脹和腐蝕也是通過最大值、最小值濾波器實現的。五種常見的非線性濾波運算元,這五種濾波運算元對不同的影象都會有不同的作用,最常用的是中值濾波,因為它的效果最好且資訊損失的最少。- 極大值濾波:
極大值濾波就是選取畫素點領域的最大值作為改點的畫素值,有效率去了灰度值比較低的噪聲,也可作為形態學裡面的膨脹操作。 - 極小值濾波:
與極大值濾波相反。 - 中點濾波:
中點濾波器將鄰域的最大和最小值求平均來代替當前畫素點值。 - 中值濾波:
中值濾將鄰域內畫素點值排序,用序列中的中值取代當前畫素點值。可以消除影象中的長尾噪聲,例如負指數噪聲和椒鹽噪聲。 - 加權中值濾波(中值濾波的改進)
網上的解釋:
加權中值濾波是在中值濾波的基礎上加以改進,其效能在一定程度上優於中值濾波。
下面是自己在演算法上的改進,以例子說明:
若說選模板的大小為5,那麼這個模板就唯一確定為:
1 1 5 1 1
1 1 5 1 1
5 5 5 5 5
1 1 5 1 1
1 1 5 1 1
上圖中的數字表式改點畫素在序列中出現的次數。然後根據模板平滑影象。實驗證明該方法好於傳統中值濾波。自己的理解:
加權中值濾波就是在對鄰域畫素值進行排序時,有些畫素值讓它多出現幾次。比如上面的模板,就是讓與當前畫素點同行同列的畫素點的值都出現5次。
- 極大值濾波:
5.結語
影象的卷積核濾波是影象處理中比較基礎又很重要的部分,主要應用在去除影象噪聲,提取影象邊緣等場合。
文中如有不當之處歡迎留言。我們下次再見。
相關文章
- 【OpenCV學習】影象卷積濾波OpenCV卷積
- 卷積濾波器如何提取影象特徵卷積特徵
- [Python影象處理] 四.影象平滑之均值濾波、方框濾波、高斯濾波及中值濾波Python
- 影象的卷積和池化操作卷積
- OpencV_Python影象濾波函式小結OpenCVPython函式
- 點雲濾波器與過濾器過濾器
- Java 實現高斯模糊和影象的空間卷積Java卷積
- 影像處理中的valid卷積與same卷積卷積
- NodeJS卷積濾鏡處理圖片DemoNodeJS卷積
- 1.影像濾波與影像融合
- OpenCV計算機視覺學習(4)——影像平滑處理(均值濾波,高斯濾波,中值濾波,雙邊濾波)OpenCV計算機視覺
- Kalman濾波器的原理與實現
- 【OpenCV】鄰域濾波:方框、高斯、中值、雙邊濾波OpenCV
- 數字濾波器和模擬濾波器(一)
- 5.2.1.1 卷積卷積
- 卷積核卷積
- 由淺入深:CNN中卷積層與轉置卷積層的關係CNN卷積
- 卡爾曼濾波
- 數字訊號處理:線性卷積、迴圈卷積、圓周卷積計算卷積
- 卷積神經網路四種卷積型別卷積神經網路型別
- 5.2.1.3 卷積層卷積
- 1*1卷積卷積
- 卷積步長卷積
- OpenCV 線性濾波OpenCV
- 卷積神經網路:卷積層和池化層卷積神經網路
- 濾波演算法——十大濾波演算法程式大全演算法
- TF2.keras 實現基於卷積神經網路的影象分類模型TF2Keras卷積神經網路模型
- GitHub新專案:輕鬆使用多種預訓練卷積網路抽取影象特徵Github卷積特徵
- 深度可分離卷積卷積
- 卷積自編碼卷積
- 2.0 卷積網路卷積
- 引導濾波GuidedFilterGUIIDEFilter
- GLSL學習_高斯濾波
- Gabor濾波器學習
- 空域濾波演算法演算法
- LSTM的備胎,用卷積處理時間序列——TCN與因果卷積(理論+Python實踐)卷積Python
- TF2.keras 實現基於深度可分離卷積網路的影象分類模型TF2Keras卷積模型
- 用於影象分割的卷積神經網路:從R-CNN到Mark R-CNN卷積神經網路CNN