1. 程式人生 > >影象處理演算法其實都很簡單

影象處理演算法其實都很簡單

要學習高斯模糊我們首先要知道一些基本概念:

線性濾波與卷積的基本概念

      線性濾波可以說是影象處理最基本的方法,它可以允許我們對影象進行處理,產生很多不同的效果。做法很簡單。首先,我們有一個二維的濾波器矩陣(有個高大上的名字叫卷積核)和一個要處理的二維影象。然後,對於影象的每一個畫素點,計算它的鄰域畫素和濾波器矩陣的對應元素的乘積,然後加起來,作為該畫素位置的值。這樣就完成了濾波過程。

      對影象和濾波矩陣進行逐個元素相乘再求和的操作就相當於將一個二維的函式移動到另一個二維函式的所有位置,這個操作就叫卷積或者協相關。卷積和協相關的差別是,卷積需要先對濾波矩陣進行180的翻轉,但如果矩陣是對稱的,那麼兩者就沒有什麼差別了。

      Correlation 和 Convolution可以說是影象處理最基本的操作,但卻非常有用。這兩個操作有兩個非常關鍵的特點:它們是線性的,而且具有平移不變性shift-invariant。平移不變性指我們在影象的每個位置都執行相同的操作。線性指這個操作是線性的,也就是我們用每個畫素的鄰域的線性組合來代替這個畫素。這兩個屬性使得這個操作非常簡單,因為線性操作是最簡單的,然後在所有地方都做同樣的操作就更簡單了。

      實際上,在訊號處理領域,卷積有廣泛的意義,而且有其嚴格的數學定義,但在這裡不關注這個。

      2D卷積需要4個巢狀迴圈4-double loop,所以它並不快,除非我們使用很小的卷積核。這裡一般使用3x3或者5x5。而且,對於濾波器,也有一定的規則要求:

      1)濾波器的大小應該是奇數,這樣它才有一箇中心,例如3x3,5x5或者7x7。有中心了,也有了半徑的稱呼,例如5x5大小的核的半徑就是2。

      2)濾波器矩陣所有的元素之和應該要等於1,這是為了保證濾波前後影象的亮度保持不變。當然了,這不是硬性要求了。

      3)如果濾波器矩陣所有元素之和大於1,那麼濾波後的影象就會比原影象更亮,反之,如果小於1,那麼得到的影象就會變暗。如果和為0,影象不會變黑,但也會非常暗。

      4)對於濾波後的結構,可能會出現負數或者大於255的數值。對這種情況,我們將他們直接截斷到0和255之間即可。對於負數,也可以取絕對值。

神奇的卷積核

      上面說到,對影象的濾波處理就是對影象應用一個小小的卷積核,那這個小小的卷積核到底有哪些魔法。下面我們一起來領略下一些簡單但不簡單的卷積核的魔法。

1、啥也不做

      哈哈,大家可以看到啥了嗎?這個濾波器啥也沒有做,得到的影象和原圖是一樣的。因為只有中心點的值是1。鄰域點的權值都是0,對濾波後的取值沒有任何影響。

      下面我們動點真格的。

2、影象銳化濾波器Sharpness Filter

      影象的銳化和邊緣檢測很像,首先找到邊緣,然後把邊緣加到原來的影象上面,這樣就強化了影象的邊緣,使影象看起來更加銳利了。這兩者操作統一起來就是銳化濾波器了,也就是在邊緣檢測濾波器的基礎上,再在中心的位置加1,這樣濾波後的影象就會和原始的影象具有同樣的亮度了,但是會更加銳利。

      我們把核加大,就可以得到更加精細的銳化效果

      另外,下面的濾波器會更強調邊緣:

      主要是強調影象的細節。最簡單的3x3的銳化濾波器如下:

                                      

      大家應該也看出來了,銳化濾波器實際上就是計算當前點和周圍點的差別,然後將這個差別加到原來的位置上。

3、邊緣檢測Edge Detection

      我們要找水平的邊緣:需要注意的是,這裡矩陣的元素和是0,所以濾波後的影象會很暗,只有邊緣的地方是有亮度的。

      為什麼這個濾波器可以尋找到水平邊緣呢?因為用這個濾波器卷積相當於求導的離散版本:你將當前的畫素值減去前一個畫素值,這樣你就可以得到這個函式在這兩個位置的差別或者斜率。下面的濾波器可以找到垂直方向的邊緣,這裡畫素上和下的畫素值都使用:

      再下面這個濾波器可以找到45度的邊緣:取-2不為了什麼,只是為了讓矩陣的元素和為0而已。

      那下面這個濾波器就可以檢測所有方向的邊緣:

                                      

      為了檢測邊緣,我們需要在影象對應的方向計算梯度。用下面的卷積核來卷積影象,就可以了。但在實際中,這種簡單的方法會把噪聲也放大了。另外,需要注意的是,矩陣所有的值加起來要是0.

                                       

4、浮雕Embossing Filter

      浮雕濾波器可以給影象一種3D陰影的效果。只要將中心一邊的畫素減去另一邊的畫素就可以了。這時候,畫素值有可能是負數,我們將負數當成陰影,將正數當成光,然後我們對結果影象加上128的偏移。這時候,影象大部分就變成灰色了。

      下面是45度的浮雕濾波器

      我們只要加大濾波器,就可以得到更加誇張的效果了

      這種效果非常的漂亮,就像是將一副影象雕刻在一塊石頭上面一樣,然後從一個方向照亮它。它和前面的濾波器不同,它是非對稱的。另外,它會產生負數值,所以我們需要將結果偏移,以得到影象灰度的範圍。

                                                      A:原影象。B:銳化。C:邊緣檢測。D:浮雕

5、運動模糊Motion Blur

      運動模糊可以通過只在一個方向模糊達到,例如下面9x9的運動模糊濾波器。注意,求和結果要除以9。

      這個效果就好像,攝像機是從左上角移動的右下角。

看了一些好玩的濾波器後我們可以進入主題了,首先來看均值模糊:

均值模糊Box Filter (Averaging)

      我們可以將當前畫素和它的四鄰域的畫素一起取平均,然後再除以5,或者直接在濾波器的5個地方取0.2的值即可,如下圖:

      可以看到,這個模糊還是比較溫柔的,我們可以把濾波器變大,這樣就會變得粗暴了:注意要將和再除以13.

      所以,如果你想要更模糊的效果,加大濾波器的大小即可。或者對影象應用多次模糊也可以。

高斯模糊

      其實模糊濾波器就是對周圍畫素進行加權平均處理,均值模糊很簡單,周圍畫素的權值都相同,所以不是很平滑。高斯模糊就有這個優點,所以被廣泛用在影象降噪上。特別是在邊緣檢測之前,都會用來移除細節。那麼下面我們就看看高斯模糊的權值是如何分配的。

正態分佈的權重   正態分佈顯然是一種可取的權重分配模式。在圖形上,正態分佈是一種鐘形曲線,越接近中心,取值越大,越遠離中心,取值越小。計算平均值的時候,我們只需要將"中心點"作為原點,其他點按照其在正態曲線上的位置,分配權重,就可以得到一個加權平均值。 高斯函式   上面的正態分佈是一維的,影象都是二維的,所以我們需要二維的正態分佈 正態分佈的密度函式叫做"高斯函式"(Gaussian function)。它的一維形式是: 一維形式   其中,μ是x的均值,σ是x的標準差。因為計算平均值的時候,中心點就是原點,所以μ等於0。即: 進一步推導   根據一維高斯函式,可以推導得到二維高斯函式: 二維高斯函式   有了這個函式 ,就可以計算每個點的權重了。   假定中心點的座標是(0,0),那麼距離它最近的8個點的座標如下: 權重矩陣   更遠的點以此類推。下面就是5*5的高斯濾波器和平滑效果:

相關推薦

影象處理演算法其實簡單

要學習高斯模糊我們首先要知道一些基本概念: 線性濾波與卷積的基本概念       線性濾波可以說是影象處理最基本的方法,它可以允許我們對影象進行處理,產生很多不同的效果。做法很簡單。首先,我們有一個二維的濾波器矩陣(有個高大上的名字叫卷積核)和一個要處理的二維影象。然

「資料結構與演算法 2」| 單鏈表其實真的簡單

寫在之前 在程式設計裡,我們經常需要將同為某個型別的一組資料元素作為一個整體來使用,需要建立這種元素組,用變數來記錄它們或者傳入函式等等等等,「線性表」就是這樣一組元素的抽象,它是某類元素的集合並且記錄著元素之間一種順序關係,是最基本的資料結構之一,在實際程式中

shell程式設計其實真的簡單(一)

如今,不會Linux的程式設計師都不意思說自己是程式設計師,而不會shell程式設計就不能說自己會Linux。說起來似乎shell程式設計很屌啊,然而不用擔心,其實shell程式設計真的很簡單。 背景 什麼是shell程式設計 高大上的解釋,往往讓人摸不住頭腦。一句話概括就是:shell

shell程式設計其實真的簡單(二)

上篇我們學會了如何使用及定義變數。按照尿性,一般接下來就該學基本資料型別的運算了。 沒錯,本篇就仍是這麼俗套的來講講這無聊但又必學的基本資料型別的運算了。 基本資料型別運算 操作符 符號 語義 描述 + 加 10+10,結果為20 - 減 10-3, 結果為7 * 乘 10*2,結果

shell程式設計其實真的簡單(三)

通過前兩篇文章,我們掌握了shell的一些基本寫法和變數的使用,以及基本資料型別的運算。那麼,本次就將要學習shell的結構化命令了,也就是我們其它程式語言中的條件選擇語句及迴圈語句。 不過,在學習shell結構化命令的時候,我們又會發現它與其它程式設計的語言相比存在不小的區別。下面就開

影象處理演算法工程師——必備技能總結

                                 影象處理演算法工程師   職位要

shell程式設計其實真的簡單(五)

通過前幾篇文章的學習,我們學會了shell的基本語法。在linux的實際操作中,我們經常看到命令會有很多引數,例如:ls -al 等等,那麼這個引數是怎麼處理的呢? 接下來我們就來看看shell指令碼對於使用者輸入引數的處理。 命令列引數處理 根據引數位置獲取引

shell程式設計其實真的簡單(四)

上篇我們學習了shell中條件選擇語句的用法。接下來本篇就來學習迴圈語句。在shell中,迴圈是通過for, while, until命令來實現的。下面就分別來看看吧。 for for迴圈有兩種形式: for-in語句 基本格式如下: for var in li

影象處理演算法之美顏

       和濾鏡一樣,美顏也是影象類app必不可少的功能之一,也有的app叫人像美容,主要包括美膚及美白等幾大功能。甚至有很多專門美顏的app,比如美顏相機什麼的,可見美顏功能需求量之大。很多女孩

影象處理演算法4——Sobel 邊緣檢測運算元

Sobel 運算元是一個離散微分運算元 (discrete differentiation operator)。 它結合了高斯平滑和微分求導,用來計算影象灰度函式的近似梯度。     影象邊緣,相素值會發生顯著的變化了。表示這一改變的一個方法是使用 導數 。 梯度值的大

影象處理演算法2——Otsu最佳閾值分割法

    Otsu法是1979年由日本大津提出的。該方法在類間方差最大的情況下是最佳的,即統計鑑別分析中所用的度量。Otsu方法有一個重要的特性,就是它完全以在一幅影象的直方圖上執行計算為基礎,而直方圖是很容易得到的一維陣列。     具體的公式推理及公式細節就不說了,詳見 Conzalez 那本書,我是第三

汽車輔助駕駛系統中的影象處理演算法

http://www.szaeia.com/NewsShow/2cf277eb-3a8e-4e6d-a7b7-03658f3eb5c6.htm 影像演算法瓶頸突破 汽車ADAS再進化 近年來,世界各國的交通主管單位皆大力倡導「防禦駕駛」,所謂防禦駕駛是一種預測危機並協助

影象處理演算法基礎(七)---形態學邊界提取

    形態學一般是使用二值影象,進行邊界提取,骨架提取,孔洞填充,角點提取,影象重建。     基本的演算法:膨脹腐蝕,開操作,閉操作,擊中擊不中變換      邊界提取主要涉及腐蝕和求補集操作 程式碼如下: int  picProcessBasics::IMGEdge

影象處理演算法——卷積

本文索引: 一、 什麼是卷積?       在影象處理中,卷積操作指的是使用一個卷積核對影象中的每個畫素進行一系列操作。       卷積核(運算元)是用來做影象處理時的矩陣,影象處理時也稱為掩膜,是與原影象做運算的引數。卷積核通常

影象處理演算法】--1.SAD算放的理解

SAD演算法即為sum of absolute difference 以左影象為中心,選定合適的視窗大小blockSize,求取各個畫素點的灰度值。 在右影象中以相同大小的視窗求取各個畫素點的灰度值,以左影象的視窗灰度值減去右影象的灰度值,取絕對值後相加。遍歷整個ROI,找到最小的值,即為合

關於影象處理演算法的那些事

· 能從硬體結構方面消除不利影響,最好不要從影象演算法方面消除不利影響(預防隱患法則) · 截至目前為止,影象演算法沒有一個標準的演算法流程適合所有的影象處理,所以具體問題具體分析 · 影象演算法處理的實際應用遵循海森堡不確定性原則,所以在實際應用中不斷優化演算法十分必要

影象處理演算法

具體實現時,首先根據初始開關函式將輸入圖逐個影象分為前景和 背景,在第一遍對影象掃描結束後,平均兩個積分器的值以確定一個閾值。用這個閾值控制開關再次將輸入圖分為前景和背景,並用做新的開關函式。如此反覆迭帶 直到開關函式不在發生變化,此時得到的前景和背景即為最終分割結果。迭代所得的閾值分割的影象效果良好。基

opencv影象處理的一些常用函式簡單使用

``` //用到opencv 中的函式時往往會一時記不起這個函式的具體引數怎麼設定,故在此將常用函式做一彙總; Mat srcImage = imread("C:/Users/Administrator/Desktop/車牌識別/車牌影象庫/1.jpg

影象處理演算法(四)---邊緣檢測

影象處理領域中涉及很多特徵,角點特徵,邊緣特徵,形狀特徵,紋理特徵,顏色特徵,直方圖統計特徵等等(還有很多^_^)。這些特徵有些是比較底層的特徵,如角點特徵,邊緣特徵,顏色特徵等,有些則是較為高層的特徵,如形狀特徵,紋理特徵,直方圖統計特徵。       這裡我們主要談論底

影象處理演算法之瘦臉及放大眼睛

       現在很多影象美顏app,處理後不但使人物面板變得平滑、白皙,還會稍微瘦下臉、放大眼睛,給人眼前一亮的感覺。這其中涉及人臉檢測及特徵點提取演算法,一般提取68個特徵點就足夠了,同時也涉及影