基於MATLAB的中值濾波算法實現

  在實時圖像採集中,不可避免的會引入噪聲,尤爲是干擾噪聲和椒鹽噪聲,噪聲的存在嚴重影響邊緣檢測的效果,中值濾波是一種基於排序統計理論的非線性平滑計數,能有效平滑噪聲,且能有效保護圖像的邊緣信息,因此被普遍用於數字圖像處理的邊緣提取,其基本原理是把數字圖像或數字序列中的一點的值用該點鄰域內全部的點排序後的中值來代替。html

  中值濾波對椒鹽噪聲有良好的濾除做用,特別是在濾除噪聲的同時,可以保護信號的邊緣,使之不被模糊。這些優良特性是線性濾波方法所不具備的。並且,中值濾波的算法比較簡單,也易於用硬件實現。這篇咱們先用MATLAB來實現中值濾波。算法

中值濾波方法是,對待處理的當前像素,選擇一個模板3x三、5x5或其餘,這裏選擇3x3矩陣,該模板爲其鄰近的若干個像素組成,對模板的像素由小到大進行排序,再用模板的中值來替代原像素的值的方法。微信

排序算法示意圖函數

當咱們使用3x3窗口後獲取領域中的9個像素,就須要對9個像素值進行排序,爲了提升排序效率,排序算法思想如圖所示。spa

(1)對窗內的每行像素按降序排序,獲得最大值、中間值和最小值。code

(2)把三行的最小值即第三列相比較,取其中的最大值。htm

(3)把三行的最大值即第一列相比較,取其中的最小值。blog

(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’)則對矩陣的每行進行降序排列

MATLAB代碼實現

Median Filter

 1 %RGB_YCbCr
 2 clc;
 3 clear all;
 4 close all;
 5 
 6 RGB_data = imread('lena.jpg');%
 7 
 8 R_data =    RGB_data(:,:,1);
 9 G_data =    RGB_data(:,:,2);
10 B_data =    RGB_data(:,:,3);
11 
12 %imshow(RGB_data);
13 
14 [ROW,COL, DIM] = size(RGB_data); 
15 
16 Y_data = zeros(ROW,COL);
17 Cb_data = zeros(ROW,COL);
18 Cr_data = zeros(ROW,COL);
19 Gray_data = RGB_data;
20 
21 for r = 1:ROW 
22     for c = 1:COL
23         Y_data(r, c) = 0.299*R_data(r, c) + 0.587*G_data(r, c) + 0.114*B_data(r, c);
24         Cb_data(r, c) = -0.172*R_data(r, c) - 0.339*G_data(r, c) + 0.511*B_data(r, c) + 128;
25         Cr_data(r, c) = 0.511*R_data(r, c) - 0.428*G_data(r, c) - 0.083*B_data(r, c) + 128;
26     end
27 end 
28 
29 Gray_data(:,:,1)=Y_data;
30 Gray_data(:,:,2)=Y_data;
31 Gray_data(:,:,3)=Y_data;
32 
33 figure;
34 imshow(Gray_data);
35 
36 %Median Filter
37 imgn = imnoise(Gray_data,'salt & pepper',0.02); 
38 
39 figure;
40 imshow(imgn);
41 
42 
43 for r = 2:ROW-1
44     for c = 2:COL-1
45         median3x3 =[imgn(r-1,c-1)    imgn(r-1,c) imgn(r-1,c+1)
46                     imgn(r,c-1)      imgn(r,c)      imgn(r,c+1)
47                     imgn(r+1,c-1)      imgn(r+1,c) imgn(r+1,c+1)];
48         sort1 = sort(median3x3, 2, 'descend');
49         sort2 = sort([sort1(1), sort1(4), sort1(7)], 'descend');
50         sort3 = sort([sort1(2), sort1(5), sort1(8)], 'descend');
51         sort4 = sort([sort1(3), sort1(6), sort1(9)], 'descend');
52         mid_num = sort([sort2(3), sort3(2), sort4(1)], 'descend');
53         Median_Img(r,c) = mid_num(2);
54     end
55 end
56 
57 figure;
58 imshow(Median_Img);

處理先後比較

Gray lena

加入椒鹽噪聲後的lena

對加入椒鹽噪聲後進行中值濾波的lena

  能夠看出,中值濾波對椒鹽噪聲的濾除效果然是很是的好。光看我處理後圖圖片可能看不出太明顯對比,有興趣的朋友能夠本身嘗試下。這裏MTALAB的排序部分基本是是按照排序算法一步步來的,徹底符合FPGA實現的思路,因此說掌握算法的基礎原理和Verilog本身就能夠嘗試用FPGA實現了。

  這裏須要強調的一下是這樣的濾波對圖像的邊緣沒有進行處理,這是由於咱們在求取均值或中值時,生成的3x3矩陣,第一行的像素並無處理,一樣的圖像最外層邊緣的像素都沒有處理,不過這個對總體影響不大,因此後面再弄,下一篇來實現Sobel邊緣檢測。

 

轉載請註明出處:NingHeChuan(寧河川)

我的微信訂閱號:開源FPGA

若是你想及時收到我的撰寫的博文推送,能夠掃描左邊二維碼(或者長按識別二維碼)關注我的微信訂閱號

知乎ID:NingHeChuan

微博ID:NingHeChuan

原文地址:http://www.javashuo.com/article/p-nziwxxzi-et.html 

相關文章
相關標籤/搜索