1、 基本原理
圖像信息在采集過程中往往受到各種噪聲源的干擾,這些噪聲在圖像上的常常表現為一些孤立像素點,這可理解為像素的灰度是空間相關的,即噪聲點像素灰度與它們臨近像素的灰度有著顯著不同。通常,一般的前置圖像處理後的圖刺昂仍然帶有後續所不希望夾帶的孤立像素點,這種干擾或孤立像素點如不經過濾波處理,會對以後的圖像區域分割、分析和判斷帶來影響。
對受到噪聲污染的圖像可以采用線性濾波的方法來處理,但是很多線性濾波有低通性,在去噪聲的同時也使得邊緣模糊了,中值濾波在某些情況下可以做到既去除噪聲又保護圖像的邊緣,他是一種非線性的去噪聲的方法。
中值濾波的實現原理是把數字圖像中的一點的值用該點的一個區域的各個點的值的中值代替,中值的定義如下:
一組數X1、X2、X3…Xn 假如其排序如下:
X i 1≦X i 2≦X i 3≦…≦X i n
Y=Med{X1、X2、X3…Xn }=Xi((1+n)/2) n為奇數
Xi(n/2) +Xi((1+n)/2) n為偶數
Y稱為X1、X2、X3…Xn 的中值,如有一個序列(10,20,30,40,50,60,70),則中值為40。
把一個點的特定長度或形狀的領域稱為窗口,在一維的時候,中值濾波器是一個奇數各像素點的滑動窗口,窗口正中間的值用窗口內各個像素的中值代替。設輸入為{Xi,i∈I2},則濾波器的輸出為:
Yi=med{Xi}=med{Xi-u…Xu…Xi+u}
如果推廣到二維,則可以定義輸出為:
Yi=med{Xij}=med{X(i+s),(j+s)(r,s)∈A,(i,j)∈I2 }
對於二維濾波的中值濾波,一般采用3×3或者5×5的窗口來進行濾波。
2、 實現
procedure TForm1.Button2Click(Sender: TObject);
var
p1,p2,p3,p4:pbytearray;
Rvaluearray:array[0..10] of integer;
i,j:integer;
begin
self.DoubleBuffered:=true;//采用雙緩沖模式
ChangedBmp:=tbitmap.Create;
testbmp:=tbitmap.Create;
changedbmp.Assign(image1.Picture);
testbmp.Assign(image1.Picture);
for j:=1 to changedbmp.Height-2 do
begin
p1:=testbmp.ScanLine[j]; p2:=testbmp.ScanLine[j-1];
p3:=changedbmp.ScanLine[j]; p4:=changedbmp.ScanLine[j-1];
for i:=1 to changedbmp.Width-2 do
begin
Rvaluearray[0]:=p2[3*(i-1)+2];
Rvaluearray[1]:=p2[3*i+2];
Rvaluearray[2]:=p2[3*(i+1)+2];
Rvaluearray[3]:=p3[3*(i-1)+2];
Rvaluearray[4]:=p3[3*i+2];
Rvaluearray[5]:=p3[3*(i+1)+2];
Rvaluearray[6]:=p4[3*(i-1)+2];
Rvaluearray[7]:=p4[3*i+2];
Rvaluearray[8]:=p4[3*(i+1)+2];
sort(Rvaluearray);
p1[3*i+2]:=Rvaluearray[4];
Rvaluearray[0]:=p2[3*(i-1)+1];
Rvaluearray[1]:=p2[3*i+1];
Rvaluearray[2]:=p2[3*(i+1)+1];
Rvaluearray[3]:=p3[3*(i-1)+1];
Rvaluearray[4]:=p3[3*i+1];
Rvaluearray[5]:=p3[3*(i+1)+1];
Rvaluearray[6]:=p4[3*(i-1)+1];
Rvaluearray[7]:=p4[3*i+1];
Rvaluearray[8]:=p4[3*(i+1)+1];
sort(Rvaluearray);
p1[3*i+1]:=Rvaluearray[4];
Rvaluearray[0]:=p2[3*(i-1)];
Rvaluearray[1]:=p2[3*i];
Rvaluearray[2]:=p2[3*(i+1)];
Rvaluearray[3]:=p3[3*(i-1)];
Rvaluearray[4]:=p3[3*i];
Rvaluearray[5]:=p3[3*(i+1)];
Rvaluearray[6]:=p4[3*(i-1)];
Rvaluearray[7]:=p4[3*i];
Rvaluearray[8]:=p4[3*(i+1)];
sort(Rvaluearray);
p1[3*i]:=Rvaluearray[4];
end;
end;
ChangedBmp.Assign(TestBMP);
PaintBox2.Canvas.CopyMode:=srccopy; PaintBox2.Canvas.Draw(0,0,ChangedBmp);
end;
3、 效果
可能二值化處理後的圖像的感覺不是很明顯,但是彩色圖像進行濾波後明顯感覺圖像清晰很多,主要原因是通過濾波後一些噪點消除了。
沒有留言:
張貼留言