Matlab 數(shù)字圖像的濾波及邊緣檢測
一、圖像濾波
圖像濾波的主要目的就是在盡量保留圖像細(xì)節(jié)特征的條件下對目標(biāo)圖像的噪聲進(jìn)行抑制。圖像濾波其主要分為線性濾波器和非線性濾波器。
1.1 線性濾波器
1.1.1 均值濾波
原理:在圖像上,對待處理的像素給定一個模板,該模板包括了其周圍的鄰近像素。將模板中的全體像素的均值來替代原來的像素值的方法。以 的均值濾波器的模板為:
模板所覆蓋的圖像的像素為:
因此,模板中心點所對應(yīng)的像素值可以表示為:
在進(jìn)行濾波之前,一般會先對原圖像進(jìn)行填充,填充的像素大小為:r = floor(模板寬度/2),不然的話始終無法對圖像邊緣的像素進(jìn)行濾波。
均值濾波的特點:均值濾波能夠降低圖像中的尖銳變化,去除圖像中的噪聲,且濾波窗口越大,去噪效果越好同時圖像也會變得越模糊
1.1.2 高斯濾波
原理:其實高斯濾波和均值濾波的原理差不多,都是用一個模板(或稱卷積、掩模)掃描圖像中的每一個像素,用模板確定的鄰域內(nèi)像素的加權(quán)平均灰度值去替代模板中心像素點的值。區(qū)別就在于,高斯濾波中模板的數(shù)值是通過高斯函數(shù)生成的。還是以3
因此,模板中心點所對應(yīng)的像素值可以表示為:
高斯濾波的特點:根據(jù)公式可以得到,在計算高斯濾波模板時,高斯濾波模板的值由中間向四周遞減,且標(biāo)準(zhǔn)差越小,二維高斯圖像越窄小,平滑效果不明顯;標(biāo)準(zhǔn)差越大,而為高斯圖像越矮寬,濾波效果比較明顯。下圖展示了不同 的7
1.2 非線性濾波器
1.2.1 中值濾波器
原理:中值濾波器就是取模板覆蓋區(qū)域的排序之后的中間值作為該模板區(qū)域內(nèi)中心的像素值。還是以 3
那么,中值濾波后的像素值為:
中值濾波器的特點:中值濾波器很適合處理椒鹽噪聲。
1.2.2 雙邊濾波器
設(shè)計原因:在均值濾波器和高斯濾波器時,濾波器的模板值僅僅考慮到了像素的空間位置,潛在的假設(shè)為:離模板中心點越近,那么他們的像素值也越接近。但是在紋理比較復(fù)雜的區(qū)域,這種假設(shè)很難成立,因此采用上述濾波器進(jìn)行濾波時,圖像的邊緣信息保持不夠理想。那么能不能設(shè)計一款濾波器,能夠識別紋理復(fù)雜的區(qū)域,從而實現(xiàn)更好的邊緣保持i效果?
原理:雙邊濾波器分為兩個部分,首先采用高斯濾波器生成只跟像素位置相關(guān)的模板,然后根據(jù)像素值,生成另外一個跟像素值相關(guān)的模板。兩個模板逐像素點擊就形成了雙邊濾波模板。具體描述如下:
因此,最終的雙邊濾波模板為:
在雙邊濾波器中多考慮了值域模板,當(dāng)兩個位置像素越接近,那么 w2對應(yīng)位置的權(quán)重就越大,否則就會越小。因此通過 w2我們在濾波器中保護(hù)了圖像的邊緣信息。其模板的圖像如下:
雙邊濾波器的特點:雙邊濾波器是一種可以保邊緣信息的去噪濾波器。
1.3 濾波器的 Matlab 代碼實現(xiàn)
clear all clc image = imread('../測試圖像/2.bmp'); [H,W,C] = size(image); %記錄讀入圖像的長寬 H_win = 7; %定義模板窗口的寬度 image_input = double(rgb2ycbcr(image)); %轉(zhuǎn)換成Ycbcr顏色空間 image_input = image_input(:,:,1); %取Y通道來進(jìn)行處理 paddle = floor(H_win/2); %計算需要填充的像素寬度 image_data = zeros(H+2*paddle, W+2*paddle); %0填充 Start = paddle+1; %計算圖像的開始和結(jié)束位置 End = H+paddle; image_data(Start:End, Start:End) = image_input(:,:);%將圖像放在填充圖像的中間 %生成高斯濾波模板 sigma_g = 3; sigma_r = 6; [x,y] = meshgrid(-paddle:paddle,-paddle:paddle); k_gaussian1=exp(-(x.^2+y.^2)/(2*sigma_g^2)); %以距離作為自變量高斯濾波器 k_gaussian=k_gaussian1/sum(k_gaussian1(:));%歸一化 Map_X = 1:H_win; Map_Y = 1:H_win; %作3維圖的橫坐標(biāo) surf(Map_X,Map_Y,k_gaussian) %繪制高斯濾波核的圖 for i=Start:1:End for j=Start:1:End image_window = image_data(i-paddle:i+paddle, j-paddle:j+paddle); Mean_image(i-paddle,j-paddle) = mean(mean(image_window)); %均值濾波 Median_image(i-paddle,j-paddle) = median(image_window(:)); %中值濾波 Gaussian_image(i-paddle, j-paddle) = sum(sum(image_window.*k_gaussian)); %高斯濾波 double_w = exp(-(image_window-image_data(i,j)).^2/(2*sigma_r^2)); %以周圍和當(dāng)前像素灰度差值作為自變量的高斯濾波器 double_w = k_gaussian1 .* double_w; double_w = double_w/sum(double_w(:)); Double_image(i-paddle, j-paddle) = sum(sum(image_data(i-paddle:i+paddle, j-paddle:j+paddle).*double_w)); %雙邊濾波 end end figure, imshow(uint8(image_input)), title('原圖') subplot(2,2,1), imshow(uint8(Mean_image)), title('5*5均值') subplot(2,2,2), imshow(uint8(Median_image)), title('中值濾波') subplot(2,2,3), imshow(uint8(Gaussian_image)), title('5*5,1.5 高斯') subplot(2,2,4), imshow(uint8(Double_image)), title('5*5,1.5 雙邊')
代碼輸出結(jié)果如下:
二、圖像邊緣檢測
邊緣檢測是為了將其周圍像素灰度有階躍變化的像素檢測出來,這些像素組成的集合就是該圖像的邊緣。比較常用的邊緣檢測方法就是考察每個像素在某個領(lǐng)域內(nèi)灰度的變化,然后利用邊緣臨近一階或二階方向?qū)?shù)變化規(guī)律檢測邊緣,即邊緣檢測局部算法
2.1 一階邊緣檢測算子
2.1.1 Sobel 算子
原理:Sobel 算子包括兩組3
假設(shè) Ox 和 Oy 分別用來表示被模板 Gx 和 Gy 卷積后的結(jié)果,那么最終的輸出圖像邊緣可以表示為:
Sobel算子的特點:Soble算子在水平和垂直兩個方向上求導(dǎo),得到的是圖像在X方法與Y方向梯度圖像。但是比較敏感,容易受影響,要通過高斯模糊(平滑)來降噪。
2.1.2 Canny 算子
原理:Canny算子是由計算機科學(xué)家John F. Canny于1986年提出的一種邊緣檢測算子,是目前理論上相對最完善的一種邊緣檢測算法。主要包括以下幾個步驟:
- 高斯濾波對圖像進(jìn)行預(yù)處理,提前弱化噪聲,增加邊緣提取準(zhǔn)確度
- Sobel 算子進(jìn)行像素梯度計算,得到梯度強度矩陣
- 非極大值抑制:非極大值像素梯度抑制起到將邊緣“瘦身”的作用。其基本方法是將當(dāng)前像素梯度強度與沿正負(fù)梯度方向上的相鄰像素的梯度強度進(jìn)行比較,若其最大(即為極值),則保留該像素為邊緣點,若不是最大,則對其進(jìn)行抑制,不將其作為邊緣點。
- 滯后閾值處理:定義一個高閾值和一個低閾值。梯度強度低于低閾值的像素點被抑制,不作為邊緣點;高于高閾值的像素點被定義為強邊緣,保留為邊緣點;處于高低閾值之間的定義為弱邊緣,留待進(jìn)一步處理。
- 孤立弱邊緣抑制:通常而言,由真實邊緣引起的弱邊緣像素點將連接到強邊緣像素點,而噪聲響應(yīng)則未連接。通過查看弱邊緣像素及其8個鄰域像素,可根據(jù)其與強邊緣的連接情況來進(jìn)行判斷。一般,可定義只要其中鄰域像素其中一個為強邊緣像素點,則該弱邊緣就可以保留為強邊緣,即真實邊緣點。
Canny檢測的特點:Canny 算子對于濾波參數(shù)和高、低閾值的選取還是較為敏感,使得實際應(yīng)用過程中需要反復(fù)調(diào)試。
2.2 二階邊緣檢測算子
2.2.1 拉普拉斯算子
原理:拉普拉斯算子是二階微分算子,實際上就是圖像梯度的散度:
然而:
所以,卷積的模板可以寫為:
拉普拉斯算子的特點:Laplacian算子法對噪聲比較敏感,所以很少用該算子檢測邊緣,而是用來判斷邊緣像素視為與圖像的明區(qū)還是暗區(qū)。Laplacian算子是各向同性的,能對任何走向的界線和線條進(jìn)行銳化,無方向性。
2.3 邊緣檢測的 Matlab 代碼實現(xiàn)
clear all clc image = imread('../測試圖像/2.bmp'); [H,W,C] = size(image); %記錄讀入圖像的長寬 H_win = 21; %定義模板窗口的寬度 image_input = double(rgb2ycbcr(image)); %轉(zhuǎn)換成Ycbcr顏色空間 image_input = image_input(:,:,1); %取Y通道來進(jìn)行處理 %定義sobel算子 G_x = [-1,0,1;-2,0,2;-1,0,1]; G_y = [1,2,1;0,0,0;-1,-2,-1]; %定義拉普拉斯算子 L = [-1,-1,-1;-1,8,-1;-1,-1,-1]; image_data = mat2gray(image_input); %圖像歸一化 for i=2:1:H-1 for j=2:1:W-1 image_win = image_data(i-1:i+1, j-1:j+1); Gx = sum(sum(image_win .* G_x)); Gy = sum(sum(image_win .* G_y)); Sobel_image(i, j) = sqrt(Gx^2 + Gy^2); Lapla_image(i, j) = image_data(i,j+1)+image_data(i,j-1)+image_data(i+1,j)+image_data(i-1,j)-4*(image_data(i,j)); end end subplot(131), imshow(image_data), title('原圖') subplot(132), imshow(Sobel_image), title('Canny邊緣檢測') subplot(133), imshow(Lapla_image), title('拉普拉斯檢測')
代碼輸出結(jié)果如下:
2.4 邊緣檢測算法總結(jié)
- Sobel算子檢測方法對灰度漸變和噪聲較多的圖像處理效果較好,sobel算子對邊緣定位不是很準(zhǔn)確,圖像的邊緣不止一個像素;當(dāng)對精度要求不是很高時,是一種較為常用的邊緣檢測方法。
- Canny方法不容易受噪聲干擾,能夠檢測到真正的弱邊緣。優(yōu)點在于,使用兩種不同的閾值分別檢測強邊緣和弱邊緣,并且當(dāng)弱邊緣和強邊緣相連時,才將弱邊緣包含在輸出圖像中。
- Laplacian算子法對噪聲比較敏感,所以很少用該算子檢測邊緣,而是用來判斷邊緣像素視為與圖像的明區(qū)還是暗區(qū)。拉普拉斯高斯算子是一種二階導(dǎo)數(shù)算子,將在邊緣處產(chǎn)生一個陡峭的零交叉, Laplacian算子是各向同性的,能對任何走向的界線和線條進(jìn)行銳化,無方向性。這是拉普拉斯算子區(qū)別于其他算法的最大優(yōu)點。
三、參考資料
https://zhuanlan.zhihu.com/p/355263110
https://www.cnblogs.com/wangguchangqing/p/6416401.html
https://www.cnblogs.com/yibeimingyue/p/10878514.html
https://zhuanlan.zhihu.com/p/99959996
https://www.cnblogs.com/yibeimingyue/p/10878514.html
https://www.jianshu.com/p/2a06c68f6c14
以上就是數(shù)字圖像的濾波及邊緣檢測的詳細(xì)內(nèi)容,更多關(guān)于濾波和邊緣檢測的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java3D實例之創(chuàng)建空間幾何模型的實現(xiàn)方法
本篇文章是對Java3D 創(chuàng)建空間幾何模型的實現(xiàn)方法進(jìn)行了詳細(xì)的介紹。需要的朋友參考下2013-05-05VC判斷進(jìn)程是否具有administrator權(quán)限的方法
這篇文章主要介紹了VC判斷進(jìn)程是否具有administrator權(quán)限的方法,在Windows應(yīng)用程序設(shè)計中具有一定的實用價值,需要的朋友可以參考下2014-10-10