實驗目的
實驗一:圖像增強
瞭解圖像增強的目的及意義,加深對圖像增強的感性認知
1. 掌握直接灰度變換的圖像增強方法
2. 掌握灰度直方圖的概念及其計算方法
3. 掌握直方圖均衡化合直方圖規定化得計算過程
實驗二:圖像平滑和銳化
- 利用臨域平均法,臨域加權平均法,中值濾波對圖像進行濾波處理
- 掌握彩色圖像的濾波處理
- 利用梯度方法對圖像進行銳化處理
- 結合圖像的平滑和銳化增強圖像
實驗三:二維傅里葉變換
對二維的傅立葉變換有一定的認識,瞭解圖像中傅立葉變換的意義 。
實驗原理
圖像增強
圖像增強的方法是通過一定手段對原圖像附加一些信息或變換數據,有選擇地突出圖像中感興趣的特徵或者抑制(掩蓋)圖像中某些不需要的特徵,使圖像與視覺響應特性相匹配。
三. 實驗內容及結果分析。圖像增強是從像素到像素的操作,是以預定的方式改變圖像的灰度直方圖。有時又稱爲對比度增強,灰度變換。點運算不可能改變圖像內的空間關係,輸出像素的灰度值由輸入像素的值決定。其作用:對比度增強:擴展感興趣特徵的對比度。
首先,解釋下什麼是對比度:通俗的講,就是明暗的對比程度,通常表現了圖像畫質的清晰程度,實際上,對比度反映了一幅圖像中明暗區域最亮的白和最暗的黑之間不同亮度層級的測量,即指一幅圖像灰度反差的大小,差異範圍越大代表對比越大,差異範圍越小代表對比
越小,好的對比率120:1就可容易地顯示生動、豐富的色彩,當對比率高達300:1時,便可支持各階的顏色。但對比率遭受和亮度相同的困境,現今尚無一套有效又公正的標準來
衡量對比率,所以最好的辨識方式還是依靠使用者眼睛。
直方圖均衡化:
直方圖均衡化處理的“中心思想”是把原始圖像的灰度直方圖從比較集中的某個灰度區間變成在全部灰度範圍內的均勻分佈。直方圖均衡化就是對圖像進行非線性拉伸,重新分配圖像像素值,使一定灰度範圍內的像素數量大致相同。直方圖均衡化就是把給定圖像的直方圖分佈改變成“均勻”分佈直方圖分佈。缺點:
1)變換後圖像的灰度級減少,某些細節消失;
2)某些圖像,如直方圖有高峯,經處理後對比度不自然的過分增強。
直方圖均衡化是圖像處理領域中利用圖像直方圖對對比度進行調整的方法。
這種方法通常用來增加許多圖像的局部對比度,尤其是當圖像的有用數據的對比度相當接近的時候。通過這種方法,亮度可以更好地在直方圖上分佈。這樣就可以用於增強局部的對比度而不影響整體的對比度,直方圖均衡化通過有效地擴展常用的亮度來實現這種功能。
這種方法對於背景和前景都太亮或者太暗的圖像非常有用,這種方法尤其是可以帶來X光圖像中更好的骨骼結構顯示以及曝光過度或者曝光不足照片中更好的細節。這種方法的一個主要優勢是它是一個相當直觀的技術並且是可逆操作,如果已知均衡化函數,那麼就可以恢復原始的直方圖,並且計算量也不大。這種方法的一個缺點是它對處理的數據不加選擇,它可能會增加背景雜訊的對比度並且降低有用信號的對比度。
直方圖均衡化的基本思想是把原始圖的直方圖變換爲均勻分佈的形式,這樣就增加了象素灰度值的動態範圍從而可達到增強圖像整體對比度的效果。
設r和s人別表示原圖像灰度級和經過直方圖均衡化後的圖像灰度級。爲便於討論,對r和s進行歸一化,使
該變換應該滿足條件
1)對於
2)在
假設變換函數爲
式中:w是積分變量,而
離散形式的直方圖均衡化
設一幅圖像的像元數爲n,公有m個灰度級,
均衡化後的圖像灰度值可直接由原圖像的直方圖算出。
直方圖規定化
在實際應用中,希望能夠有目的地增強某個灰度區間的圖像, 即能夠人爲地修正直方圖的形狀, 使之與期望的形狀相匹配,這就是直方圖規定化的基本思想。換句話說,希望可以人爲地改變直方圖形狀,使之成爲某個特定的形狀,直方圖規定化就是針對上述要求提出來的一種增強技術,它可以按照預先設定的某個形狀來調整圖像的直方圖。直方圖規定化是在運用均衡化原理的基礎上,通過建立原始圖像和期望圖像之間的關係,選擇地控制直方圖,使原始圖像的直方圖變成規定的形狀,從而彌補了直方圖均衡不具備交互作用的特性。
直方圖規定化步驟:
1. 其增強原理是先對原始的直方圖均衡化:S = T(r)
2. 找到一種映射有原來的直方圖映射到新的目的直方圖。
3. 將規定化的直方圖進行均衡化。v = G(z)
3. 由於都是均衡化,故令 S = v,則:z = G-1(v) = G-1[T(r)]
圖像平滑和銳化
圖像平滑是指用於突出圖像的寬大區域、低頻成分、主幹部分或抑制圖像噪聲和干擾高頻成分,使圖像亮度平緩漸變,減小突變梯度,改善圖像質量的圖像處理方法。圖像平滑的方法包括:插值方法,線性平滑方法,卷積法等等。這樣的處理方法根據圖像噪聲的不同進行平滑,比如椒鹽噪聲,就採用線性平滑方法!
均值濾波器
均值濾波器(averaging filter)是消除噪聲的最簡單的方法。原理:使用某像素周圍mxn像素範圍內的平均值來置換該像素值。通過使圖像模糊,達到看不到細小噪聲的目的。不良反應:使用這種方法,在噪聲被消除的同時,目標圖像也變模糊了。
中值濾波
消除噪聲最好的結果是,在消除噪聲的同時,圖像邊緣完好的保留。中值濾波能夠比較好的實現這一點。原理:查看mxn鄰域內的像素灰度,按照從小到大的順序進行排列,結果取中間值。
中值濾波器與均值濾波器比較的優勢:在均值濾波器中,由於噪聲成分被放入平均計算中,所以輸出受到了噪聲的影響,但是在中值濾波器中,由於噪聲成分很難選上,所以幾乎不會影響到輸出。因此同樣用3x3區域進行處理,中值濾波消除的噪聲能力更勝一籌。中值濾波無論是在消除噪聲還是保存邊緣方面都是一個不錯的方法。
銳化原理
在圖像增強過程中,通常利用各類圖像平滑算法消除噪聲,圖像的常見噪聲主要有加性噪聲、乘性噪聲和量化噪聲等。一般來說,圖像的能量主要集中在其低頻部分,噪聲所在的頻段主要在高頻段,同時圖像邊緣信息也主要集中在其高頻部分。這將導致原始圖像在平滑處理之後,圖像邊緣和圖像輪廓模糊的情況出現。爲了減少這類不利效果的影響,就需要利用圖像銳化技術,使圖像的邊緣變得清晰。圖像銳化處理的目的是爲了使圖像的邊緣、輪廓線以及圖像的細節變得清晰,經過平滑的圖像變得模糊的根本原因是因爲圖像受到了平均或積分運算,因此可以對其進行逆運算(如微分運算)就可以使圖像變得清晰。微分運算是求信號的變化率,由傅立葉變換的微分性質可知,微分運算具有較強高頻分量作用。從頻率域來考慮,圖像模糊的實質是因爲其高頻分量被衰減,因此可以用高通濾波器來使圖像清晰。但要注意能夠進行銳化處理的圖像必須有較高的性噪比,否則銳化後圖像性噪比反而更低,從而使得噪聲增加的比信號還要多,因此一般是先去除或減輕噪聲後再進行銳化處理。
2.4 圖像銳化的幾種方式
1) 水平豎直直梯度
2) Robert 梯度
3) Sobel 算子
4) 二階梯度
在圖像處理中,一階微分是通過梯度算法來實現的,對於一幅圖像用函數f(x,y)表示,定義在f(x,y)在點(x,y)處的梯度是一個矢量,定義爲:
梯度的方向在函數f(x,y)最大變化率的方向上,梯度的幅度G[f(x,y)]可以由以下公式算出:
彩色圖像的平滑
彩色圖像平滑處理和灰度圖像的平滑處理類似,差別在於彩色圖像需要對各個通道依次進行平滑操作,使得每一個通道對應的圖像都經過平滑處理,時間複雜度要遠比灰度圖像的高。還有就是彩色圖像的噪聲和灰度圖的噪聲有所差別,有時候需要區別的對待。
二維傅立葉變換
傅里葉提出任何周期函數都可以表示爲不同頻率的正弦和/或餘弦和的形式,每個正弦和/或餘弦乘以不同的係數(傅里葉級數)。圖像的頻率是表徵圖像中灰度變化劇烈程度的指標,是灰度在平面空間上的梯度.在噪聲點和圖像邊緣處的頻率爲高頻。
傅立葉變換在實際中有非常明顯的物理意義,設f是一個能量有限的模擬信號,則其傅立葉變換就表示f的譜。從純粹的數學意義上看,傅立葉變換是將一個函數轉換爲一系列周期函數來處理的。從物理效果看,傅立葉變換是將圖像從空間域轉換到頻率域,其逆變換是將圖像從頻率域轉換到空間域。換句話說,傅立葉變換的物理意義是將圖像的灰度分佈函數變換爲圖像的頻率分佈函數,傅立葉逆變換是將圖像的頻率分佈函數變換爲灰度分佈函數.
傅立葉變換以前,圖像(未壓縮的位圖)是由對在連續空間(現實空間)上的採樣得到一系列點的集合,我們習慣用一個二維矩陣表示空間上各點,則圖像可由z=f(x,y)來表示。由於空間是三維的,圖像是二維的,因此空間中物體在另一個維度上的關係就由梯度來表示,這樣我們可以通過觀察圖像得知物體在三維空間中的對應關係。爲什麼要提梯度?因爲實際上對圖像進行二維傅立葉變換得到頻譜圖,就是圖像梯度的分佈圖,當然頻譜圖上的各點與圖像上各點並不存在一一對應的關係,即使在不移頻的情況下也是沒有。傅立葉頻譜圖上我們看到的明暗不一的亮點,實際上圖像上某一點與鄰域點差異的強弱,即梯度的大小,也即該點的頻率的大小(可以這麼理解,圖像中的低頻部分指低梯度的點,高頻部分相反)。一般來講,梯度大則該點的亮度強,否則該點亮度弱。這樣通過觀察傅立葉變換後的頻譜圖,也叫功率圖,我們首先就可以看出,圖像的能量分佈,如果頻譜圖中暗的點數更多,那麼實際圖像是比較柔和的(因爲各點與鄰域差異都不大,梯度相對較小),反之,如果頻譜圖中亮的點數多,那麼實際圖像一定是尖銳的,邊界分明且邊界兩邊像素差異較大的。對頻譜移頻到原點以後,可以看出圖像的頻率分佈是以原點爲圓心,對稱分佈的。將頻譜移頻到圓心除了可以清晰地看出圖像頻率分佈以外,還有一個好處,它可以分離出有週期性規律的干擾信號,比如正弦干擾,一副帶有正弦干擾,移頻到原點的頻譜圖上可以看出除了中心以外還存在以某一點爲中心,對稱分佈的亮點集合,這個集合就是干擾噪音產生的,這時可以很直觀的通過在該位置放置帶阻濾波器消除干擾。
圖像是兩個參數的函數,通過一組正交函數的線性組合可以將其分解,而傅里葉就是通過諧波函數來分解的。而對於離散傅里葉變換,傅里葉變換的條件是存在的。
傅里葉變換進行圖像處理有幾個特點
1. 直流成分F(0,0)等於圖像的平均值;
2. 能量頻譜|F(u,v)|^2完全對稱於原點;其中F=PfQ, f表示原圖,P和Q都是對稱的實正交矩陣,這個公式表示傅里葉變換就是個正交矩陣的正交變換
3.圖像f平移(a,b)後,F只有exp[-2pij(au/M+bv/M)]的相位變化,能量頻譜不發生變化。
4. 圖像f自乘平均等於能量頻譜的總和,f的分散等於能量頻譜中除直流成分後的總和。
5.圖像f(x,y)和g(x,y)的卷積h(x,y)=f(x,y)*g(x,y)的傅里葉變換H(u,v)等於f(x,y)和g(x,y)各自的傅里葉變換的乘積。
圖像中的每個點通過傅里葉變換都成了諧波函數的組合,也就有了頻率,這個頻率則是在這一點上所有產生這個灰度的頻率之和,也就是說傅里葉變換可以將這些頻率分開來。當想除去圖像背景時,只要去掉背景的頻率就可以了。
在進行傅里葉變換時,實際上在某一特定的頻率下,計算每個圖像位置上的乘積。什麼乘積呢,就是f(x,y)exp[-j2pi(ux+vy)],然後計算下一個頻率。這樣就得到了頻率函數。
也就是說,我們看到傅里葉變換的每一項(對每對頻率u,v,F(u,v)的值)是由f(x)函數所有值的和組成。f(x)的值與各種頻率的正弦值和餘弦值相乘。因此,頻率u, v決定了變換的頻率成分(x, y也作用於頻率,但是它們相加,對頻率有相同的貢獻)。
通常在進行傅里葉變換之前用(-1)^(x+y)乘以輸入的圖像函數,這樣就可以將傅里葉變換的原點F(0,0)移到(M/2,N/2)上。
每個F(u,v)項包含了被指數修正的f(x,y)的所有值,因而一般不可能建立圖像特定分量和其變換之間的聯繫。然而,一般文獻通常會有關於傅里葉變換的頻率分量和圖像空間特徵之間聯繫的闡述。變換最慢的頻率成分(u=v=0)對應一幅圖像的平均灰度級。當從變換的原點移開時,低頻對應着圖像的慢變換分量,較高的頻率開始對應圖像中變化越來越快的灰度級。這些事物體的邊緣和由灰度級的突發改變(如噪聲)標誌的圖像成分。
實驗內容及結果分析
直方圖均衡化
從文件中讀取一幅圖像,轉換成灰度圖,將其進行均衡化處理,最後對比原始灰度圖和均衡化後的結果。
下面的函數是我自己寫的均衡化操作函數
核心函數:
1. function re = HistgramEqualization(gray)
2. %直方圖均衡化的函數
3. [m, n] = size(gray);
4. count = zeros(1, 256);
5. for i = 1 : m
6. for j = 1 : n
7. count(gray(i, j) + 1) = count(gray(i, j) + 1) + 1;
8. end
9. end
10. ratio = count ./ (m * n);
11. new_ratio = zeros(1, 256);
12. % 統計各個灰度級的數量
13. for i = 1 : 256
14. for j = 1 : i
15. new_ratio(i) = new_ratio(i) + ratio(j);
16. end
17. end
18. %新的比例
19. new_count = floor(new_ratio .* 256);
20. for i = 1 : m
21. for j = 1 : n
22. re(i, j) = new_count(gray(i, j) + 1);
23. end
24. end
25. end
這個函數是自己編寫的一個將原始圖像進行直方圖均衡化的函數。
從均衡化後的結果可以看出來,圖像的對比度略有提升,對應的直方圖的分佈也相對均勻。但缺點是某些像素值是沒有的,也就是灰度值少了一些。
直方圖規定化
直方圖規定化是給出一個映射使直方圖按所需映射要求進行變換, 測試程序的代碼如下所示:
“`
1. I = imread(‘123.jpg’);
2. I = rgb2gray(I);
3. hgram=0:255;
4. J = histeq(I,hgram);
5. figure(),imshow(I),title(‘原始圖像’);
6. figure(), imshow(J),title(‘直方圖規定化後圖像’);
7. figure(), imhist(I),title(‘原始圖像直方圖’);
8. figure(), imhist(J),title(‘規定化後圖像直方圖’);
““
效果如下圖所示
鄰域平均法對圖像進行平滑
首先在原始圖像上加上一些噪聲,然後利用鄰域平均法對圖像進行平滑處理。
下面是我自己寫的對灰度圖進行鄰域平均法進行平滑的函數,參數gray是待輸入的灰度圖像矩陣,參數N表示模板的維數,N只能爲3或者5,當N爲3時,模板爲3×3的,程序運行時可根據不同情況選取不同的模板。
1. function re = AverageBoxFilter(gray, N)
2. %均值濾波函數 N 是 模板的維數
3. [m, n] = size(gray);
4. Answer = zeros(m, n);
5. out = zeros(m + (N - 1), n + (N - 1));
6. out((N - 1) / 2 + 1 : (N - 1) / 2 + m, (N - 1) / 2 + 1 : (N - 1) / 2 + n) = gray(:, :);
7. if N == 3
8. neighborIndex = [
9. -1, -1; -1, 0; -1, 1;
10. 0, -1; 0, 0; 0, 1;
11. 1, -1; 1, 0; 1, 1 ];
12. out(1, 2 : n + 1) = gray(1,1 : n);
13. out(m + 2, 2 : n + 1) = gray(1, 1 : n);
14. out(2 : m + 1, 1) = gray(1 : m, 1);
15. out(2 : m + 1, n + 2) = gray(1 : m, n);
16. out(1, 1) = gray(1, 1);
17. out(1, n + 2) = gray(1, n);
18. out(m + 2, 1) = gray(m, 1);
19. out(m + 2, n + 2) = gray(m, n);
20. else
21. if N == 5
22. neighborIndex = [
23. -2, -2; -2, -1; -2, 0; -2, 1; -2, 2;
24. -1, -2; -1, -1; -1, 0; -1, 1; -1, 2;
25. 0, -2; 0, -1; 0, 0; 0, 1; 0, 2;
26. 1, -2; 1, -1; 1, 0; 1, 1; 1, 2;
27. 2, -2; 2, -1; 2, 0; 2, 1; 2, 2; ];
28. end
29. end
30. neighbor = zeros(N * N, 1);
31. %neighborIndex = zeros(9, 2);
32. for i = (N - 1) / 2 + 1 : (N - 1) / 2 + m
33. for j = (N - 1) / 2 + 1 : (N - 1) / 2 + n
34. for k = 1 : N * N
35. neighbor(k) = out(i + neighborIndex(k, 1), j + neighborIndex(k, 2));
36. % sort(neighbor);
37. end
38. Answer(i - 1, j - 1) = uint8(mean(neighbor));
39. end
40. end
41. re = Answer; end
鄰域均值濾波效果如下:
從上述三幅圖像中我們可以看出利用均值濾波函數進行去除高斯噪聲是有一定效果的,圖2.2和圖2.3 都明顯有去噪效果。此外,3×3模板和5×5模板效果也會略有差異,從圖中看出5×5模板明顯失去了一些圖像細節。
中值濾波
圖像中值濾波一般用於圖像去除椒鹽噪聲,類似於電視機出現的雪花,手機屏幕出現明顯的噪點等等。
下面的函數是我自己寫的去除椒鹽噪聲的中值濾波函數,參數gray爲待輸入的原始圖像,N爲可選參數表示模板的維數。
1. function re = MiddleBoxFilter(gray, N)
2. %中值濾波函數, N表示模板的尺寸 N*N
3. [m, n] = size(gray);
4. Answer = zeros(m, n);
5. out = zeros(m + (N - 1), n + (N - 1));
6. out((N - 1) / 2 + 1 : (N - 1) / 2 + m, (N - 1) / 2 + 1 : (N - 1) / 2 + n) = gray(:, :);
7. if N == 3
8. %邊界處理
9. neighborIndex = [
10. -1, -1; -1, 0; -1, 1;
11. 0, -1; 0, 0; 0, 1;
12. 1, -1; 1, 0; 1, 1 ];
13. out(1, 2 : n + 1) = gray(1,1 : n);
14. out(m + 2, 2 : n + 1) = gray(1, 1 : n);
15. out(2 : m + 1, 1) = gray(1 : m, 1);
16. out(2 : m + 1, n + 2) = gray(1 : m, n);
17. out(1, 1) = gray(1, 1);
18. out(1, n + 2) = gray(1, n);
19. out(m + 2, 1) = gray(m, 1);
20. out(m + 2, n + 2) = gray(m, n);
21. else
22. if N == 5
23. neighborIndex = [
24. -2, -2; -2, -1; -2, 0; -2, 1; -2, 2;
25. -1, -2; -1, -1; -1, 0; -1, 1; -1, 2;
26. 0, -2; 0, -1; 0, 0; 0, 1; 0, 2;
27. 1, -2; 1, -1; 1, 0; 1, 1; 1, 2;
28. 2, -2; 2, -1; 2, 0; 2, 1; 2, 2; ];
29. end
30. end
31. neighbor = zeros(N * N, 1);
32. %neighborIndex = zeros(9, 2);
33. for i = (N - 1) / 2 + 1 : (N - 1) / 2 + m
34. for j = (N - 1) / 2 + 1 : (N - 1) / 2 + n
35. for k = 1 : N * N
36. neighbor(k) = out(i + neighborIndex(k, 1), j + neighborIndex(k, 2));
37. end
38. Answer(i - 1, j - 1) = median(neighbor);
39. end
40. end
41. re = Answer;
42. re = uint8(re);
中值濾波效果如下
通過兩幅圖片的對比我們可以看出來,中值濾波對於椒鹽噪聲的去除效果非常明顯,經過中值濾波操作,像基本不會有椒鹽噪聲的存在。
圖像銳化利用一階水平豎直梯度
水平數值一階梯度上面原理已經說過,下面列出我寫的代碼,輸入參數pic爲待處理的圖像矩陣,varargin表示可選的閾值參數,得到的梯度值大於這個值則梯度值賦爲255,否則賦爲0,這樣可以更清楚地對圖像的邊緣進行表現。
1. function re = Gradient(pic, varargin)
2. %計算水平數值梯度
3. [m, n] = size(pic);
4. if numel(varargin) == 0
5. threshold = 40;
6. else
7. threshold = varargin{1};
8. end
9. grad = zeros(m - 1, n - 1);
10. for i = 1 : m - 1
11. for j = 1 : n -1
12. G = abs(pic(i + 1, j) - pic(i, j)) + abs(pic(i, j) - pic(i, j + 1));
13. if G > threshold;
14. grad(i, j) = 255;
15. else
16. grad(i, j) = 0;
17. end
18. end
19. end
20. re = grad;
21. end
用一階的水平豎直梯度進行圖像銳化的效果如下圖所示
從圖中的對比中我們發現圖像中具有明顯邊界的區域很明顯地被識別出來,即在圖像中輪廓的邊界往往蘊含着梯度信息。
圖像銳化之Robert梯度
Robert梯度旨在尋找不僅僅水平和豎直兩個方向的梯度,所以Robert表示爲斜向的梯度。下面是我寫的關於Robert梯度計算的函數RobertGradient(pic, varargin),同樣的,pic表示原始圖像矩陣,varargin表示可選的閾值參數,默認爲40,當得到的梯度模大於40,對應的像素點的值爲255,否則爲0。
1. function re = RobertGradient(pic, varargin)
2. %計算Robert梯度
3. [m, n] = size(pic);
4. if size(varargin) == 0
5. threshold = 40;
6. else
7. threshold = varargin{1};
8. end
9. grad = pic(1 : m -1, 1 : n - 1);
10. for i = 1 : m - 1
11. for j = 1 : n - 1
12. G = abs(pic(i + 1, j + 1) - pic(i, j)) + abs(pic(i + 1, j) - pic(i, j + 1));
13. if G > threshold
14. grad(i, j) = 255;
15. else
16. grad(i, j) = 0;
17. end
18. end
19. end
20. re = grad;
21. end
Robert梯度的算法效果如下:
圖像銳化之Sobel梯度
Sobel算子根據像素點上下、左右鄰點灰度加權差,在邊緣處達到極值這一現象檢測邊緣。對噪聲具有平滑作用,提供較爲精確的邊緣方向信息,邊緣定位精度不夠高。當對精度要求不是很高時,是一種較爲常用的邊緣檢測方法。下面是我寫的Sobel算子進行銳化的函數。
1. function re = Sobel_da(gray, varargin)
2. [m, n] = size(gray);
3. if numel(varargin) == 0
4. threshold = 20;
5. else
6. threshold = varargin{1};
7. end
8. gray = double(gray);
9. S = gray;
10. NIndex = [
11. -1, -1; -1, 0; -1, 1;
12. 0, -1; 0, 0; 0, 1;
13. 1, -1; 1, 0; 1, 1];
14. NxMask = [1, 0, -1, 2, 0, -2, 1, 0, -1];
15. NyMask = [-1, -2, -1, 0, 0, 0, 1, 2, 1];
16. for i = 2 : m - 1
17. for j = 2 : n - 1
18. Sx = 0;
19. Sy = 0;
20. for k = 1 : 9
21. Sx = NxMask(k) * gray(i + NIndex(k, 1), j + NIndex(k, 2)) + Sx;
22. Sy = NyMask(k) * gray(i + NIndex(k, 1), j + NIndex(k, 2)) + Sy;
23. end
24. G = sqrt(double(Sx^2 + Sy^2));
25. S(i, j) = uint8(G);
26. end
27. end
28. re = S;
29. end
30. function re = Sobel_da(gray, varargin)
31. [m, n] = size(gray);
32. if numel(varargin) == 0
33. threshold = 20;
34. else
35. threshold = varargin{1};
36. end
37. gray = double(gray);
38. S = gray;
39. NIndex = [
40. -1, -1; -1, 0; -1, 1;
41. 0, -1; 0, 0; 0, 1;
42. 1, -1; 1, 0; 1, 1];
43. NxMask = [1, 0, -1, 2, 0, -2, 1, 0, -1];
44. NyMask = [-1, -2, -1, 0, 0, 0, 1, 2, 1];
45. for i = 2 : m - 1
46. for j = 2 : n - 1
47. Sx = 0;
48. Sy = 0;
49. for k = 1 : 9
50. Sx = NxMask(k) * gray(i + NIndex(k, 1), j + NIndex(k, 2)) + Sx;
51. Sy = NyMask(k) * gray(i + NIndex(k, 1), j + NIndex(k, 2)) + Sy;
52. end
53. G = sqrt(double(Sx^2 + Sy^2));
54. S(i, j) = uint8(G);
55. end
56. end
57. re = S;
58. end
Sobel的算法效果如下圖所示:
Sobel邊緣檢測的結果能用線條較好地描述圖像,源圖像中對比度較高的區域在結果圖中體現爲高灰度的像素,簡單地說就是對源圖像進行了“描邊”操作。在進行圖像細化時,最直接的思路就是對線條寬度進行縮減,然而圖像中的線條往往是不規則的,這使得直接對線條進行處理的方法很難實現。
從上面三種圖像銳化操作的結果對比中我們可以看出水平豎直梯度和Robert梯度的銳化效果近似,但對比於Sobel算子,他們在細節上有很明顯的缺失。Sobel感覺上圖像的邊緣信息不僅僅被提取出來而且進一步被細化。
圖像傅立葉變換
圖像的傅立葉變換
圖像的傅立葉變換,原始圖像由N行N列構成,N必須是基2的,把這個N*N個包含圖像的點稱爲實部,另外還需要N*N個點稱爲虛部,因爲FFT是基於複數的。計算圖像傅立葉變換的過程很簡單:首先對每一行做一維FFT,然後對每一列做一維FFT。具體來說,先對第0行的N個點做FFT(實部有值,虛部爲0),將FFT輸出的實部放回原來第0行的實部,FFT輸出的虛部放回第0行的虛部,這樣計算完全部行之後,圖像的實部和虛部包含的是中間數據,然後用相同的辦法進行列方向上的FFT變換,這樣N*N的圖像經過FFT得到一個N*N的頻譜。
實驗內容分析
下面我們進行在頻域進行圖像壓縮的實驗,實驗方法是將圖像進行二維的傅立葉變換,然後在頻域矩陣中去掉某些頻率的值這樣使得原本的圖像失去一些對應頻率的基向量,從而達到數據壓縮的效果。這裏我們在頻域中利用圖像像素乘法的思想對頻域圖像進行壓縮,讓ROI區域以外的幅度值變爲0,ROI部分的區域值不變,最後進行反傅立葉變化,實現圖像的壓縮變換。這種壓縮變換往往是不可逆的,所以並不屬於無失真壓縮方法。本實驗中ROI的選取是以圖像中心做爲圓心,以指定數值爲半徑做的圓作爲實驗中的ROI。
實驗的代碼
1. I_in=imread('./cat.jpg');
2. I_t=im2double(I_in);
3. I_fft=fft2(I_t);
4. figure,imshow(abs(I_fft));
5.
6.
7. I_fft=fftshift(I_fft);
8. figure,imshow(abs(I_fft));
9. figure,imshow(real(I_fft));
10. figure,imshow(imag(I_fft));
11. n=250;%圓形半徑
12. [height,width,t] = size(I_fft);
13. a=zeros(height,width,t);
14. for i=1:height
15. for j=1:width
16. for k=1:3
17. if sqrt((i-height/2)^2+(j-width/2)^2)<=n % 如果在圓內
18. a(i,j,k)=1;
19. end
20. end
21. end
22. end
23. I_filter1=a;
24. figure;imshow(abs(I_filter1));
25.
26. I_filter=I_filter1.*I_fft; %獲取某圓內的頻率分量
27. figure;imshow(abs(I_filter)); %
28.
29. I_o=ifftshift(I_filter);
30. I_o=ifft2(I_o);
31. figure('name','最終'),imshow(abs(I_o));
實驗結果
首先原始圖像是一隻可愛的貓咪如下圖:
將上述圖像進行傅立葉變換得到
上圖分別表示傅立葉變換後圖像的實部和傅立葉變換後的虛部。
下面將通過選取不同的ROI區域對原圖像進行壓縮變換,最後對比結果。
從結果圖中可以看出圖像經過這樣的壓縮變換後僅僅能大致看清事物的輪廓,其他細節部分已經完全分辨不出。通過上述實驗我們實踐了通過傅立葉變換進行壓縮變換的原理,並且認識到傅立葉變換在信號及圖像處理中具有重要意義。
總結
已經做過四次實驗報告了,看着自己寫的一些完成一些圖像處理的基礎算法還是有一點小成就感呢,似乎有點小激動,不過最大的感慨就是,知識和實踐相結合是一件非常美妙的事,實踐能幫助增強對知識本身的理解,知識推動者實踐的熱情。無論學習也好,科研也罷,儘自己最大的努力去爭取,去探索,我相信我們成功的概率一定會越來越大的。