Jurnal Tentang Median Filtering |
PENDAHULUAN
Saat
ini kebutuhan akan ilmu pengetahuan semakin meningkat, demikian pula dengan
alat-alat yang diperlukan untuk menganalisa segala hal. Contohnya adalah
kebutuhan di dalam bidang kedokteran, penginderaan jarak jauh, meteorology dan
fisika, robotika,dan lain-lain. Bidang-bidang tersebut membutuhkan alat/kamera
yang biasa digunakan untuk merekam keadaan yang diperlukan untuk kebutuhan
analisis sehingga memungkinkan peneliti mendapatkan informasi yang diperlukan. Output
alat-alat ini biasanya berupa citra. Citra inilah yang nantinya akan
dianalisis untuk mendapatkan informasi yang berguna.Namun sayangnya, kebanyakan
citra belum sesuai dengan hasil yang diharapkan. Hal ini dapat terjadi karena
beberapa kemungkinan, misalnya adanya noise, adanya kabut yang menghalangi
objek yang sedang di-capture. Lensa kamera kotor dan lain-lain. Oleh
sebab itu, proses pengolahan citra sangat diperlukan. Disiplin ilmu yang
melahirkan teknik-teknik untuk mengolah citra dinamakan Pengolahan Citra
Digital ( Digital Image Processing). Nah oleh karena itu pada pembahasan ini
kami akan menyajikan pemaparan tentang pengaplikasian pengolahan citra digital
didalam dunia fotografy yaitu tentang bagaimana memperbaiki citra dan bagaimana
mengurangi kebisingan/noise.
FILTERING
Ada bebarapa cara untuk
mengurangi noise pada suatu citra yaitu diantaranya dengan mean filtering, median
filtering, modus filtering dan Gaussian filtering. Pada pembahasan ini kami
akan membahas tentang median filtering. Filtering merupakan suatu proses
yang mengambil sebagian sinyal frekuensi tertentu dan membuang sinyal pada
frekuensi lain (Sigit, dkk ,2005). Filtering pada citra menggunakan
prinsip sama, yaitu mengambil fungsi citra pada frekuensi-frekuensi tertentu
dan membuang fungsi citra pada frekuensi-frekuensi lain.
MEDIAN FILTERING
Cara kerja filter median dalam jendela tertentu mirip
dengan filter linier namun prosesnya bukan lagi dengan pembobotan.
Rinaldi Munir (2004:126) menjelaskan filter median
sebagai suatu jendela yang memuat sejumlah pixel ganjil. Jendela digeser
titik demi titik pada seluruh daerah citra. Pada setiap pergeseran dibuat jendela
baru. Titik tengah dari jendela ini diubah dengan nilai median dari jendela
tersebut.
Berikut disajikan ilustrasi penggunaan filter median
berukuran 3x3 pixel terhadap bitmap 2 dimensi.
Cara mencari nilai median di atas adalah :
1.
Baca nilai pixel
yang akan diproses beserta pixel-pixel tetangganya
2.
Urutkan
nilai-nilai pixel dari yang paling kecil hingga yang paling besar.
3.
Pilih nilai pada
bagian tengah untuk nilai yang baru bagi pixel (x,y).
PENJELASAN
MEDIAN FILTERING
Sebelum
melakukan implementasi pada program/ bahasa pemograman, kita perlu tau
bagaimana perhitungan manual untuk median filtering supaya lebih memahami
konsep kerja dari median filtering. Berikut adalah contoh perhitungan
manualnya….
Misal
kita memiliki matriks citra keabuan sebagai berikut
Misal
untuk mask 3×3 yang pertama, yaitu matriks yang meliputi koordinat (0,0);
(0,1); (0,2); (1,0); (1,1); (1,2); (2,0); (2,1); (2,2), yang nilai-nilainya
adalah:


Nilai-nilai
piksel tersebut diurutkan dari nilai yang terkecil ke nilai yang terbesar
sebagai berikut:
Asli:29,40,44,40,42,62,186,184,191
Urutkan
: 29,40,40,42,44,62,184,186,191
Dari
deret nilai yang telah terurut tersebut kemudian ditentukan nilai tengahnya,
yaitu pada indeks ke-4 (indeks dimulai dari 0) yang bernilai 44. Nilai tengah
ini selanjutnya diletakkan pada koordinat piksel (1,1). Hal ini dilakukan
hingga penggantian nilai piksel di koordinat (6,6). Matriks citra hasil dari
proses median filtering dapat dilihat pada gambar berikut:
IMPLEMENTASI MEDIAN FILTERING
Dengan Tekan Tombol Ambil Data untuk mengambil gambar yang ingin diuji pada
program dari directory.
Contoh kita ambil gambar 24 bit yang terkena noise seperti berikut…

Setelah itu kita merubah dulu gambar ke dalam grayscale, yaitu dengan
menekan tombol Keabuan
sehingga hasilnya seperti berikut:

Baru saatnya kita mencoba mengfilterring gambar dengan median filtering
menggunakan maks 3 x 3, sehingga
hasilnya sebagai berikut:

Coba dengan gambar yang sama kita mengfiltering dengan menggunakan maks
5 x 5 hasilnya:

Dengan gambar yang masih tetap sama kita coba dengan maks 7 x 7 dan 11
x 11:


Dari program yang ada, program baru dibuat untuk mengfiltering gambar
yang sudah di grayscale(8bit) belum untuk gambar yang (24bit). Kita melihat bahwa dengan median filtering
gambar yang mengalami noise bisa dihilangkan noisenya, gambar hasil filtering
bisa menjadi lebih baik untuk dilihat(menjadi lebih jelas). Untuk matriks kernel 3x3 gambar
menjadi baik dilihat,tetapi kalau matriks
kernel semakin besar yaitu dari 5x5, 7x7, 11x11 maka gambar semakin
kabur/ semakin tidak jelas. Ini dikarenakan semakin tinggi matriks kernel maka
piksel-piksel asli akan dihilangkan.
PENJELASAN CODE PROGRAM
unit
UnitUtama;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, ExtDlgs, Menus, StdCtrls,
ComCtrls, Clipbrd, ExtCtrls;
type
TFormUtama = class(TForm)
PanelAtas: TPanel;
ButtonAmbilCitra: TButton;
StatusBar: TStatusBar;
OpenPictureDialog: TOpenPictureDialog;
ButtonMedian: TButton;
RadioButton25: TRadioButton;
RadioButton9: TRadioButton;
RadioButton49: TRadioButton;
RadioButton121: TRadioButton;
ButtonKeabuan: TButton;
procedure ButtonAmbilCitraClick(Sender: TObject);
procedure Olah;
procedure gray;
procedure ButtonMedianClick(Sender: TObject);
procedure ButtonKeabuanClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{
Private declarations }
public
{
Public declarations }
end;
var
FormUtama: TFormUtama;
implementation
uses UnitCitra;
type
LogPal
= record
lpal:
TLogPalette;
entry: array [0..255] of TPaletteEntry;
end;
var
FormHasil: TFormCitra;
FormHasilm: TFormCitra;
PaletKeabuan: LogPal;
{$R *.dfm}
Prosedur berikut ini digunakan untuk mengambil gambar dari memori.
procedure
TFormUtama.ButtonAmbilCitraClick(Sender: TObject);
var
fc:
string;
begin
if
(OpenPictureDialog.Execute) then
begin
if
(FormCitra = nil) then
Application.CreateForm(TFormCitra, FormCitra);
FormCitra.Image.Picture.LoadFromFile(
OpenPictureDialog.FileName);
FormCitra.ClientHeight :=
FormCitra.Image.Picture.Height;
FormCitra.ClientWidth :=
FormCitra.Image.Picture.Width;
FormCitra.ClientHeight :=
FormCitra.Image.Picture.Height;
case (FormCitra.Image.Picture.Bitmap.PixelFormat) of
pf1bit : fc := 'biner';
pf8bit : fc := 'keabuan';
pf24bit : fc := 'true color';
end;
StatusBar.SimpleText := OpenPictureDialog.FileName
+
' (' + IntToStr(FormCitra.Image.Picture.Width)
+
'x' + IntToStr(FormCitra.Image.Picture.Height)
+
', ' + fc + ')';
end;
end;
Prosedur yang berikut digunakan untuk mengubah gambar yang sudah
diambil dari direktori/memori yang dalam bentuk warna 24 bit ke dalam grayscale
(8 bit), karena program yang ada baru sanggup mengfiltering gambar yang sudah
di grayscale. Grayscale dengan skala warna dari 0-255 , dengan 0 adalah warna
hitam dan yang paling tertinggi yaitu 255 adalah warna putih, warna diantara
0-255 adalah abu-abu sesuai dengan tingkat kecerahannya.
procedure TFormUtama.gray;
var
i, j:
integer;
PC, PH:
PByteArray;
begin
FormCitra.SetFocus;
if
(FormHasil = nil) then
Application.CreateForm(TFormCitra, FormHasil);
FormHasil.Caption := 'Citra Hasil';
FormHasil.Image.Picture := FormCitra.Image.Picture;
FormHasil.ClientHeight :=
FormHasil.Image.Picture.Height;
FormHasil.ClientWidth :=
FormHasil.Image.Picture.Width;
FormHasil.ClientHeight :=
FormHasil.Image.Picture.Height;
FormHasil.Top := FormCitra.Top+FormCitra.Height;
FormHasil.Left := FormCitra.Left;
FormHasil.Image.Picture.Bitmap.PixelFormat := pf8bit;
FormHasil.Image.Picture.Bitmap.Palette :=
CreatePalette(PaletKeabuan.lpal);
for i:=
0 to FormCitra.Image.Picture.Height-1 do
begin
PC
:= FormCitra.Image.Picture.BitMap.ScanLine[i];
PH
:= FormHasil.Image.Picture.BitMap.ScanLine[i];
for
j:= 0 to FormCitra.Image.Picture.Width-1 do
PH[j] := Round((PC[(3*j)]+PC[(3*j+1)]+PC[(3*j+2)])/3);
end;
end;
untuk mengubah warna dari 24bit ke 8 bit digunakan rumus grayscale.
Rumus grayscale yang digunakan adalah PH[j] :=
Round((PC[(3*j)]+PC[(3*j+1)]+PC[(3*j+2)])/3);
Selain rumus diatas ada rumus grayscale yang lebih banyak digunakan
yaitu
Grayscale= 0,11 * R + 0,59 * G + 0,3 * B yang akan member keakuratan
warna yang lebih baik. Tetapi saya masih menggunakan rumus yang pertama.
Prosedur berikut adalah untuk proses median filteringnya,,,
procedure TFormUtama.Olah;
var
x, y,
w, h, u, v, i, j, M, temp: integer;
PC, PH:
PByteArray;
Ki, Ko:
array of array of byte;
Urutan:
array [1..121] of byte;
begin
w :=
Formhasil.Image.Picture.Width;
h :=
Formhasil.Image.Picture.Height;
if
(Formhasil.Image.Picture.Bitmap.PixelFormat = pf8bit)
then
begin
SetLength(Ki, w, h);
SetLength(Ko, w, h);
for
y := 0 to h-1 do
begin
PC := Formhasil.Image.Picture.Bitmap.ScanLine[y];
PH := FormHasilm.Image.Picture.Bitmap.ScanLine[y];
for x := 0 to w-1 do
begin
Ki[x, y] := PC[x];
Ko[x, y] := PH[x];
end;
end;
Di bawah ini adalah fungsi untuk menentukan jarak tetangga dari piksel
yang ada.
if
(RadioButton9.Checked) then
M
:= 1;
if
(RadioButton25.Checked) then
M
:= 2;
if
(RadioButton49.Checked) then
M
:= 3;
if
(RadioButton121.Checked) then
M
:= 5;
Dibawah ini adalah proses untuk mengfiltering dengan median, M adalah
jarak tetangga, w adalah lebar citra, h
adalah tinggi citra,,,,
for
x := M to w-1-M do
for y := M to h-1-M do
begin
for u := -M to M do
for v := -M to M do
urutan[] adalah untuk menampung piksel-piksel yang nantinya akan
diurutkan, setelah diurutkan baru diambil nilai tengahnya
Urutan[(2*M+1)*u+v+((2*M+1)*(2*M+1)+1) div 2]
:= Ki[x-u,y-v];
Ini adalah proses pengulangan untuk mengurutkan data piksel-piksel yang
sudah diambil tadi..
for i := 2 to (2*M+1)*(2*M+1) do
for j := (2*M+1)*(2*M+1) downto i do
if (Urutan[j] < Urutan[j-1])
then
begin
temp := Urutan[j];
Urutan[j] := Urutan[j-1];
Urutan[j-1] := temp;
end;
dibawah ini adalah proses untuk mengambil nilai tangah dari data yang
sudah diurutkan..
Ko[x,y] := Urutan[((2*M+1)*(2*M+1)+1) div 2];
end;
di bawah ini adalah proses pergantian piksel – piksel pada citra asli
dengan piksel – piksel yang sudah melewati proses median filtering,,,,
for
y := 0 to h-1 do
begin
PH := FormHasilm.Image.Picture.Bitmap.ScanLine[y];
for x := 0 to w-1 do
PH[x] := Ko[x, y];
end;
Ki
:= nil;
Ko
:= nil;
end;
end;
procedure TFormUtama.ButtonKeabuanClick(Sender:
TObject);
begin
if
(FormCitra = nil) then
begin
ShowMessage('Belum ada citra yang diambil');
exit;
end;
if
(FormCitra.Image.Picture.Bitmap.PixelFormat <> pf24bit)
then
begin
ShowMessage('Hanya untuk citra true color');
exit;
end;
gray;
FormHasil.Repaint;
end;
procedure TFormUtama.ButtonMedianClick(Sender:
TObject);
begin
if
(Formcitra = nil) then
begin
ShowMessage('Ambil dulu citra yang akan diolah');
exit;
end;
if
(formhasil=nil) then
if
(Formcitra.Image.Picture.Bitmap.PixelFormat <> pf8bit) then
begin
showmessage('Ubah dulu ke gray');
exit;
end;
if
(FormHasilm = nil) then
Application.CreateForm(TFormcitra, FormHasilm);
FormHasilM.Caption := 'Citra Hasil Median Filtering';
if (Formcitra.Image.Picture.Bitmap.PixelFormat =
pf8bit) then
FormHasilm.Image.Picture := Formcitra.Image.Picture;
if
(FormHasil <> nil) then
FormHasilm.Image.Picture := Formhasil.Image.Picture;
FormHasilm.Top := Formcitra.Top;
FormHasilm.Left := Formcitra.Left+Formcitra.Width;
FormHasilm.ClientHeight :=
FormHasilm.Image.Picture.Height;
FormHasilm.ClientWidth :=
FormHasilm.Image.Picture.Width;
FormHasilm.ClientHeight :=
FormHasilm.Image.Picture.Height;
Olah;
end;
procedure TFormUtama.FormCreate(Sender:
TObject);
var
i:
integer;
begin
PaletKeabuan.lPal.palVersion := $300;
PaletKeabuan.lPal.palNumEntries := 256;
for i
:= 0 to 255 do
begin
PaletKeabuan.entry[i].peRed
:= i;
PaletKeabuan.entry[i].peGreen := i;
PaletKeabuan.entry[i].peBlue := i;
end;
end;
end.
KESIMPULAN
1.
Suatu citra gray yang mengalami noise ternyata
dengan menggunakan proses median filtering sanggup mengurangi noise yang ada
pada citra, tampilan citra semakin lebih baik dilihat.
2.
Pada saat proses median dengan matriks kernel 3 x 3
tampilan citra semakin baik tetapi ketika kita semakin menaikan matriks kernel yaitu
dengan 11 x 11 maka hasil citra semakin kabur. Ini disebabkan semakin besar matriks kernel yang
digunakan maka proses median filtering akan menghilangkan piksel – piksel
aslinya/piksel pokoknya.


Tidak ada komentar:
Posting Komentar