圖像平滑的主要目的是消除噪聲或模糊圖像,去除小的細節或彌合目標間的縫隙。從信號頻譜角度來看,信號緩滿變化的部分在頻域表現為低頻,而迅速變化的部分表現為高頻,如圖像的邊緣、跳躍以及噪聲等灰度變化劇烈的部分代表圖像的高頻分量,而灰度變化緩慢的區域代表圖像的低頻分量。因此,可以在空間域或頻率域通過低通濾波來減弱或消除高頻分量而不影響低頻分量以實現圖像平滑。
一、圖像噪聲
噪聲可以理解為“妨礙人們感覺器官對所接收的信源信息理解的因素”。圖像在獲取、存儲、處理和傳輸過程中,會受到電氣系統和外界干擾而存在一定程度的噪聲。圖像噪聲使得圖像模糊,甚至淹沒圖像特征,造成分析困難。噪聲也可以理解為不可預測的隨機誤差,可以看作是隨機過程,因而可以借用概率論與數理統計的方法來描述,如概率分布函數、概率密度函數、均值、方差和相關函數等。
噪聲可以按照如下方式分類:
(1)按照產生原因,圖像噪聲可分為外部噪聲和內部噪聲。由外部干擾引起的噪聲為外部噪聲,如外部電氣設備產生的電磁波干擾、天體放電產生的脈沖干擾等。由系統電氣設備內部引起的噪聲為內部噪聲,如內部電路的相互干擾。
(2)按照統計特性,圖像噪聲可分為平穩噪聲和非平穩噪聲。統計特性不隨時間變化的噪聲稱為平穩噪聲,統計特性隨時間變化的噪聲稱為非平穩噪聲。
(3)按照蝠度分布,圖像噪聲可以分為高斯噪聲、椒鹽噪聲等。幅度分布服從高斯分布的噪聲稱為高斯噪聲。椒鹽噪聲也稱為脈沖噪聲,由隨機分布的白點(鹽噪聲)和黑點(胡椒噪聲)組成。
(4)按照噪聲頻譜,圖像噪聲可以分為白噪聲和1/f噪聲等。功率譜密度在頻域內均勻分布的噪聲稱為白噪聲。功率譜密度與頻率成反比的噪聲稱為1/f噪聲或粉紅噪聲。
(5)按噪聲和信號之間的關系,圖像噪聲可分為加性噪聲和乘性噪聲。假定信號為S(t),噪聲為n(t),如果混合疊加波形是S(t)+n(t)形式,則稱其為加性噪聲;如果疊加波形為S(t)[1+n(t)]形式,則稱其為乘性噪聲。加性噪聲與信號強度不相關,而乘性噪聲則與信號強度有關。為了分析處理方便,往往將乘性噪聲近似認為加性噪聲,而且總是假定信號和噪聲是互相獨立的。
二、代碼實現圖像平滑去噪
均值濾波
代碼實現
function G = avefilter(F, k) % F 是待處理的圖像 % k 是模版的大小,奇數 [m, n] = size(F); % 轉換數據類型,便於計算 G = uint16(zeros(m, n));Ft = uint16(F); M = uint16(ones(k, k)); h = (k+1)/2; for i = 1:m for j = 1:n if((i < h)|| (j < h)|| (i > m-h+1)|| (j > n-h+1)) %不能被模版處理的區域 G(i, j) = Ft(i, j); continue; %像素值不變 end %取同樣大小的圖像塊,中間的像素是待處理的像素 T = Ft(i-(k-1)/2: i+(k-1)/2, j-(k-1)/2: j+(k-1)/2); T = T.*M; %和模版相乘 G(i, j) = sum(T(:))/k^2; %結果求和並計算平均值 end end G = uint8(G); %結果轉換成8-bit圖像的數據類型
調用函數
%% 均值濾波 clear; g = imread('gull.jpg'); gg = imnoise(g, 'gaussian'); %添加高斯噪聲 subplot(2,2,1), imshow(gg); title("高斯噪聲"); j = 2; for i = 3:4:11 G = avefilter(gg, i); subplot(2,2,j), imshow(G); title([num2str(i), '\ast', num2str(i), '均值濾波']); j = j+1; end
結果顯示
中值濾波
代碼實現
function G = medianfilter(F, k) % F 是待處理的圖像 % k 是模版的大小,奇數 [m, n] = size(F); % 轉換數據類型,便於計算 G = uint16(zeros(m, n)); Ft = uint16(F); M = uint16(ones(k, k)); h = (k+1)/2; for i = 1:m for j = 1:n if((i < h)|| (j < h)|| (i > m-h+1)|| (j > n-h+1)) %不能被模版處理的區域 G(i, j) = Ft(i, j); continue; %像素值不變 end % 取同樣大小的圖像塊,中間的像素是待處理的像素 T = Ft(i-(k-1)/2: i+(k-1)/2, j-(k-1)/2: j+(k-1)/2); T = T(:); %將矩陣轉換為一維向量 G(i, j) = median(T); %求中值並賦值給中間像素 end end G = uint8(G); %結果轉換成8-bit圖像的數據類型
調用函數
%% 中值濾波 clear; g = imread('gull.jpg'); gg = imnoise(g, 'salt & pepper', 0.05); %添加椒鹽噪聲 subplot(2,2,1), imshow(gg); title("椒鹽噪聲"); j = 2; for i = 3:4:11 G = medfilter(gg, i); subplot(2,2,j), imshow(G); title([num2str(i), '\ast', num2str(i), '中值濾波']); j = j+1; end
結果顯示