1.空間濾波
空間濾波,就是直接在灰度值上,做一些濾波操作。濾波一詞,其實(shí)來源于頻域,將某個(gè)頻率成分濾除的意思。大部分線性的空間濾波器(比如均值濾波器),是在空間上進(jìn)行一些灰度值上的操作,這個(gè)線性空間濾波器與頻域?yàn)V波器有一一對(duì)應(yīng)的關(guān)系(比如均值濾波器其本質(zhì)就是低通濾波器),這樣會(huì)有助于理解這個(gè)濾波器的特性。然而,對(duì)于非線性的濾波器(比如最大值,最小值和中央值濾波器)的話,則沒有這樣一個(gè)一一對(duì)應(yīng)的關(guān)系。
線性空間濾波所使用的運(yùn)算是卷積,其計(jì)算如下所示。
在執(zhí)行空間濾波的時(shí)候,我們都會(huì)使用到這個(gè)操作。
這個(gè)式子可能會(huì)出現(xiàn)兩個(gè)問題。這次是在空間域進(jìn)行操作的,所以上式應(yīng)該沒什么問題。但是,如果換到頻域,我們會(huì)發(fā)現(xiàn),我們使用的濾波器是非因果的,按照我之前在數(shù)字信號(hào)處理的那一節(jié),非因果具有零相位特性,但是是不可實(shí)現(xiàn)的,因?yàn)樾枰磥淼妮斎?。而在這,我們?cè)趫D像處理的時(shí)候,都是一幀一幀的處理,所以,這里非因果性不是問題。而最重要的是,零相位特性不會(huì)使得圖像變形,這是很重要的。
還有一個(gè)問題就是邊界問題,當(dāng)濾波器的中心靠近圖像邊緣時(shí)候,濾波器的一部分會(huì)位于圖像外,那么此時(shí),我們通常會(huì)采用填0的操作來解決。但是,一些場(chǎng)合,直接填0操作會(huì)使得操作后的圖像出現(xiàn)黑邊。所以,常用的操作還有,①選擇距離最近的點(diǎn)填充,②填充的點(diǎn)為圓圖像的鏡像,③將原圖像當(dāng)做周期信號(hào)來填充。
2.幾個(gè)典型的空間濾波器
2.1平滑濾波器
在空間域上考慮,我們所指的平滑濾波器,有平均濾波與加權(quán)平均濾波兩種形式。
這里很好理解,將濾波器范圍內(nèi)的點(diǎn),求平均值(或者加權(quán)平均值)。這樣會(huì)使得圖像平滑,有助于去掉一些噪聲。
我們將其放到頻域去考慮的話,其實(shí)這是一個(gè)很典型的低通濾波器。這個(gè)濾波器會(huì)濾掉高頻成分,所以可以使得圖像平滑。其頻率響應(yīng)如下所示。
3X3平均濾波的頻率響應(yīng)
3X3加權(quán)平均濾波的頻率響應(yīng)
首先,對(duì)于兩個(gè)濾波器的振幅特性。平均濾波器的通帶要比加權(quán)平均濾波器的窄,故使用平均濾波器處理的圖像要比加權(quán)濾波器處理的圖像要模糊一些。
注意平均濾波器的相位特性,其相位特性并不是一個(gè)平面,有的地方的值為π。首先,平均濾波器是一個(gè)偶實(shí)函數(shù),其頻率響應(yīng)是一個(gè)實(shí)函數(shù)。但是,其頻率響應(yīng)有的部分為負(fù)值,這就造成了Matlab的angle()的計(jì)算結(jié)果為π。其實(shí)其還是具有0相位特性的。
用其處理實(shí)際處理圖像的話,會(huì)得到以下結(jié)果。
看其處理結(jié)果,其實(shí)很難分辨出有什么區(qū)別。所以,加權(quán)平均濾波器和平均濾波器的區(qū)別,從頻率響應(yīng)來看的話,容易明白一些。本文只是簡(jiǎn)單的介紹一下均值濾波器,詳細(xì)的,請(qǐng)參看[數(shù)字圖像處理]圖像去噪初步(1)--均值濾波器
2.2統(tǒng)計(jì)排序?yàn)V波器
統(tǒng)計(jì)排序?yàn)V波器的運(yùn)用也廣泛,其是很典型的非線性濾波器。主要包括了,最大值濾波器,最小值濾波器,中央值濾波器等等。這里作為代表的,主要說中央值濾波器,中央值濾波對(duì)于去除椒鹽噪聲特別有效。
所謂中央值濾波器,就是將濾波器范圍內(nèi)的像素的灰度值,進(jìn)行排序,選出中央值作為這個(gè)像素的灰度值。同理可解釋最大值濾波器與最小值濾波器。
我們將一幅圖像添加椒鹽噪聲,然后嘗試著用中央值濾波器去除。
從直方圖中,可以看出,中央值濾波器對(duì)于椒鹽噪聲,有很好的去噪作用。關(guān)于非線性濾波的詳細(xì),請(qǐng)參看[數(shù)字圖像處理]圖像去噪初步(2)--非線性濾波器
2.3銳化濾波器
使用平均濾波器,可以將圖像平滑,其本質(zhì)是將圖像在濾波器范圍內(nèi)求平均值。從頻域上來看,平均濾波器是低通濾波器。然而,所謂的銳化,即是將圖像的細(xì)節(jié)強(qiáng)調(diào)出來。這里進(jìn)行了一個(gè)假設(shè),假設(shè)細(xì)節(jié)部分是圖像高頻成分。從這里看來,其實(shí)銳化濾波器是與平均濾波器是相反的操作。
對(duì)于一個(gè)一次元函數(shù),其一階微分為
這樣的微分被稱為向前一次微分,這樣的微分會(huì)產(chǎn)生一個(gè)采樣點(diǎn)(針對(duì)圖像來說,偏移一個(gè)像素)的偏移。為了避免這樣的偏移,一般將向前一次微分與向后一次微分連用,這樣就不會(huì)產(chǎn)生一些偏移,如下所示。
現(xiàn)在將其二階段微分?jǐn)U展到二次元的圖像,如下所示。
將其寫成濾波器的形式的話,如下左所示。我們?yōu)榱藦?qiáng)調(diào)其微分效果,也可以在斜方向上加上一個(gè)微分效果,如下右所示。我們將其稱為拉普拉斯算子。
其頻率響應(yīng)如下所示。
四方向的拉普拉斯濾波器的頻率響應(yīng)
八方向的拉普拉斯濾波器的頻率響應(yīng)
我們可以看出,八方向的拉普拉斯濾波器對(duì)于高頻成分的強(qiáng)調(diào)效果較強(qiáng)。其低頻部分最小值為0,這意味著,進(jìn)行拉普拉斯濾波之后,其實(shí)只剩下圖像的高頻部分了(在空間域里來講,只剩下邊緣部分了)。所以,若用于圖像銳化的話,可以將所得結(jié)果疊加至原圖像,其實(shí)也就相當(dāng)與濾波器的振幅特性往上移動(dòng)1,保證低頻部分不變,強(qiáng)調(diào)高頻部分。
2.4高提升濾波
高提升濾波一般用于使得圖片更加清晰。其步驟大致如下,首先將圖片模糊化,然后從原圖中,將其模糊形式去除。
從而得到圖像的反銳化掩蔽,然后用將其疊加至原圖上,從而使得圖像更清晰。
當(dāng)k=1的時(shí)候,這個(gè)操作稱為反銳化掩蔽。當(dāng)k>1時(shí)候,這個(gè)操作稱為高提升濾波。
其實(shí),高提升濾波也是一種銳化濾波,其強(qiáng)調(diào)的也是圖像的邊緣部分(或者跳變部分)。用以下實(shí)驗(yàn)可以加深對(duì)高提升濾波的理解。
得到的結(jié)果確實(shí)比原圖更加的清晰了。為了更深一步理解,我們將第77行的灰度曲線畫出來,看看具體啥樣的。
首先是原圖的77行與高斯模糊后的77行。
然后是原圖與模糊后的圖像的差,其圖像如下所示。
可以看出,邊緣部分都凸顯出來了,下面,我們將這個(gè)部分乘以某個(gè)常數(shù),再疊加回原圖,就可以得到高提升濾波的結(jié)果,如下所示。
可以看出,字體的邊緣部分被強(qiáng)調(diào)了。這樣會(huì)使得字體在感覺上,更加的清晰。
2.5 sobel濾波器
sobel濾波器也是一個(gè)常用的濾波器。其原理與銳化濾波器也很像,其運(yùn)用了一階微分,使得邊緣部分得到保留,濾除了其余的平滑部分。
現(xiàn)在來分析一下sobel濾波器??v向看這個(gè)濾波器,是一個(gè)中心2次式微分運(yùn)算,這個(gè)運(yùn)算是一個(gè)高通濾波器。由此可以確定,sobel濾波器是可以提取圖像的邊緣。再看縱向,縱向其實(shí)是一個(gè)加權(quán)平均濾波器,這也就說明了,其實(shí)sobel濾波器有一定的平滑作用。綜上,sobel濾波器是由以下兩個(gè)濾波器合成的。
Sobel濾波器有兩個(gè)方向,所以,其兩個(gè)方向的頻響如下所示。
sobel濾波器可以抽出圖像的邊緣部分。從頻域上來看,其保留了圖像的中部頻段部分。
3.參考用代碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | close all; clear all;
%% -------------Smoothing Lines Filters----------------- f = imread('test_pattern_blurring_orig.tif'); f = mat2gray(f,[0 255]);
w_1 = ones(3)/9; %%%%% g_1 = imfilter(f,w_1,'conv','symmetric','same');
w_2 = ones(5)/25; %%%%% g_2 = imfilter(f,w_2,'conv','symmetric','same');
w_3 = [1 2 1; 2 4 2; 1 2 1]/16; %%%%% g_3 = imfilter(f,w_3,'conv','symmetric','same');
figure(); subplot(1,2,1); imshow(f,[0 1]); xlabel('a).Original Image');
subplot(1,2,2); imshow(g_1,[0 1]); xlabel('b).Average Filter(size 3x3)');
figure(); subplot(1,2,1); imshow(g_2,[0 1]); xlabel('c).Average Filter(size 5x5)');
subplot(1,2,2); imshow(g_3,[0 1]); xlabel('d).Weighted Average Filter(size 3x3)');
%% ------------------------ M = 64; N = 64; [H_1,w1,w2] = freqz2(w_1,M,N); figure(); subplot(1,2,1); mesh(w1(1:M)*pi,w2(1:N)*pi,abs(H_1(1:M,1:N))); axis([-pi pi -pi pi 0 1]); xlabel('\omega_1 [rad]');ylabel('\omega_2 [rad]'); zlabel('|H(e^{j\omega_1},e^{j\omega_2})|');
%figure(); subplot(1,2,2); mesh(w1(1:M)*pi,w2(1:N)*pi,unwrap(angle(H_1(1:M,1:N)))); axis([-pi pi -pi pi -pi pi]); xlabel('\omega_1 [rad]');ylabel('\omega_2 [rad]'); zlabel('\theta [rad]');
|
Average_Filter.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | close all; clear all;
%% ----------------Noise type-------------------- f = imread('original_pattern.tif'); f = mat2gray(f,[0 255]); [M,N] = size(f);
g_gaussian = imnoise(f,'gaussian',0,0.015); g_salt_pepper = imnoise(f,'salt & pepper',0.15);
figure(1); subplot(1,2,1); imshow(f,[0 1]); xlabel('a).Original Image');
subplot(1,2,2); h = imhist(f)/(M*N); bar(0:1/255:1,h); axis([-0.1 1.1 0 0.55]),grid; axis square; xlabel('b).The histogram of original image'); ylabel('Number of pixels');
figure(2); subplot(1,2,1); imshow(g_gaussian,[0 1]); xlabel('c).gaussian noise image');
subplot(1,2,2); h = imhist(g_gaussian)/(M*N); bar(0:1/255:1,h); axis([-.1 1.1 0 0.05]),grid; axis square; xlabel('d).The histogram of c)'); ylabel('Number of pixels');
figure(5); subplot(1,2,1); imshow(g_salt_pepper,[0 1]); xlabel('i).salt & pepper noise image');
subplot(1,2,2); h = imhist(g_salt_pepper)/(M*N); bar(0:1/255:1,h); axis([-.1 1.1 0 0.55]),grid; axis square; xlabel('j).The histogram of g)'); ylabel('Number of pixels');
%% -------------Nonlines Filters----------------- g_med_wg = medfilt2(g_gaussian,'symmetric',[3 3]); g_med_sp = medfilt2(g_salt_pepper,'symmetric',[3 3]);
figure(3); subplot(1,2,1); imshow(g_med_wg,[0 1]); xlabel('e).Result of median filter');
subplot(1,2,2); h = imhist(g_med_wg)/(M*N); bar(0:1/255:1,h); axis([-.1 1.1 0 0.05]),grid; axis square; xlabel('f).The histogram of e)'); ylabel('Number of pixels');
figure(6); subplot(1,2,1); imshow(g_med_sp,[0 1]); xlabel('k).Result of median filter');
subplot(1,2,2); h = imhist(g_med_sp)/(M*N); bar(0:1/255:1,h); axis([-.1 1.1 0 0.55]),grid; axis square; xlabel('l).The histogram of i)'); ylabel('Number of pixels');
%% -------------lines Filters----------------- w_1 = [1 2 1; 2 4 2; 1 2 1]/16; %%%%% g_ave_wg = imfilter(g_gaussian,w_1,'conv','symmetric','same'); g_ave_sp = imfilter(g_salt_pepper,w_1,'conv','symmetric','same');
figure(4); subplot(1,2,1); imshow(g_ave_wg,[0 1]); xlabel('g).Result of weighted average filter');
subplot(1,2,2); h = imhist(g_ave_wg)/(M*N); bar(0:1/255:1,h); axis([-.1 1.1 0 0.05]),grid; axis square; xlabel('h).The histogram of k)'); ylabel('Number of pixels');
figure(7); subplot(1,2,1); imshow(g_ave_sp,[0 1]); xlabel('m).Result of weighted average filter');
subplot(1,2,2); h = imhist(g_ave_sp)/(M*N); bar(0:1/255:1,h); axis([-.1 1.1 0 0.55]),grid; axis square; xlabel('n).The histogram of m)'); ylabel('Number of pixels');
|
Noline_Filter.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | close all; clear all;
%% -------------Sharpening Spatial Filters----------------- f = imread('blurry_moon.tif'); f = mat2gray(f,[0 255]);
w_L = [0 1 0 1 -4 1 0 1 0]; g_L_whitout = imfilter(f,w_L,'conv','symmetric','same'); g_L = mat2gray(g_L_whitout); g = f - g_L_whitout; g = mat2gray(g ,[0 1]);
figure(); subplot(1,2,1); imshow(f,[0 1]); xlabel('a).Original Image');
subplot(1,2,2); imshow(g_L_whitout,[0 1]); xlabel('b).The Laplacian');
figure(); subplot(1,2,1); imshow(g_L,[0 1]); xlabel('c).The Laplacian with scaling');
subplot(1,2,2); imshow(g,[0 1]); xlabel('d).Result Image');
%% ------------------------ [M,N] = size(f); [H,w1,w2] = freqz2(w_L,N,M); figure(); subplot(1,2,1); mesh(w1(1:10:N)*pi,w2(1:10:M)*pi,abs(H(1:10:M,1:10:N))); axis([-pi pi -pi pi 0 12]); xlabel('\omega_1 [rad]');ylabel('\omega_2 [rad]'); zlabel('|H(e^{j\omega_1},e^{j\omega_2})|');
%figure(); subplot(1,2,2); mesh(w1(1:10:N)*pi,w2(1:10:M)*pi,unwrap(angle(H(1:10:M,1:10:N)))); axis([-pi pi -pi pi -pi pi]); xlabel('\omega_1 [rad]');ylabel('\omega_2 [rad]'); zlabel('\theta [rad]');
|
Laplacian_Filters.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | close all; clear all;
%% -------------Unsharp Masking and Highboots Filtering----------------- close all; clear all;
f = imread('dipxe_text.tif'); f = mat2gray(f,[0 255]);
w_Gaussian = fspecial('gaussian',[3,3],1); g_Gaussian = imfilter(f,w_Gaussian,'conv','symmetric','same');
g_mask = f - g_Gaussian;
g_Unsharp = f + g_mask; g_hb = f + (4.5 * g_mask); f = mat2gray(f,[0 1]);
figure(); subplot(2,2,1); imshow(f,[0 1]); xlabel('a).Original Image');
subplot(2,2,2); imshow(g_Gaussian,[0 1]); xlabel('b).Result of Gaussian Filter');
subplot(2,2,3); imshow(mat2gray(g_mask),[0 1]); xlabel('a).Unsharp Mask');
subplot(2,2,4); imshow(g_hb,[0 1]); xlabel('b).Result of Highboots Filter');
%% [M,N] = size(f);
figure(); %subplot(1,2,1); plot(1:N,f(77,1:N),'r'); axis([1,N,0,1]),grid; axis square; xlabel('a).Original Image(77th column)'); ylabel('intensity level');
figure(); %subplot(1,2,2); plot(1:N,f(77,1:N),'r',1:N,g_Gaussian(77,1:N),'--b'); legend('Original','Result'); axis([1,N,0,1]),grid; axis square; xlabel('b).Result of gaussian filter(77th column)'); ylabel('intensity level');
figure(); %subplot(1,2,1); plot(1:N,g_mask(77,1:N)); axis([1,N,-.1,.1]),grid; axis square; xlabel('c).Result of gaussian filter (77th column)'); ylabel('intensity level');
figure(); %subplot(1,2,2); plot(1:N,g_hb(77,1:N)); axis([1,N,0,1.1]),grid; axis square; xlabel('d).Result of Highboots Filtering(77th column)'); ylabel('intensity level');
|
Highboots_Filter.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | close all; clear all;
%% -------------The Gradient----------------- f = imread('contact_lens_original.tif'); f = mat2gray(f,[0 255]);
sobel_x = [-1 -2 -1; 0 0 0; 1 2 1]; sobel_y = [-1 0 1; -2 0 2; -1 0 1];
g_x = abs(imfilter(f,sobel_x,'conv','symmetric','same')); g_y = abs(imfilter(f,sobel_y,'conv','symmetric','same')); g_sobel = g_x + g_y;
figure(); subplot(1,2,1); imshow(f,[0 1]); xlabel('a).Original Image');
subplot(1,2,2); imshow(g_sobel,[0 1]); xlabel('b).Result of Sobel Operators');
figure(); subplot(1,2,1); imshow(g_x,[0 1]); xlabel('c).Result of Sx');
subplot(1,2,2); imshow(g_y,[0 1]); xlabel('d).Result of Sy');
%% ------------------------ M = 64; N = 64; [H,w1,w2] = freqz2(sobel_x,N,M); figure(); subplot(1,2,1); mesh(w1(1:N)*pi,w2(1:M)*pi,abs(H(1:M,1:N))); axis([-pi pi -pi pi 0 12]); xlabel('\omega_1 [rad]');ylabel('\omega_2 [rad]'); zlabel('|H(e^{j\omega_1},e^{j\omega_2})|');
%figure(); subplot(1,2,2); mesh(w1(1:N)*pi,w2(1:M)*pi,unwrap(angle(H(1:M,1:N)))); axis([-pi pi -pi pi -pi pi]); xlabel('\omega_1 [rad]');ylabel('\omega_2 [rad]'); zlabel('\theta [rad]');
[H,w1,w2] = freqz2(sobel_y,N,M); figure(); subplot(1,2,1); mesh(w1(1:N)*pi,w2(1:M)*pi,abs(H(1:M,1:N))); axis([-pi pi -pi pi -12 12]); xlabel('\omega_1 [rad]');ylabel('\omega_2 [rad]'); zlabel('|H(e^{j\omega_1},e^{j\omega_2})|');
%figure(); subplot(1,2,2); mesh(w1(1:N)*pi,w2(1:M)*pi,unwrap(angle(H(1:M,1:N)))); axis([-pi pi -pi pi -pi pi]); xlabel('\omega_1 [rad]');ylabel('\omega_2 [rad]'); zlabel('\theta [rad]');
|
Sobel_Operators.m
3.6 銳化空間濾波器
銳化處理的主要目的是突出圖像中的細(xì)節(jié)或者增強(qiáng)被模糊了的細(xì)節(jié),這種模糊不是由于錯(cuò)誤操作,就是特殊圖像獲取方法的固有印象??偟膩碚f,微分算子的響應(yīng)強(qiáng)度與圖像在該店(應(yīng)用了算子)的突變程度有關(guān)。這樣一來,圖像微分增強(qiáng)了邊緣和其他突變(如噪聲)并削弱了灰度變化緩慢的區(qū)域。
為了說明簡(jiǎn)單,主要集中討論一階微分的性質(zhì)。我們最高興去的微分性質(zhì)是恒定灰度區(qū)域(平坦段)、突變的開頭與結(jié)尾(階梯和斜坡突變)及沿著灰度級(jí)斜坡處的特性。這些類型的突變可以用來對(duì)圖像中的噪聲點(diǎn)、細(xì)線與邊緣模型化。
3.6.1 基礎(chǔ)
數(shù)字函數(shù)(圖像,離散的數(shù)字序列)的微分定義條件:
這里我們首先了解下數(shù)學(xué)函數(shù)的微分,微分可以用不同的術(shù)語定義,也有各種方法定義這些差別,然而,對(duì)于一階微分任何定義都必須保證以下幾點(diǎn):
(1)在平坦段(灰度不變區(qū)域)微分值為零;
(2)在灰度階梯或斜坡的起始點(diǎn)處微分值非零;
(3)沿著斜坡面微分值非零。
任何二階微分的定義也類似:
(1)在平坦去微分值必為零;
(2)在灰度階梯或斜坡的起始點(diǎn)處微分值非零;
(3)沿著斜坡面微分值非零。
因?yàn)槲覀兲幚淼氖菙?shù)字量,其值是有限的,故最大灰度級(jí)的變換也是有限的,變化發(fā)生最短距離是在兩相鄰像素之間。對(duì)于一元函數(shù)f(x)表達(dá)一階微分定義是一個(gè)差值:
f/x = f(x+1) f(x)
這里,為了與對(duì)二元圖像函數(shù)f(x,y)求微分時(shí)的表達(dá)式保持一致,使用偏導(dǎo)數(shù)符號(hào),對(duì)二元函數(shù),我們將沿著兩個(gè)空間軸處理偏微分,類似地,用差分定義二階微分:
下圖表明了上述的具體含義。注意下圖中二階差分的零交叉點(diǎn)(Zero crossing),零交叉點(diǎn)對(duì)于邊緣的定位非常有用。
二階微分在增強(qiáng)細(xì)節(jié)方面比一階微分好得多,這是一個(gè)適合銳化圖像的理想特征。
3.6.2 基于二階微分的圖像增強(qiáng)--拉普拉斯算子
這里介紹二階微分在圖像增強(qiáng)處理中的應(yīng)用。首先定義一個(gè)二階微分的離散公式,然后構(gòu)造一個(gè)基于此式的濾波器。我們最關(guān)注的是一種各向同性濾波器,這種濾波器的響應(yīng)與濾波器作用的圖像的突變方向無關(guān)。也就是說,各向同性濾波器是旋轉(zhuǎn)不變的,即將原始圖像旋轉(zhuǎn)后進(jìn)行濾波處理給出的結(jié)果與先對(duì)圖像濾波,然后再旋轉(zhuǎn)的結(jié)果相同。
處理方法
最簡(jiǎn)單的各向同性微分算子是拉普拉斯算子,一個(gè)二元圖像函數(shù)f(x,y)的拉普拉斯變換定義為:
因?yàn)槿我怆A微分都是線型操作,所以拉普拉斯變換也是一個(gè)線性操作。
考慮到有兩個(gè)變量,因此,我們?cè)趚,y方向上對(duì)二階偏微分采用下倆定義:
因此二維拉維拉斯數(shù)字實(shí)現(xiàn)可由這兩個(gè)分量相加得到:
,這里關(guān)注系數(shù)矩陣即掩膜:
這個(gè)矩陣給出了在90度方向上旋轉(zhuǎn)的各向同性結(jié)果,如果向得到45度方向上旋轉(zhuǎn)的各向同性結(jié)果則,將中心對(duì)角點(diǎn)標(biāo)為1,中心點(diǎn)為-8即可。
由于拉普拉斯是一種微分算子,它的應(yīng)用強(qiáng)調(diào)圖像中灰度的突變及降低灰度慢變化的區(qū)域。將原始圖像和拉普拉斯圖像疊加在一起的簡(jiǎn)單方法可以保護(hù)拉普拉斯銳化處理的效果,同時(shí)又能復(fù)原背景信息。我們使用拉普拉斯變換對(duì)圖像增強(qiáng)的基本方法可表示為下式:
含有對(duì)角線信息的拉普拉斯算子
3.6.3 非銳化掩蔽和高提升濾波
在印刷和出版界用了多年的圖像銳化處理過程,從原圖中減去一副非銳化(平滑后的)圖像,達(dá)到銳化的目的。
步驟有以下幾步:
- 模糊源圖像
- 從原圖像中減去模糊圖像(產(chǎn)生的差值圖像稱為模板)
- 將模板加到原圖像上。
令
表示模糊圖像,那么首先我們得到模板:然后在原圖像上加上該模板的一個(gè)權(quán)重部分:
上式中,當(dāng)k=1時(shí),我們得到上面定義的非銳化掩蔽,當(dāng)k>1時(shí),該處理稱為高提升濾波,當(dāng)k<1時(shí),則不強(qiáng)調(diào)非銳化模板的貢獻(xiàn)。
需要注意的是,如果k足夠大的時(shí)候,負(fù)值將導(dǎo)致邊緣周圍有暗的暈輪,會(huì)產(chǎn)生不好的效果。
3.6.4 使用一階微分對(duì)(非線性)圖像銳化—梯度
一個(gè)函數(shù)f在f(x,y)的梯度是定義為二維列向量(這是一個(gè)矢量,給定了一個(gè)方向):
然后其幅度值為
,其中M(x,y)是與原圖像大小相同的圖像,該圖像通常稱為梯度圖像。后面的表達(dá)式仍保留了灰度的變換,但丟失掉了其各向同性。下面介紹兩種算子:一階Roberts交叉梯度算子和二階Soble算子:
在3×3的區(qū)域圖像中,應(yīng)該是gx = (z8z5) gy = (z9z6),但是Roberts進(jìn)行了改良,提出了Roberts算子,gx=(z9z5),gy=(z8z6);由于偶數(shù)模板沒有對(duì)稱中心,所以與之前的卷積模板定義中,運(yùn)算結(jié)果等會(huì)中心點(diǎn)位置值不能對(duì)應(yīng), 所以使用奇數(shù)的模板,例如3 * 3 的Soble算子,gx=(z7+2z8+z9)(z1+2z2+z3),gy=(z3+2z6+z9)(z1+2z4+z7)。
使用梯度進(jìn)行邊緣增強(qiáng),可以用以突出灰度圖像中看不見的小斑點(diǎn),在下面的例子中甚至可以去除灰度不變或變換緩慢的圖案陰影。
3.7 混合空間增強(qiáng)法
本書所提供例子的策略是:用Laplace突出圖像中的小細(xì)節(jié),然后使用梯度法突出邊緣。平滑過得梯度圖像用于掩蔽Laplace圖像,最后使用灰度變換來增大圖像的灰度動(dòng)態(tài)范圍。其中降低噪聲可以使用中值濾波器或者使用原圖像梯度操作的平滑形式形成的一個(gè)模板。
圖像請(qǐng)直接參考Digital Image Processing (3rd Edition)Page 192。
3.8 使用模糊技術(shù)進(jìn)行灰度變換和空間變換
3.8.1 引言
隸屬度函數(shù)μ(z):用以描述一個(gè)元素是否屬于集合的模糊程度,若是一個(gè)階躍函數(shù),可以認(rèn)為是一個(gè)我們所了解的"干脆的"集合,若是一個(gè)分段函數(shù),則可以看做一個(gè)模糊集合:
3.8.2模糊集合論原理
模糊集合是一個(gè)有z值和(賦予z成員等級(jí)的)相應(yīng)隸屬度函數(shù)組成的序?qū)?,?/span>
A={z,μA(z)|z∈Z}
其中隸屬度函數(shù)是關(guān)鍵,表明了元素z到集合的一種對(duì)應(yīng)關(guān)系。如果隸屬度函數(shù)僅有0,1兩個(gè)值,那么模糊集合退化為"干脆的"集合。下面這張圖展示了模糊集合間的一些關(guān)系:
有一些常用的隸屬度函數(shù),如三角形、梯形、∑型、S型、種型、截尾高斯型等,之后用到了會(huì)另作介紹。
3.8.3 模糊集合的應(yīng)用(略)
3.8.4 使用模糊集合進(jìn)行灰度變換
對(duì)于一副灰度圖像,描述它的某個(gè)區(qū)域"暗的"、"灰的"、"亮的"都是利用模糊的概念,那么我們將給予這三種情況定義三種模糊集合:
那么對(duì)于任何輸入z0,輸出v0為
從書中給予的例子中來看,圖像的細(xì)節(jié)部分得到了比較好的保留,但代價(jià)是計(jì)算量大大增加。