Senin, 25 Februari 2013








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
matriks gray
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:
mask3x3
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:
hasil median

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