Dasar Pengolahan Citra dengan Dephi
Setelah beberapa bulan melakukan kajian pustaka..-kayak nggarap tesis aja- akhirnya saya bisa implementasikan teori-teori itu dalam sebuah program. Image processing..emang lebih keren pake bahasa inggris ketimbang mengartikannya ke pengolahan citra. Tapi demi bangsa tempat saya lahir, saya tetap gunakan istilah pengolahan citra…citra??diolah?? Apanya?? Dia itu kan temen SMPku..Okelah, musti harus dijelaskan dulu apa itu pengolahan citra-image processing.
Definisi dasar
Kita mulai dari definisi citra, citra yang dimaksud adalah gambar dua dimensi yang dihasilkan dari gambar analog dua dimensi yang kontinu menjadi gambar diskrit melalui proses sampling [1], jadi bukan Citra teman SMP-ku itu lho ya….Gambar analog dihasilkan dari sistem optik yang menerima sinyal analog, biasanya didapat dari kamera analog atau mata manusia, sedangkan citra diskrit atau citra digital dihasilkan dari proses digitalisasi citra kontinu, misalnya citra yang dihasilkan oleh scanner atau kamera digital.
Dari pernyataan diatas ada dua hal yang mungkin jadi pertanyaan, yaitu 1) apa proses sampling dan 2)proses digitalisasi. Keduanya sebenarnya hampir mirip, kalau kita ingin melakukan pengolahan citra, tentunya kita akan merepresentasikan dulu citra kontinu yang kita punya menjadi citra digital agar lebih mudah pengolahannya. Proses ini disebut proses digitalisasi, yaitu citra kontinu dibagi menjadi dalam bentuk matrik yang terdiri dari N baris dan M kolom sehingga menjadi citra diskrit. Sedangkan proses sampling adalah proses untuk menentukan warna pada piksel tertentu pada citra.
Jenis Citra Digital
Beberapa jenis digital yang sering digunakan adalah citra biner, citra greyscale, dan citra warna.
-
Citra Biner
Biasa disebut dengan citra monokrom. Citra ini terdiri dari 2 warna saja yaitu hitam dan putih.
-
Citra Greyscle
Citra greyscale (derajat keabuan) memiliki beberapa warna diantara hitam dan putih. Banyaknya warna tergantung dari berapa bit citra tersebut.
-
Citra warna (true color)
Pada citra warna tiap pikselnaya terdiri dari warna yang merupakan kombinasi dari 3 warna dasar yaitu merah (red), hijau (green) dan biru (blue). Mengapa disebut citra true color? Setiap warna dasar dari citra warna menggunakan memori 8 bit = 1byte yang berarti akan memiliki 28 = 256 tingkatan (gradasi) warna. Jadi akan ada 28.28.28 = 224 = 16777216 warna dalam tiap piksel dari citra tersebut. Maka dari itu karena citra memiliki begitu banyak warna yang mewakili seluruh warna yang ada, format ini dinamakan citra true color.
Ya sudah mungkin itu dulu omang-omong pengertian dasar sekitar citra, mari kita lanjutkan ke pengolahan citra itu sendiri.
Pengolahan citra
Pengolahan citra merupakan proses manipulasi data suatu citra untuk menghasilkan citra baru.
Citra warna bisa direpresentasikan dalam format piksel yang terdiri dari 3 komposisi warna, yaitu merah (red/R), hijau(green/G), dan biru (blue/B). Jika menggunakan representasi citra 8bit dalam integer nilai R, G dan B mempunyai rentang 0-255. Semakin besar nilainya artinya warna tersebut mendominasi pada kombinasi warna pada citra tersebut.
Pemrograman Dasar Pengolahan Citra dengan Delphi
Baik sekarang saya coba jelaskan beberapa pemrograman dasar delphi yang akan digunakan dalam pengolahan citra nanti. Ada beberapa fungsi yang digunakan seperti penampilan citra, operasi matematika, pengambilan warna piksel, dll.
1. Menampilkan citra/gambar
Citra/gambar yang nantinya kita olah berformat bitmap ( .bmp), untuk bisa menampilkannya biasanya saya menggunakan komponen Image pada tab Additional, kemudian saya juga gunakan OpenPictureDialog biar ngga susah-susah nulis filternya he..he.., dan juga MainMenu untuk membuka dialognya, property-nya saya atur seperti berikut.
Komponen | Property | Value |
Image1 | Scretch | True |
OpenPictureDialog1 | – | – |
MainMenu1 | Items – sub items | Image – Open |
Kode programnya akan tampak seperti berikut:
procedure TForm1.Open1Click(Sender: TObject); var gambar : TBitmap; begin if not OpenPictureDialog1.Execute then Exit else begin gambar := TBitmap.Create; gambar.LoadFromFile(OpenPictureDialog1.FileName); end; Image1.Picture.Bitmap:= gambar; end;
2. Operasi dasar matematika
Yah..matematika lagi, dimana-mana memang hidup saya ngga lepas dari matematika. Tapi emang dalam pengolahan citra operasi matematika, kalkulus, tidak akan bisa lepas. Semuanya menggunakan operasi matematika, dari yang paling sederhana sampai yang rumit. Operasi yang paling dasar adalah penjumlahan, pengurangan, perkalian dan pembagian. Ohya..satu lagi dalam pengolahan citra, anda harus mahir dalam operasi matrik juga. Coba lihat contoh kode berikut.
Untuk operasi bilangan lain anda pelajari sendiri ya, agar pembahasan kita tetap fokus.
procedure operasi_dasar; var a, b, c : integer; d : real; begin c := a + b; {penjumlahan} c := a - b; {pengurangan} c := a * b; {perkalian} d := a/b; {pembagian} c := a div b ; {pembagian bulat} end;
3. Membaca citra
Proses untuk membaca citra sama prosesnya dengan membaca matrik , karena sebenarnya citra digital adalah suatu matrik. Setiap piksel pada citra mempunyai 3 nilai R,G,dan B. Untuk itu kita biasa gunakan proses looping menggunakan for..to..do, ataupun repeat…until, dsb.
for brs := 0 to Image2.Picture.Bitmap.Height-1 do begin ... for kol := 0 to Image2.Picture.Bitmap.Width-1 do begin ... end; end;
4. Pengambilan warna Piksel
Untuk pengambilan warna piksel pada citra, pertama kita bisa gunakan fungsi ColorToRGB(Color: TColor): Longint. Fungsi ini akan mengambil nilai komposisi warna dasar (RGB) dari sebuah warna. Setelah itu kita akan ambil nilai tiap komposisi warna tersebut menggunakan fungsi GetRValue(Color:TColor), GetGValue(Color:TColor), GetBValue(Color:TColor). Lebih jelasnya coba perhatikan potongan kode berikut.
[sourcecode language=”delphi”]
color := ColorToRGB(Image2.Picture.Bitmap.Canvas.Pixels[brs,kol]);//—mengambil warna piksel tertentu dalam citra</em>
r := GetRValue(color); //—mengambil nilai R
g := GetGValue(color); //—mengambil nilai G
b := GetBValue(color); //—mengambil nilai B
[/sourcecode]
Kode diatas bisa kita gunakan untuk mengambil warna per piksel tertentu dari suatu citra, namun pada prakteknya jika kita gunakan untuk memanipulasi piksel dari seluruh bagian citra bisa bikin program kita lambat, apalagi jika citra yang kita olah cukup besar ukurannya. Alternatif yang lebih cepat bisa kita gunakan fungsi ScanLine(). Fungsi ini mengambil nilai warna sekaligus per baris secara horizontal, dan menyimpan hasilnya dalam nilai heksadesimal $00000000 sampai $00FFFFFF. Formatnya seperti berikut:
$00BBGGRR
Dengan BB = nilai Blue, GG = nilai Green, dan RR = nilai Red dengan rentang 0-255, atau dalam heksadesimal 00-FF.
Untuk menggunakan fungsi ini kita harus set format pikselnya terlebih dahulu menggunakan fungsi FormatPixels. Lihat gambar berikut biar lebih jelas.
Image1.Picture.Bitmap.PixelFormat := pf24bit; //---set format piksel ke 24 bit for brs := 0 to Image1.Picture.Bitmap.Height-1 do begin temp := Image1.Picture.Bitmap.ScanLine[brs]; //---scan per baris Application.ProcessMessages; kol := 0; repeat clr :=((temp[kol])+(temp[kol+1])+(temp[kol+2]))div 3; //---greyscale for r:=0 to 2 do //----digit per piksel temp[kol+r] := clr; inc(kol,3); until kol >= 3*Image1.Picture.Bitmap.Width-1; //---format piksel 24bit(3x8bit) R=8bit,G=8bit,B=8 bit end; // for Image1.Invalidate;
References
[1] Wikipedia
[2] imageprocessingindelphi.blogspot.com
[3] Sutoyo,T., Edy Mulyanto, Vincent Suhartono, Oky Dwi Nurhayati, Wijanarto, Teori Pengolahan Citra Digital, UDINUS, Penerbit Andi, 2009
Makasih ilmunya bro. Saya mau tanya kalau coding buat ubah gambar RGB jadi matriks gimana ya? Saya mau menampilkan matriks dari sebuah gambar RGB. Mohon bantuannya.
Thanks dan salam kenal. 🙂