Selamat datang di sonoku.com

Mengatur Brigthness Citra menggunakan Delphi

Sebuah citra grayscale 256 warna akan tampak gelap bila seluruh komponen warnanya berada mendekati nilai 0, dan juga sebaliknya jika seluruh komponen warnya mendekati nilai 255 maka citra akan tampak lebih terang. Untuk dapat mengatur kecerahan suatu citra kita dapat menambahkan nilai intensitas piksel dengan suatu nilai konstanta. Persamaannya seperti berikut.

Dimana fi adalah nilai intensitas (warna) piksel pada citra asli, dan b adalah nilai konstanta kecerahan (brightness). Jika nilai b negatif maka intensitas piksel akan lebih gelap, sebaliknya jika nilai b positif maka intensitas citra akan semakin cerah.

Berikut ilustrasi operasi brightness pada sebuah citra.

Untuk citra true color, masing-masing komponen warna Red, Green dan Blue perlu ditambahkan dengan suatu konstanta.

Mengatur kecerahan citra dengan Delphi

 

Rancang tampilan form seperti pada gambar, atur properti komponennya seperti pada tabel.

Program yang kita buat dapat merubah level kecerahan pada citra 24 bit di setiap kanalnya (R, G, B), untuk itu kita memerlukan 3 Trackbar masing-masing untuk kanal (channel) R, G dan B. Nilai posisi trackbar kita atur nilainya mulai -255 hingga 255, tujuannya agar kita bisa mendapatkan penambahan dengan nilai negatif (pengurangan).

Pada saat pertama kali membuka file gambar kita perlu membuat dulu citra/image sementara untuk diolah kecerahannya. Selain itu khusus untuk citra 8 bit (grayscale) kita tidak bisa mengatur kecerahan warna perkanal (RGB) seperti pada citra true color (24bit),untuk itu kita perlu mengatur perubahan kecerahan citra satu kanal saja. Ini dapat diatur dengan menambahkan checkbox (Equal Track) agar TrackBar dapat aktif bersamaan (seolah hanya 1 nilai kanal yang aktif). Potongan programnya akan tampak seperti berikut.

Operasi kontrol kecerahan dilakukan dengan menambahkan tiap nilai intensitas citra dengan nilai posisi Trackbar tiap kanalnya. Kemudian dicek apakah hasil penambahan melebihi nilai maksimum intensitasnya(255), jika ya maka nilai intensitas yang baru dibuat sama dengan 255. Sebaliknya jika melebihi nilai intensitas nol (negatif) maka intensitas citra yang baru dibuat sama dengan 0. Berikut potongan programnya.

;

Berikut hasil kontrol kecerahan citra dengan berbagai nilai konstanta b yang berbeda-beda.

Download (source code)

1. Image Processing – Brightness.rar (190kb)

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

Operasi Inversi (Negasi Citra) dengan Delphi

Operasi ini akan menghasilkan citra negatif seperti film (negatif) foto. Pada citra greyscale, operasi inversi mengubah piksel warna putih menjadi hitam, dan sebaliknya. Sedangkan jika kita lihat dari histogramnya maka histogram citra negatif adalah pencerminan dari histogram citra asal/asli.

Operasi inversi dilakukan dengan mengurangkan nilai intensitas piksel dari nilai intensitas piksel maksimumnya.

Jadi jika ada citra 8 bit dengan 256 level intensitas maka persamaan untuk mendapatkan citra negatif adalah

Operasi Inversi dengan Delphi

Oke kita langsung saja dengan implementasinya dengan Delphi. Seperti biasa tambahkan komponen berikut dan atur propertinya.

Program yang akan kita buat akan memproses citra dengan format 8 bit dan 24 bit. Berikut potongan programnya.

[sourcecode language=”delphi”]
procedure TForm1.Invert1Click(Sender: TObject);
var piksel : PByteArray;
brs, kol: Integer;
rgb1 : array [0..2] of Integer;
begin
for brs := 0 to Image2.Picture.Height – 1 do
begin
piksel := Image2.Picture.Bitmap.ScanLine [brs];
for kol := 0 to Image2.Picture.Width-1 do
begin
if Image2.Picture.Bitmap.PixelFormat = pf8bit then // citra 8 bit
piksel[kol] := 256 – piksel[kol];
if Image2.Picture.Bitmap.PixelFormat = pf24bit then //citra 24 bit
begin
piksel[3*kol] := 256 – piksel[3*kol];
piksel[3*kol+1] := 256 – piksel[3*kol+1];
piksel[3*kol+2] := 256 – piksel[3*kol+2];
end;
end;
Image2.Invalidate;
end;
end;
[/sourcecode]

Download (source code)

1. Image Processing – Invert.rar (178kb)

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

Thresholding Citra menggunakan Delphi

Thresholding (pengambangan) artinya adalah nilai piksel pada citra yang memenuhi syarat nilai ambang yang kita tentukan dirubah kenilai tertentu yang dikehendaki. Secara matematis ditulis seperti berikut

Dengan fi (x,y) adalah citra asli (input), fo(x,y) adalah piksel citra baru (hasil/output), Tn adalah nilai ambang yang ditentukan. Nilai piksel pada (x,y) citra output akan sama dengan T1 jika nilai piksel (x,y) citra input tersebut ? T1. Nilai piksel (x,y) citra input akan sama dengan T2 jika T1 < fi(x,y)< T2, dan seterusnya…

Kita ambil contoh citra greyscale 8 bit akan dipetakan menjadi peta biner (hitam dan putih saja) dengan nilai ambang tunggal = 128 maka persamaan matematisnya

Ini berarti piksel yang nilai intensitasnya dibawah 128 akan diubah menjadi hitam (nilai intensitas = 0), sedangkan piksel yang nilai intensitasnya diatas 128 akan menjadi putih (nilai intensitas = 255).

Thresholding dengan Delphi
Contoh berikut kita akan  melakukan operasi thresholding tunggal dengan nilai ambang yang bisa diatur. Citra yang diolah adalah citra true color dan hasilnya berupa berupa citra biner. Implementasi dengan Delphi cukup mudah, mulailah dengan membentuk tampilan formnya seperti berikut. Tambahkan beberapa komponen dan atur propertinya seperti tabel.

Proses pertama adalah merubah citra true color menjadi citra greyscale , menggunakan metode nilai maksimum. Berikut potongan kode programnya.

Setelah itu kita mulai dengan proses thresholding. Nilai level grey yang didapat dibandingkan dengan nilai ambang yang ditentukan oleh posisi TrackBar1. Jika nilainya lebih kecil dari nilai ambang maka piksel akan diubah ke intensitas nol (warna putih), jika lebih besar atau sama dengan nilai ambang piksel diubah ke intensitas 255 (hitam).

Berikut potongan programnya.

Gambar berikut menunjukkan hasil thresholding dengan nilai ambang yang berbeda-beda.

Download source code

1. Image Processing – Thresholding.rar (184kb)

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

Membuat Histogram Citra dengan Dephi

Histogram adalah grafik yang menujukkan frekuensi kemunculan setiap nilai gradasi warna[3]. Sumbu x menunjukkan intensitas warna, sedangkan y menunjukkan frekuensi kemunculannya. Kita ambil contoh citra greyscale 3 bit ukuran 5×5 piksel dengan peta berikut.


Kita bisa lihat pada gambar diatas, nilai 1 muncul 4 kali, nilai 2 muncul 3 kali, nilai 3 muncul 3 kali dan seterusnya jika kita buat tabelnya  akan seperti ini.

Dan bila digambarkan grafiknya seperti berikut

Agar gambar grafik tidak melebihi batas layar maka perlu dilakukan proses normalisasi. Prosesnya cukup membagi jumlah pada suatu nilai intensitas dengan jumlah keseluruhan piksel. Tabel hasil normalisasinya akan tampak seperti berikut.

Membuat histogram dengan Delphi

Baik, sekarang kita mulai saja mengimplementasikannya kedalam program Delphi. Kita mulai dengan menaruh komponen berikut ke dalam form dan setting propertinya seperti tabel.

Khusus untuk komponen Chart1 ikuti langkah berikut:

  1. Klik dua kali pada komponen Chart1, hingga muncul dialog Editing Chart1
  2. Pada tab Chart, sub tab Series, tambahkan series dengan klik tombol Add, kemudian pada dialog TeeChart Gallery pilih Bar dan non-akitfkan mode 3D (hilangkan centang 3D), klik OK.
  3. Pada tab Chart, sub tab Axis, hilangkan tanda centang pada Show Axis.
  4. Pada tab Chart, sub tab Titles, ganti judulnya menjadi HISTOGRAM.
  5. Pada tab Chart, sub tab Legend, hilangkan centang pada Visible.
  6. Pada tab Series, sub tab Marks, hilangkan centang pada Visible.

Berikut adalah sourcecode untuk membuat histogram dengan Delphi.

[sourcecode language=”delphi”]
procedure TForm1.Histogram;
var piksel : PByteArray;
Gray, TotalPiksel, i, brs, kol : integer;
R, G, B : Real;
begin
Citra.PixelFormat := pf24bit;
for i := 0 to 255 do
begin
HistogramGray[i] := 0
end;
TotalPiksel := 0;
for brs := 0 to Citra.Height – 1 do
begin
kol := 0;
piksel := Citra.ScanLine[brs];
repeat                //greyscaling
R := 0.11*piksel[kol];
G := 0.59*piksel[kol+1];
B := 0.3*piksel[kol+2];
Gray := round(R+G+B);
HistogramGray[Gray] := histogramgray[Gray]+1;        // pengambilan data intensitas
inc(TotalPiksel);
Inc(kol,3);
until kol &amp;amp;amp;amp;gt; 3*(Citra.Width-1);
end;
for kol:=0 to 255 do // normalisasi
HistogramGray[kol] := HistogramGray[kol]/TotalPiksel
end;
[/sourcecode]

Berikut kode untuk penampilan data histogram ke bentuk grafik

[sourcecode language=”delphi”]
procedure TForm1.HIstogram1Click(Sender: TObject);
var i:Integer;
begin
Histogram;
Series1.Clear;
for i := 0 to 255 do
begin
Series1.AddXY(i, HIstogramGray[i],”,clBlack);
end;
end;
[/sourcecode]

Sekedar perbandingan hasil histogram menggunakan Delphi dengan histogram milik Adobe Photoshop.

ImageProcessing-Histogram.rar

Mengubah Citra Warna ke Greyscale

Proses awal yang banyak dilakukan dalam image processing adalah mengubah citra berwarna menjadi citra grey-scale. Untuk membuat citra berwarna menjadi citra dengan greyscale (abu-abu) maka nilai warna ditiap piksel citra kita manipulasi menggunakan rumus berikut:

atau                        

atau bisa gunakan yang ini

Jika dituliskan dalam bentuk potongan kode pada delphi akan tampak seperti ini

Baris 18 dan 22 menunjukkan pemakaian ketiga rumus diatas, untuk sementara dinon-aktifkan, jika ingin mengaktifkannya tinggal menghapus tanda comment “//”.

Atau jika menggunakan metode Scanline kodenya nampak seperti berikut.

Download (source code):

Image Processing – Greyscale.rar

Referensi :

[1] Wikipedia

[2] http://imageprocessingindelphi.blogspot.com/

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.

    1. Citra Biner

      Biasa disebut dengan citra monokrom. Citra ini terdiri dari 2 warna saja yaitu hitam dan putih.

    2. Citra Greyscle

      Citra greyscale (derajat keabuan) memiliki beberapa warna diantara hitam dan putih. Banyaknya warna tergantung dari berapa bit citra tersebut.

  1. 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:

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.

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.

 

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&amp;lt;/em&amp;gt;
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.

 

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