熱線電話:0755-23712116
郵箱:contact@legoupos.cn
地址:深圳市寶(bao)安區沙井街(jie)道后亭茅(mao)洲山工業(ye)園(yuan)(yuan)工業(ye)大廈全至科(ke)技創新園(yuan)(yuan)科(ke)創大廈2層2A
前面介(jie)紹的(de)(de)(de)(de)幾(ji)種濾(lv)波(bo)器(qi)(qi)(qi)都屬于平滑(hua)(hua)濾(lv)波(bo)器(qi)(qi)(qi)(低通濾(lv)波(bo)器(qi)(qi)(qi)),用(yong)來(lai)平滑(hua)(hua)圖像和(he)(he)抑(yi)制(zhi)噪聲(sheng)的(de)(de)(de)(de);而銳化空間濾(lv)波(bo)器(qi)(qi)(qi)恰恰相反,主(zhu)要(yao)用(yong)來(lai)增(zeng)強圖像的(de)(de)(de)(de)突變(bian)信(xin)息,圖像的(de)(de)(de)(de)細節和(he)(he)邊緣信(xin)息。平滑(hua)(hua)濾(lv)波(bo)器(qi)(qi)(qi)主(zhu)要(yao)是使用(yong)鄰域的(de)(de)(de)(de)均值(或(huo)者中值)來(lai)代替模板中心的(de)(de)(de)(de)像素,消弱和(he)(he)鄰域間的(de)(de)(de)(de)差別,以達到平滑(hua)(hua)圖像和(he)(he)抑(yi)制(zhi)噪聲(sheng)的(de)(de)(de)(de)目的(de)(de)(de)(de);相反,銳化濾(lv)波(bo)器(qi)(qi)(qi)則使用(yong)鄰域的(de)(de)(de)(de)微分作為算子(zi),增(zeng)大鄰域間像素的(de)(de)(de)(de)差值,使圖像的(de)(de)(de)(de)突變(bian)部分變(bian)的(de)(de)(de)(de)更(geng)加明顯。
本位主要介紹了一下幾點內容(rong):
? 圖像(xiang)的一(yi)階微分和二階微分的性質
? 幾種常見的一(yi)階(jie)微分算子
? 二(er)階(jie)微分算子 - Laplace 拉(la)普拉(la)斯(si)算子
? 一階微分(fen)算(suan)(suan)子和二階微分(fen)算(suan)(suan)子得到(dao)邊(bian)緣的對比
一階微分和二階微分的性質
既然是基于一(yi)階(jie)微分和二(er)階(jie)微分的銳化空間(jian)濾波器,那么首(shou)先(xian)就要了(le)解下一(yi)階(jie)和二(er)階(jie)微分的性質。
圖(tu)像的(de)(de)銳化(hua)也就是(shi)增強圖(tu)像的(de)(de)突(tu)變部(bu)分(fen)(fen)(fen),那么我們(men)也就對(dui)圖(tu)像的(de)(de)恒定區域中,突(tu)變的(de)(de)開始點與結束點(臺(tai)階和斜坡突(tu)變)及沿著(zhu)灰度斜坡處的(de)(de)微(wei)分(fen)(fen)(fen)的(de)(de)性(xing)質(zhi)。微(wei)分(fen)(fen)(fen)是(shi)對(dui)函數局部(bu)變化(hua)率(lv)的(de)(de)一種表示,那么對(dui)于一階微(wei)分(fen)(fen)(fen)有以下幾(ji)個性(xing)質(zhi):
? 在恒(heng)定的灰度(du)區(qu)域(yu),圖(tu)像的微(wei)(wei)分值為(wei)0.(灰度(du)值沒(mei)有發(fa)生變換,自(zi)然微(wei)(wei)分為(wei)0)
? 在灰(hui)度臺階(jie)(jie)或斜坡起(qi)點處微分值(zhi)不為0.(臺階(jie)(jie)是,灰(hui)度值(zhi)的突變(bian)(bian)變(bian)(bian)化(hua)較大;斜坡則是灰(hui)度值(zhi)變(bian)(bian)化(hua)較緩慢;灰(hui)度值(zhi)發生了(le)變(bian)(bian)化(hua),微分值(zhi)不為0)
? 沿著斜坡的微分值(zhi)不為0.
二階微(wei)分(fen),是一(yi)階微(wei)分(fen)的導(dao)數,和一(yi)階微(wei)分(fen)相對應,也有以下幾點性質:
? 在恒定區(qu)域二階(jie)微分(fen)值為0
? 在灰度臺階或斜坡的起點(dian)處微分值不(bu)為0
? 沿著斜坡的微分值為0.
從以上圖像灰(hui)(hui)度(du)(du)的(de)一(yi)階(jie)和(he)二階(jie)微(wei)分(fen)(fen)的(de)性(xing)質(zhi)可(ke)以看出,在灰(hui)(hui)度(du)(du)值變(bian)化的(de)地(di)方(fang)(fang),一(yi)階(jie)微(wei)分(fen)(fen)和(he)二階(jie)微(wei)分(fen)(fen)的(de)值都(dou)不為(wei)0;在灰(hui)(hui)度(du)(du)恒定的(de)地(di)方(fang)(fang),微(wei)分(fen)(fen)值都(dou)為(wei)0.也(ye)就(jiu)是(shi)說,不論是(shi)使(shi)用一(yi)階(jie)微(wei)分(fen)(fen)還是(shi)二階(jie)微(wei)分(fen)(fen)都(dou)可(ke)以得到圖像灰(hui)(hui)度(du)(du)的(de)變(bian)化值。
圖像可以看著是二維離散函數,對于圖像的一階微分其計算公式如下:
在x方向,
在y方向,
對于二階微分有:
在x方向,
在y方向,
對于 圖像邊緣處的灰度值來說,通常有(you)兩種突變形(xing)式:
? 邊(bian)緣兩邊(bian)圖像灰度差異較(jiao)大,這就形成了灰度臺階。在臺階處,一階微分(fen)(fen)和二階微分(fen)(fen)的值(zhi)都不為(wei)0.
? 邊緣兩邊圖像(xiang)灰度(du)(du)變化不(bu)(bu)如臺階(jie)(jie)(jie)(jie)那么(me)劇烈,會形成一個緩慢(man)變換(huan)的灰度(du)(du)斜(xie)坡。在斜(xie)坡的起點和終點一階(jie)(jie)(jie)(jie)微(wei)分(fen)和二(er)階(jie)(jie)(jie)(jie)微(wei)分(fen)的值都不(bu)(bu)為0,但是沿著斜(xie)坡一階(jie)(jie)(jie)(jie)微(wei)分(fen)的值不(bu)(bu)為0,而(er)二(er)階(jie)(jie)(jie)(jie)微(wei)分(fen)的值為0.
對于圖像的邊緣來說,通常會形成一個斜坡過度。一階微分在斜坡處的值不為0,那么用其得到的邊緣較粗;而二階微分在斜坡處的值為0,但在斜坡兩端值不為0,且值得符號不一樣,這樣二階微分得到的是一個由0分開的一個像素寬的雙邊緣。也就說,二(er)階(jie)微分在(zai)增強圖像細節方面比一階(jie)微分好得多,并且在(zai)計算(suan)上(shang)也要比一階(jie)微分方便。
梯度圖
在圖像處理中的一階微分通常使用梯度的幅值來實現。對于圖像,
在坐標
處(chu)的梯(ti)度是一(yi)個(ge)列向量(liang)
該向量表示圖像中的像素在點處灰度值的最大變化率的方向。
向量的幅值就是圖像
的梯度圖,記為
是和原圖像
同大(da)小(xiao)的圖像。由(you)于求平(ping)方的根運算比較費時,通常(chang)可以使用(yong)絕對值(zhi)的和來近似
從上面可(ke)以(yi)(yi)看出,要得到圖像的(de)梯度(du)圖,有以(yi)(yi)下步驟:
? 圖像在x方向的梯度
? 圖像在y方向的梯度
?
一階梯度算子
圖像(xiang)是以離(li)散的(de)形式存儲,通常使用差分(fen)來計算圖像(xiang)的(de)微分(fen),常見的(de)計算梯度的(de)模板有以下幾種(zhong)
? 根(gen)據梯(ti)度的定(ding)義
可以得到模板 和
。
使用(yong)該方(fang)法(fa)計(ji)算的(de)圖像(xiang)的(de)梯度(du)只(zhi)是考慮單個(ge)像(xiang)素的(de)差(cha)值,并沒有(you)利用(yong)到圖像(xiang)的(de)像(xiang)素的(de)鄰域特性(xing)。
? Robert交叉算子
在圖像處理的過程中,不會只單獨的對圖像中的某一個像素進行運算,通常會考慮到每個像素的某個鄰域的灰度變化。因此,通常不會簡單的利用梯度的定義進行梯度的計算,而是在像素的某個鄰域內設置梯度算子。考慮,區域(yu)的像素,使用如下矩陣表示:
令中心點表示圖像中任一像素,那么根據梯度的定義,
在在x和y方向的梯度分別為:
和
,梯度圖像(xiang)M(x,y)
根據(ju)上述公式,Robert在1965年提出的Robert交叉算(suan)子
? Sobel算子
Robert交叉算子的尺寸是偶數,偶數尺寸濾波器沒有對稱中心計算效率較低,所以通常濾波器的模板尺寸是奇數。仍以為例,以
為對(dui)稱中心(xin)(表(biao)示圖像(xiang)中的(de)任一像(xiang)素),有
利用上述公式(shi)可以得(de)到(dao)如(ru)下兩(liang)個卷積模板,分別計算圖像在x和(he)y風向的梯度
第(di)一(yi)個模(mo)板,第(di)三行和第(di)一(yi)行的(de)差近似x方向(xiang)的(de)偏微分(fen);第(di)二個模(mo)板,第(di)三列和第(di)一(yi)列的(de)差近似y方向(xiang)的(de)偏微分(fen),而且模(mo)板的(de)所有系數只(zhi)和為(wei)0,表示恒定灰度區域的(de)響應(ying)為(wei)0.
基于OpenCV的一階梯度算子實現
? Sobel算子
在OpenCV中封(feng)裝(zhuang)了(le)Sobel算子,其函數為Sobel。使(shi)用Sobel能夠(gou)很方(fang)便的(de)(de)計算任(ren)意尺寸的(de)(de)x和y方(fang)向(xiang)的(de)(de)偏微分(fen),具體如下:
void sobel_grad(const Mat &src, Mat &dst)
{
Mat grad_x, grad_y;
Sobel(src, grad_x, CV_32F, 1, 0);
Sobel(src, grad_y, CV_32F, 0, 1);
//convertScaleAbs(grad_x, grad_x);
//convertScaleAbs(grad_y, grad_y);
//addWeighted(grad_x, 0.5, grad_y, 0.5, 0, dst);
magnitude(grad_x, grad_y, dst);
convertScaleAbs(dst, dst);
}
上述代碼中調用Sobel分別得到圖像在x和y方向的偏微分和
,然后相加得到得到圖像的梯度圖。
其余的幾個函數說明,convertScaleAbs將圖像類型轉換為CV_8U;addWeighted按一定的權值將兩個圖像相加;magnitude求兩個圖像的幅值,其公式為,具體的參(can)數說明可參(can)考(kao)OpenCV的官方文檔。
? 基于定義和Robert交叉算子的計算
對(dui)于這兩種(zhong)算子,OpenCV中(zhong)并沒有提供(gong)具體的(de)函數,不過可(ke)以利(li)用filter2D函數來實現。filter2D是OpenCV中(zhong)對(dui)圖像進行卷積運算的(de)一個很重要的(de)函數,該函數能夠使用任意的(de)線性卷積核對(dui)圖像進行卷積運算。
void robert_grad(const Mat& src, Mat &dst)
{
Mat grad_x, grad_y;
Mat kernel_x = (Mat_<float>(2, 2) << -1, 0,0,1);
Mat kernel_y = (Mat_<float>(2, 2) << 0, -1, 1, 0);
filter2D(src, grad_x, CV_32F, kernel_x);
filter2D(src, grad_y, CV_32F, kernel_y);
//convertScaleAbs(grad_x, grad_x);
//convertScaleAbs(grad_y, grad_y);
//addWeighted(grad_x, 1, grad_y, 1, 0, dst);
magnitude(grad_x, grad_y, dst);
convertScaleAbs(dst, dst);
}
構造好Robert交叉算(suan)子,然后調用filter2D即可;基(ji)于(yu)定義(yi)的計算(suan)方法于(yu)此類似,不在(zai)贅述(shu)。
結果三種方法計算得到的梯度圖,如下:
從上面結果可以(yi)看出,Robert交叉(cha)算(suan)子和基(ji)于(yu)(yu)定義得(de)到(dao)的邊(bian)緣圖,得(de)到(dao)的邊(bian)緣較細并且不是很連續;Sobel得(de)到(dao)邊(bian)緣較粗,線條連續,效果明顯好于(yu)(yu)其他的兩種(zhong)算(suan)子。
二階微分算子 - LapLace 拉普拉斯算子
二階微(wei)分算(suan)子的(de)代表就是拉普(pu)拉斯算(suan)子,其(qi)定義如下:
其中:
對于上述的區域,則有
其得到的模板如下:
注意(yi),模(mo)板中心(xin)的符號,并且(qie)模(mo)板的所有系(xi)數之和為0.
在OpenCV中有對LapLace的封裝,其函數為Laplacian,其使用的模板中心的系數為負,具體參數說明參見OpenCV文檔,其得到的邊緣圖和一階微分算子得到邊緣圖對比結果如下:
? 一(yi)階(jie)微分(fen)算子(zi)Sobel得到的邊緣較(jiao)粗
? 二階微分算(suan)子Laplace得到的(de)邊緣則較細(xi),并且邊緣是雙邊緣
? Lpalace算子對噪聲(sheng)比較敏感,得到(dao)的(de)邊緣圖(tu)像上噪聲(sheng)較明顯
由于Laplace算子對噪聲敏感(gan),會得到(dao)雙邊(bian),并(bing)且并(bing)不(bu)能檢(jian)測(ce)邊(bian)緣(yuan)的(de)方向,其通常(chang)不(bu)用于直接的(de)邊(bian)緣(yuan)檢(jian)測(ce),只(zhi)是(shi)起到(dao)輔助作(zuo)用。檢(jian)測(ce)某像素實在邊(bian)緣(yuan)的(de)亮(liang)的(de)一側還是(shi)暗的(de)一側,利用“零跨越(yue)”確定邊(bian)緣(yuan)的(de)位置。
總結
本文主要介紹了圖像空間域的銳化算子(也就是邊緣檢測算子),這些算子都是基于圖像的微分的:一階微分和二階微分(拉普拉斯算子)。
由于(yu)一階(jie)微(wei)分(fen)和(he)二階(jie)微(wei)分(fen)有各自的(de)特點,其得(de)到(dao)的(de)圖像邊(bian)緣也不(bu)相同:一階(jie)微(wei)分(fen)得(de)到(dao)的(de)圖像邊(bian)緣較粗,二階(jie)微(wei)分(fen)得(de)到(dao)的(de)是(shi)較細(xi)的(de)雙邊(bian)緣,所以在圖像的(de)邊(bian)緣增強方(fang)面二階(jie)微(wei)分(fen)算子的(de)效果較好。
文章轉自Brook_icv //www.cnblogs.com/wangguchangqing/p/6947727.html
void sobel_grad(const Mat &src, Mat &dst)
{
Mat grad_x, grad_y;
Sobel(src, grad_x, CV_32F, 1, 0);
Sobel(src, grad_y, CV_32F, 0, 1);
//convertScaleAbs(grad_x, grad_x);
//convertScaleAbs(grad_y, grad_y);
//addWeighted(grad_x, 0.5, grad_y, 0.5, 0, dst);
magnitude(grad_x, grad_y, dst);
convertScaleAbs(dst, dst);
}
void robert_grad(const Mat& src, Mat &dst)
{
Mat grad_x, grad_y;
Mat kernel_x = (Mat_<float>(2, 2) << -1, 0,0,1);
Mat kernel_y = (Mat_<float>(2, 2) << 0, -1, 1, 0);
filter2D(src, grad_x, CV_32F, kernel_x);
filter2D(src, grad_y, CV_32F, kernel_y);
//convertScaleAbs(grad_x, grad_x);
//convertScaleAbs(grad_y, grad_y);
//addWeighted(grad_x, 1, grad_y, 1, 0, dst);
magnitude(grad_x, grad_y, dst);
convertScaleAbs(dst, dst);
}
void robert_grad(const Mat& src, Mat &dst)
{
Mat grad_x, grad_y;
Mat kernel_x = (Mat_<float>(2, 2) << -1, 0,0,1);
Mat kernel_y = (Mat_<float>(2, 2) << 0, -1, 1, 0);
filter2D(src, grad_x, CV_32F, kernel_x);
filter2D(src, grad_y, CV_32F, kernel_y);
//convertScaleAbs(grad_x, grad_x);
//convertScaleAbs(grad_y, grad_y);
//addWeighted(grad_x, 1, grad_y, 1, 0, dst);
magnitude(grad_x, grad_y, dst);
convertScaleAbs(dst, dst);
}