精品国产色欧洲激情_中文字幕在线欧美日韩制服在线_欢迎观看网站影片国产在线观看伊_日本高清一本视频_ww亚洲无码免费在线观看_午夜片无码区观看_欧美性爱福利资源_丰满少妇肥唇翘臀ⅩXX_欧美日韩另类久久_国内揄拍国内精品对白86

圖像處理
新聞詳情

圖像處理基礎(chǔ)(6):銳化空間濾波器

發(fā)布時(shí)間:2021-01-12 15:26:04 最后更新:2021-01-12 16:21:17 瀏覽次數(shù):2701

前面介紹的幾種濾波器都屬于平滑濾波器(低通濾波器),用來(lái)平滑圖像和抑制噪聲的;而銳化空間濾波器恰恰相反,主要用來(lái)增強(qiáng)圖像的突變信息,圖像的細(xì)節(jié)和邊緣信息。平滑濾波器主要是使用鄰域的均值(或者中值)來(lái)代替模板中心的像素,消弱和鄰域間的差別,以達(dá)到平滑圖像和抑制噪聲的目的;相反,銳化濾波器則使用鄰域的微分作為算子,增大鄰域間像素的差值,使圖像的突變部分變的更加明顯。

本位主要介紹了一下幾點(diǎn)內(nèi)容:

?  圖像的一階微分和二階微分的性質(zhì)

?  幾種常見(jiàn)的一階微分算子

?  二階微分算子 - Laplace 拉普拉斯算子

?  一階微分算子和二階微分算子得到邊緣的對(duì)比

一階微分和二階微分的性質(zhì)

既然是基于一階微分和二階微分的銳化空間濾波器,那么首先就要了解下一階和二階微分的性質(zhì)。

圖像的銳化也就是增強(qiáng)圖像的突變部分,那么我們也就對(duì)圖像的恒定區(qū)域中,突變的開(kāi)始點(diǎn)與結(jié)束點(diǎn)(臺(tái)階和斜坡突變)及沿著灰度斜坡處的微分的性質(zhì)。微分是對(duì)函數(shù)局部變化率的一種表示,那么對(duì)于一階微分有以下幾個(gè)性質(zhì):

?  在恒定的灰度區(qū)域,圖像的微分值為0.(灰度值沒(méi)有發(fā)生變換,自然微分為0)

?  在灰度臺(tái)階或斜坡起點(diǎn)處微分值不為0.(臺(tái)階是,灰度值的突變變化較大;斜坡則是灰度值變化較緩慢;灰度值發(fā)生了變化,微分值不為0)

?  沿著斜坡的微分值不為0.

二階微分,是一階微分的導(dǎo)數(shù),和一階微分相對(duì)應(yīng),也有以下幾點(diǎn)性質(zhì):

?  在恒定區(qū)域二階微分值為0

?  在灰度臺(tái)階或斜坡的起點(diǎn)處微分值不為0

?  沿著斜坡的微分值為0.

從以上圖像灰度的一階和二階微分的性質(zhì)可以看出,在灰度值變化的地方,一階微分和二階微分的值都不為0;在灰度恒定的地方,微分值都為0.也就是說(shuō),不論是使用一階微分還是二階微分都可以得到圖像灰度的變化值。

圖像可以看著是二維離散函數(shù),對(duì)于圖像的一階微分其計(jì)算公式如下:
在x方向,
在y方向,

對(duì)于二階微分有:
在x方向,
在y方向,

對(duì)于 圖像邊緣處的灰度值來(lái)說(shuō),通常有兩種突變形式:

?  邊緣兩邊圖像灰度差異較大,這就形成了灰度臺(tái)階。在臺(tái)階處,一階微分和二階微分的值都不為0.

?  邊緣兩邊圖像灰度變化不如臺(tái)階那么劇烈,會(huì)形成一個(gè)緩慢變換的灰度斜坡。在斜坡的起點(diǎn)和終點(diǎn)一階微分和二階微分的值都不為0,但是沿著斜坡一階微分的值不為0,而二階微分的值為0.

對(duì)于圖像的邊緣來(lái)說(shuō),通常會(huì)形成一個(gè)斜坡過(guò)度。一階微分在斜坡處的值不為0,那么用其得到的邊緣較粗;而二階微分在斜坡處的值為0,但在斜坡兩端值不為0,且值得符號(hào)不一樣,這樣二階微分得到的是一個(gè)由0分開(kāi)的一個(gè)像素寬的雙邊緣。也就說(shuō),二階微分在增強(qiáng)圖像細(xì)節(jié)方面比一階微分好得多,并且在計(jì)算上也要比一階微分方便。

梯度圖

在圖像處理中的一階微分通常使用梯度的幅值來(lái)實(shí)現(xiàn)。對(duì)于圖像,在坐標(biāo)處的梯度是一個(gè)列向量


該向量表示圖像中的像素在點(diǎn)處灰度值的最大變化率的方向。
向量的幅值就是圖像的梯度圖,記為


是和原圖像同大小的圖像。由于求平方的根運(yùn)算比較費(fèi)時(shí),通常可以使用絕對(duì)值的和來(lái)近似


從上面可以看出,要得到圖像的梯度圖,有以下步驟:

?  圖像在x方向的梯度

?  圖像在y方向的梯度

?  

一階梯度算子

圖像是以離散的形式存儲(chǔ),通常使用差分來(lái)計(jì)算圖像的微分,常見(jiàn)的計(jì)算梯度的模板有以下幾種

?  根據(jù)梯度的定義


可以得到模板
使用該方法計(jì)算的圖像的梯度只是考慮單個(gè)像素的差值,并沒(méi)有利用到圖像的像素的鄰域特性。

?  Robert交叉算子
在圖像處理的過(guò)程中,不會(huì)只單獨(dú)的對(duì)圖像中的某一個(gè)像素進(jìn)行運(yùn)算,通常會(huì)考慮到每個(gè)像素的某個(gè)鄰域的灰度變化。因此,通常不會(huì)簡(jiǎn)單的利用梯度的定義進(jìn)行梯度的計(jì)算,而是在像素的某個(gè)鄰域內(nèi)設(shè)置梯度算子。考慮,區(qū)域的像素,使用如下矩陣表示:


令中心點(diǎn)表示圖像中任一像素,那么根據(jù)梯度的定義,在在x和y方向的梯度分別為:,梯度圖像M(x,y)



根據(jù)上述公式,Robert在1965年提出的Robert交叉算子


?  Sobel算子
Robert交叉算子的尺寸是偶數(shù),偶數(shù)尺寸濾波器沒(méi)有對(duì)稱(chēng)中心計(jì)算效率較低,所以通常濾波器的模板尺寸是奇數(shù)。仍以為例,以為對(duì)稱(chēng)中心(表示圖像中的任一像素),有


利用上述公式可以得到如下兩個(gè)卷積模板,分別計(jì)算圖像在x和y風(fēng)向的梯度


第一個(gè)模板,第三行和第一行的差近似x方向的偏微分;第二個(gè)模板,第三列和第一列的差近似y方向的偏微分,而且模板的所有系數(shù)只和為0,表示恒定灰度區(qū)域的響應(yīng)為0.

基于OpenCV的一階梯度算子實(shí)現(xiàn)

?  Sobel算子
在OpenCV中封裝了Sobel算子,其函數(shù)為Sobel。使用Sobel能夠很方便的計(jì)算任意尺寸的x和y方向的偏微分,具體如下:

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);
}

上述代碼中調(diào)用Sobel分別得到圖像在x和y方向的偏微分,然后相加得到得到圖像的梯度圖。
其余的幾個(gè)函數(shù)說(shuō)明,convertScaleAbs將圖像類(lèi)型轉(zhuǎn)換為CV_8U;addWeighted按一定的權(quán)值將兩個(gè)圖像相加;magnitude求兩個(gè)圖像的幅值,其公式為,具體的參數(shù)說(shuō)明可參考OpenCV的官方文檔。

?  基于定義和Robert交叉算子的計(jì)算
對(duì)于這兩種算子,OpenCV中并沒(méi)有提供具體的函數(shù),不過(guò)可以利用filter2D函數(shù)來(lái)實(shí)現(xiàn)。filter2D是OpenCV中對(duì)圖像進(jìn)行卷積運(yùn)算的一個(gè)很重要的函數(shù),該函數(shù)能夠使用任意的線(xiàn)性卷積核對(duì)圖像進(jìn)行卷積運(yùn)算。

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);
}

構(gòu)造好Robert交叉算子,然后調(diào)用filter2D即可;基于定義的計(jì)算方法于此類(lèi)似,不在贅述。

結(jié)果三種方法計(jì)算得到的梯度圖,如下:

從上面結(jié)果可以看出,Robert交叉算子和基于定義得到的邊緣圖,得到的邊緣較細(xì)并且不是很連續(xù);Sobel得到邊緣較粗,線(xiàn)條連續(xù),效果明顯好于其他的兩種算子。

二階微分算子 - LapLace 拉普拉斯算子

二階微分算子的代表就是拉普拉斯算子,其定義如下:


其中:


對(duì)于上述的區(qū)域,則有


其得到的模板如下:


注意,模板中心的符號(hào),并且模板的所有系數(shù)之和為0.

在OpenCV中有對(duì)LapLace的封裝,其函數(shù)為L(zhǎng)aplacian,其使用的模板中心的系數(shù)為負(fù),具體參數(shù)說(shuō)明參見(jiàn)OpenCV文檔,其得到的邊緣圖和一階微分算子得到邊緣圖對(duì)比結(jié)果如下:

?  一階微分算子Sobel得到的邊緣較粗

?  二階微分算子Laplace得到的邊緣則較細(xì),并且邊緣是雙邊緣

?  Lpalace算子對(duì)噪聲比較敏感,得到的邊緣圖像上噪聲較明顯

由于Laplace算子對(duì)噪聲敏感,會(huì)得到雙邊,并且并不能檢測(cè)邊緣的方向,其通常不用于直接的邊緣檢測(cè),只是起到輔助作用。檢測(cè)某像素實(shí)在邊緣的亮的一側(cè)還是暗的一側(cè),利用“零跨越”確定邊緣的位置。

總結(jié)

本文主要介紹了圖像空間域的銳化算子(也就是邊緣檢測(cè)算子),這些算子都是基于圖像的微分的:一階微分和二階微分(拉普拉斯算子)。
由于一階微分和二階微分有各自的特點(diǎn),其得到的圖像邊緣也不相同:一階微分得到的圖像邊緣較粗,二階微分得到的是較細(xì)的雙邊緣,所以在圖像的邊緣增強(qiáng)方面二階微分算子的效果較好。

 

文章轉(zhuǎn)自Brook_icv   https://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);
}
在線(xiàn)客服 雙翌客服
客服電話(huà)
  • 0755-23712116
  • 13822267203