Penghalusan Citra dengan Penapisan Median

Penghalusan citra (image smoothing) merupakan langkah untuk menghilangkan derau (noise). Salah satu teknik untuk melakukan ini adalah dengan melakukan penapisan median (median filtering). Proses penghalusan dilakukan untuk setiap pixel dari citra dengan memperhitungkan statistik pixel yang berada dalam daerah ketetanggaan (neighborhood window). Setiap pixel yang diproses akan digantikan dengan nilai median dari himpunan nilai pixel yang ada di dalam jendela ketetanggaan ini.

Prinsip Dasar

Dalam berbagai literatur tentang pengolahan citra, teknik ini cukup ampuh digunakan untuk menghilangkan derau salt & pepper yang bersifat acak. Derau jenis ini dimodelkan dengan menggantikan pixel pada posisi acak dengan distribusi tertentu dengan nilai intensitas ektrem (maksimum/putih dan minimum/hitam). Ide dasar untuk teknik penapisan adalah bahwa anggapan bahwa derau merupakan nilai yang muncul paling jarang dalam suatu populasi. Anggapan ini menyebabkan teknik penapisan dalam kondisi terbaiknya adalah pada citra asli yang memiliki variasi intensitas/warna yang cenderung homogen. Dengan anggapan yang sama dapat juga dibuat variasi dari penapisan median yaitu dengan menggunakan statistik lainnya yaitu modus (nilai yang paling sering muncul). Sebenarnya dengan prinsip tersebut lebih cocok dengan menggunakan nilai modus namun kompleksitas algoritma untuk menghitung nilai modus lebih besar dibandingkan dengan menghitung nilai median, lagipula untuk populasi yang merata (tidak ada modus) akan menjadikan pertimbangan menjadi lebih sulit.

Implementasi

Untuk melakukan implementasi penapisan median diperlukan struktur data list terurut untuk mempermudah mencari nilai tengah dari populasi. Potongan kode berikut menunjukkan variabel yang digunakan

var
	b_src, b_dst : TBitmap;
	j, i, k, l : integer;
	window_width, window_mid : integer;
	buffer : array of TWarnaRGB;
	p : array of PArrRGB; { definisi ada di tulisan mengakses-pixel }
	p_dest : PArrRGB;

Potongan kode berikut menunjukkan fungsi pendukung.

{ fungsi pembantu }
function is_pos_valid(x, y: integer):boolean;     
begin
	result := (x >= 0) and (x < b_src.Width) and (y >= 0) and (y < b_src.Height);
end;
function is_pixel_lessthan(w1, w2:TWarnaRGB):boolean;
begin
	{ gunakan salah satu komponen }
	result := (w1.r < w2.r);
end;
procedure insert_urut(value: TWarnaRGB);
var
	ins_pos : integer;
	c, d : integer;
begin
	if length(buffer) = 0 then begin
	{ kasus kosong }
		SetLength(buffer, 1);
		buffer[High(buffer)] := value;
	end else begin
		{ cari posisi penyisipan }
		c := 0;
		while (c < length(buffer)) and (is_pixel_lessthan(buffer[c], value)) do
			inc(c);
			SetLength(buffer, Length(buffer)+1);
		{ geser }
		d := high(buffer);
		while (d > c) do begin
			buffer[d] := buffer[d-1];
			dec(d);
		end;
		{ sisip }
		buffer[c] := value;
	end;
end;

Potongan kode berikut menunjukkan implementasi dari algoritma utama.

begin
	{ untuk mempermudah akses }
	SetLength(p, b_src.Height);
	for j := 0 to b_src.Height-1 do 
		p[j] := b_src.Scanline[j];
                
	{ inisialisasi variabel pendukung }
	window_width := 3;
	window_mid := window_width div 2;
        
	{ iterasi setiap pixel }
	for j := 0 to b_src.Height-1 do begin
		p_dest := b_dst.Scanline[j];
		for i := 0 to b_src.Width-1 do begin
                
		{ lihat pixel tetangga }
		SetLength(buffer, 0);
		for l := -window_mid to window_mid do begin
			for k := -window_mid to window_mid do begin                        

			if is_pos_valid(i + k, j + l) then begin
				insert_urut(p[j + l][i + k]);
			end;
                        
			end;
		end;
                
		{ cari nilai median }
		p_dest[i] := buffer[(length(buffer) div 2) - 1];
                
		end;
	end;
end;

Pengujian

Gambar Asli

Gbr 1. Citra asli

Gambar berderau

Gbr 2. Citra berderau (salt & pepper)

Penghalusan dengan penapisan median 3×3

Gbr 3. Penghalusan citra dengan penapisan median

Penapisan rata-rata tetangga 3×3

Gbr 4. Penghalusan citra dengan penapisan rerata (mean)

Pembahasan

Pada gambar 3 terlihat pada bagian sudut kotak mengalami degradasi jika dibanding dengan citra asal. Hal ini disebabkan populasi pixel hitam jauh lebih banyak dibandingkan dengan citra putih (pada sudut kotak). Oleh sebab itu penapisan median tidak bersifat mempertahankan ciri struktur khususnya sudut.

2 comments

  1. Susanto Diningrat · April 8, 2008

    mohon contoh lengkap proses dan hasilnya dari citra satelit,
    dan algoritma program pengolahan sehingga dapat ada gambaran perubahan nilai piksel, dangan % tingkat kesalahan yang terjadi, dan program tersebut bagaimana Runningnya, bolehkah saya copy programnya dan cara pengolahannya.

    Teerima kasih.

  2. fragilputra · Juni 25, 2015

    bisa minta program yg sudah jadinya gan?

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s