1、濾波
濾波(Wave filtering)是將信號中特定波段頻率濾除的操作,是抑制和防止干擾的一項重要措施。在圖像處理中,濾波是圖像預處理的一種。圖像處理中濾波將信號中特定的波段頻率濾除,從而保留所需要的波段頻率信號。
2、濾波的作用
(1)消除圖像中混入的噪聲
對應的是低通濾波,噪聲在圖像中一般是高頻信號。
(2)為圖像識別抽取出圖像特征
這里的特征一般為邊緣紋理的特征,對應的是高通濾波,圖像中邊緣和紋理細節是高頻信號。
3、濾波的分類
圖像中濾波算法的分類有很多,可以分為線性濾波和非線性濾波,可以分為相關濾波和卷積濾波,還可以分為高通濾波和低通濾波,空間濾波和頻域濾波。
3.1線性濾波
用於時變輸入信號的線性運算,在圖像處理中可以這么理解,對於輸入的信號(即要處理的圖像),進行的是線性的運算,得出的結果作為輸出圖像。
線性濾波的包含方框濾波、均值濾波、高斯濾波、拉普拉斯濾波、sobel算子等。
3.2非線性濾波
輸出的信號響應是由輸入經過非線性的運算得到的。比如典型的中值濾波,就是取像素點鄰域的中值作為像素的的響應輸出。
非線性濾波包含中值濾波和雙邊濾波
4、中值濾波
中值濾波是基於排序統計理論的一種能有效抑制噪聲的非線性信號處理技術,中值濾波的基本原理是把數字圖像或數字序列中一點的值用該點的一個鄰域中各點值的中值代替,讓周圍的像素值接近的真實值,從而消除孤立的噪聲點。方法是用某種結構的二維滑動模板,將板內像素按照像素值的大小進行排序,生成單調上升(或下降)的為二維數據序列。二維中值濾波輸出為g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分別為原始圖像和處理后圖像。W為二維模板,通常為3x3,5x5區域,也可以是不同的的形狀,如線狀,圓形,十字形,圓環形等。
原理圖解釋:
4 | 5 | 6 | ||
8 | 2 | 7 | ||
5 | 6 | 9 | ||
g(x,y)=med{f(x-k,y-l),(k,l∈W)}
g =med[4,5,6;8,2,7;5,6,9] = 6
2、4、5、5、6、6、7、8、9中間的值為6
6 | ||||
MATLAB程序
clc clear clear all close all %%%對圖像做中值濾波處理 img = imread('1.png'); figure(1) subplot(2,2,1),imshow(img),title('原始圖像') %%%將彩色圖像轉灰度圖像 img_gray = rgb2gray(img); subplot(2,2,2),imshow(img_gray),title('RGB-GRAY灰度圖像') %%%加入椒鹽噪聲 img_salt=imnoise(img_gray,'salt & pepper',0.3); subplot(2,2,3),imshow(img_salt),title('加入椒鹽噪聲后') %%%系統自帶的中值濾波 系統自帶的中值濾波輸入參數為2維圖像 img_mid=medfilt2(img_salt,[3 3]); subplot(2,2,4),imshow(img_mid),title('對噪聲圖像中值濾波后'); %%%對彩色圖像濾波 figure(2) subplot(2,2,1),imshow(img),title('原始圖像') img_salt=imnoise(img,'salt & pepper',0.3); subplot(2,2,2),imshow(img_salt),title('加入椒鹽噪聲后') img_rgb = img; img_rgb(:,:,1) = medfilt2(img(:,:,1),[3 3]); img_rgb(:,:,2) = medfilt2(img(:,:,2),[3 3]); img_rgb(:,:,3) = medfilt2(img(:,:,3),[3 3]); subplot(2,2,3),imshow(img_rgb),title('加入中值濾波后')
自定義的函數
function [ img ] = median_filter( image, m ) %---------------------------------------------- %中值濾波 %輸入: %image:原圖 %m:模板的大小3*3的模板,m=3 %輸出: %img:中值濾波處理后的圖像 %---------------------------------------------- n = m; [ height, width ] = size(image); x1 = double(image); x2 = x1; for i = 1: height-n+1 for j = 1:width-n+1 mb = x1( i:(i+n-1), j:(j+n-1) );%獲取圖像中n*n的矩陣 mb = mb(:);%將mb變成向量化,變成一個列向量 mm = median(mb);%取中間值 x2( i+(n-1)/2, j+(n-1)/2 ) = mm; end end img = uint8(x2); end
img_mid_salt = median_filter( img, 3 ); subplot(2,2,4),imshow(img_mid_salt),title('自定義中值濾波后')
還有一種計算中值的方法,適合在硬件上實現
當我們使用3x3窗口后獲取領域中的9個像素,就需要對9個像素值進行排序,為了提高排序效率,排序算法思想如圖所示。
(1)對窗內的每行像素按降序排序,得到最大值、中間值和最小值。
(2)把三行的最小值即第三列相比較,取其中的最大值。
(3)把三行的最大值即第一列相比較,取其中的最小值。
(4)把三行的中間值即第二列相比較,再取一次中間值。
(5)把前面的到的三個值再做一次排序,獲得的中值即該窗口的中值。
sort排序函數
sort(A)若A可以使矩陣或行列向量,默認都是對A進行升序排列。
sort(A)是默認的升序,而sort(A,'descend')是降序排序。
sort(A)若A是矩陣,默認對A的各列進行升序排列
sort(A,dim)
dim=1時相當於sort(A)
dim=2時表示對矩陣A中的各行元素升序排列
sort(A, dim, 'descend’)則對矩陣的每行進行降序排列
代碼
%%%方法二 %%默認對灰度圖像處理 img_salt=imnoise(img_gray,'salt & pepper',0.03); Median_Img = img_salt; [ROW,COL]= size(img_salt); for r = 2:ROW-1 for c = 2:COL-1 median3x3 =[img_salt(r-1,c-1) ,img_salt(r-1,c) ,img_salt(r-1,c+1); img_salt(r,c-1) ,img_salt(r,c) ,img_salt(r,c+1); img_salt(r+1,c-1) ,img_salt(r+1,c) ,img_salt(r+1,c+1)]; sort1 = sort(median3x3,2,'descend');%%%行排序(降序) sort2 = sort([sort1(1), sort1(4), sort1(7)], 'descend');%%%列排序(升序)取最小 sort3 = sort([sort1(2), sort1(5), sort1(8)], 'descend');%%%列排序(升序)取中間 sort4 = sort([sort1(3), sort1(6), sort1(9)], 'descend');%%%列排序(升序)取最大 mid_num = sort([sort2(3), sort3(2), sort4(1)], 'descend');%%%列排序(升序) Median_Img(r,c) = mid_num(2);%%取中間 end end figure(3) imshow(Median_Img),title('方法二中值濾波后')