Selamat datang di sonoku.com

Konversi Bilangan Heksadesimal ke Biner dengan Delphi

Bagi anda yang sering berhubungan dengan interface mikrokontroler dan PC kadang memerlukan konversi bilangan heksadesimal ke dalam bentuk Biner. Sebenarnya Delphi telah menyediakan fungsi HexToBin sendiri, tapi kali ini kita coba untuk mengkonversi bilangan heksadesimal dengan tipe data string dan menghasilkan bilangan biner dalam bentuk string juga.

Coba perhatikan fungsi berikut ini

function HexToBin(HexStr: string): string;
const BinArray: array[0..15, 0..1] of string = (('0000', '0'), ('0001', '1'), ('0010', '2'), ('0011', '3'), ('0100', '4'), ('0101', '5'), ('0110', '6'), ('0111', '7'), ('1000', '8'), ('1001', '9'), ('1010', 'A'), ('1011', 'B'), ('1100', 'C'), ('1101', 'D'), ('1110', 'E'), ('1111', 'F'));
HexAlpha: set of char = ['0'..'9', 'A'..'F'];
var i, j: Integer;
begin
Result:='';
HexStr:=AnsiUpperCase(HexStr);
for i:=1 to Length(HexStr) do
if HexStr[i] in HexAlpha then
begin
for j:=1 to 16 do
if HexStr[i]=BinArray[j-1, 1] then
Result:=Result+BinArray[j-1, 0];
end
else
begin
Result:='';
ShowMessage('This is not hexadecimal number');
Break;
end;
if Result<>'' then
while (Result[1]='0')and(Length(Result)>1) do
Delete(result, 1, 1);
end;

dan berikut dara penggunaannya dalam program

procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption := HexToBin(Edit1.Text);
end;

BelCC V2.1 – Software Bel Cerdas Cermat versi baru

Untuk menambah fitur dan kemampuan SL01 dari Sonotechno, kini telah dirilis BelCC versi 2.1. Perangkat lunak ini dikembangkan dengan memperhatikan beberapa keperluan mendasar pada even kuis, serta masukan/saran dari para pengguna SL01. Terima kasih untuk para pengguna yang telah memberikan kritikan dan saran demi berkembangnya produk ini. Dengan tetap mempertahankan fitur yang sudah ada, BelCC 2.1 ditambahkan beberapa fitur pelengkap yang memudahkan anda mengatur cara kuis dengan biaya hemat. Adapun beberapa fitur yang ditambahkan dalam BelCC 2.1 ini adalah sebagai berikut:

  • 4 Digit Tampilan skor tiap peserta, bisa untuk skor minus

  • Aktivasi papan skor, dapat diset peserta mana saja yang akan tampil papan skornya

  • Adjustable Score Palette – untuk mengatur nilai penambah atau pengurang skor pada papan skor

untuk menambahkan atau mengurangkan skor, cukup klik kanan pada angka yang akan ditambahkan/dikurangkan kemudian pada pop up yang muncul pilih angka penambah/pengurangnya.

  • Algoritma koneksi hardware baru * – untuk mengetahui apakah hardware benar-benar terhubung atau tidak.

Anda bisa mendapatkan software BelCC 2.1 ini secara GRATIS! Silakan subscribe channel youtube kami dan tuliskan email anda.
Download BelCC 2.1
Setup file BelCC 2.1

)* Hanya tersedia pada produk yang dibeli setelah tanggal 21 Oktober 2010, untuk produk SL-01 yang dibeli sebelum tanggal 21 Oktober 2010, silakan download file BelCC 2.1a berikut

Download BelCC 2.1
Setup file BelCC 2.1a

Membuat button pada saat runtime

Jarang sekali programmer membuat sebuah komponen/objek visual pada saat runtime. Artinya mereka membuat sebuah komponen visual pada saat program di jalankan (run). Biasanya semua dibuat pada saat mereka merancang tampilan program dengan meletakkan semua komponen seperti tombol (TButton), Combobox, dan lain sebagainya pada form. Cara seperti ini sering disebut dengan istilah “Designtime” atau saat merancang.

Namun jika anda perlu sekali untuk membuat sebuah komponen visual secara runtime, mungkin cara ini adalah cara pragmatis yang tepat untuk anda ikuti. Kali ini kita coba untuk membuat sebuah tombol (TButton) pada saat program dijalankan. Jadi rencananya dengan menekan sebuah tombol yang pasang pada Form pada saat designtime, program akan membuat tombol yang lain. Baik langsung saja.

Letakkan sebuah tombol pada Form utama, kemudian masuklah pada bagian prosedur OnClick tombol tersebut. Pada frame OnClick tersebut masukkan kode berikut:

procedure TForm1.Button1Click(Sender: TObject);
var
btnRunTime : TButton;
begin
btnRunTime := TButton.Create(Form1);
with btnRunTime do begin
Visible := true;
Top := 64;
Left := 50;
Width := 150;
Caption := 'My Runtime Button';
Name := 'Runtimebutton';
Parent := Form1;
end;

Pada kode diatas kita menggunakan metode “Create”, dimana sebuah kelas objek  TButton dibuat menggunakan perintah create.  Setelah pemanggilan create, kemudian kita deklarasikan property button yang akan tampil nanti, mulai dari visibilitas, parental,  posisi tombol, lebar, caption, dan tidak tertinggal adalah nama objek itu sendiri. Semua persis seperti kita membuat tombol pada saat designtime, hanya saja kita menuliskan value sebuah objek secara pragmatis melalui sebuah kode.

Jika anda berniat untuk memberikan sebuah aksi pada tombol yang kita buat secara runtime, misalnya pada event OnClick (aksi pada saat tombol di-klik), pertama deklarasikan sebuah prosedur OnClick pada bagian Private Declarations seperti dibawah ini.

...
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure KlikTombol(Sender: TObject);
public
{ Public declarations }
end;
...

setelah itu buatlah prosedur dengan nama KlikTombol seperti kode berikut.

procedure TForm1.KlikTombol(Sender: TObject);
begin
with (Sender as TButton) do
ShowMessage('Hello Sonoku!!');
end;

Kemudian tambahkan pada event OnClick tombol “Buat Tombol” sebuah deklarasi event KlikTombol tadi sehingga kodenya akan seperti berikut.

procedure TForm1.Button1Click(Sender: TObject);
var
btnRunTime : TButton;
begin
btnRunTime := TButton.Create(Form1);
with btnRunTime do begin
Visible := true;
Top := 64;
Left := 50;
Width := 150;
Caption := 'My Runtime Button';
Name := 'Runtimebutton';
Parent := Form1;
OnClick := KlikTombol;
end;

Cukup mudah bukan? Perhatikan sekarang, bagaimana jika tombol “Buat Tombol” di-klik untuk kedua kalinya? Pastinya akan muncul pesan orror bahwa terdapat duplikasi nama sebuah objek. Hal ini memang sangat dilarang dalam Delphi. Untuk jika anda ingin membuat tombol lain secara runtime, anda harus membuat tombol tersebut dengan nama yang unik. Perhatikan contoh kode berikut.

procedure TForm1.Button2Click(Sender: TObject);
var
btnRunTime : TButton;
i: Integer;
begin
for i:= 1 to 5 do
begin
btnRunTime := TButton.Create(nil);
with btnRunTime do
begin
Visible := true;
Top := 110+(i*25);
Left := 50+(i*5);
Width := 150;
Caption := 'My Runtime Button ke-'+InttoStr(i);
Name := 'Runtimebutton'+InttoStr(i);
Parent := Form1;
OnClick := KlikTombol;
end;
end;
end

Contoh diatas akan membuat tombol sebanyak 5 kali, kemudian menatanya sedemikian rupa agar tidak bertumpuk dengan memodifikasi properti top dan left tombol. Agar nama objek menjadi unik, kita tambahkan sebuah angka yang diambilkan dari variabel iterasi “i” di belakang value properti Name tombol. Namun tetap saja, jika tombol “Buat Tombol 5” ditekan utuk kedua kalinya akan tetap muncul pesan erorr duplikat  nama objek. Lalu bagaiamana mengatasinya? Tunggu artikel berikutnya…oke 🙂


Source Code (170kB
)
Download sourcecode Runtime Object Creation<a href=

Versi Delphi

a

Borland Delphi 1
Delphi 1 dirilis pada tahun 1995 untuk 16-bit Windows 3.1 dan merupakan proyek awal dari apa yang sekarang disebut dengan  perangkat Rapid Application Development (RAD). Delphi 1 adalah penerus dari Turbo Pascal dan Borland Pascal. Seperti Turbo Pascal, Delphi kode ditulis dalam dialek bahasa pemrograman Pascal yang dikenal sebagai Object Pascal.

Borland Delphi 2
Dirilis pada tahun 1996, didukung dengan Windows 32-bit. Digabungkan dengan Delphi 1 untuk aplikasi Windows 16-bit.

Borland Delphi 3

Delphi’s Active Insight and Broker Technologies combine to give you a flexible and powerful architecture for developing distributed client/server applications.[1]
Billy Bosworth, DBMS Online, April, 1997

Delphi 3 dikenal dengan “Delphi klasik” yang dirilis pada tahun 1997, beberapa penambahan pada versi ini antara lain: teknologi code insight, DLL debugging, template komponen, komponen DecisionCube and TeeChart, teknologi WebBroker, ActiveForms, paket komponen, dan integrasi dengan antarmuka COM.

Delphi 4

Delphi 4 is a comprehensive set of professional and client/server development tools for building high productivity solutions for distributed computing. Delphi provides Java interoperability, high performance database drivers, CORBA development, and Microsoft BackOffice support. You’ve never had a more productive way to customize, manage, visualize and update data. With Delphi, you deliver robust applications to production, on time and on budget[2].

Delhi 4 dirilis pada tahun 1996, support Windows98 dan lebih mengembangkan OLE dan COM juga menambahkan fitur Array Dinamis.

Delphi 5
Delphi 5 banyak memperkenalkan fitur baru seperti berbagai layout desktop, konsep frame, pembangunan paralel, kemampuan terjemahan, debugger terintegrasi yang disempurnakan, kemampuan Internet yang baru (XML), powerful database (dukungan ADO), dll. Delphi 5 rilis pada tahun 1997.

Kylix
Kylix merupakan Delphi untuk sistem operasi Linux yang rilis pada tahun 2001.




Borland Delphi 6
Hadir untuk mendukung baik Windows maupun Linux.

Borland Delphi 7
Versi ini menjadi versi standar yang banyak digunakan oleh para programmer. Dirilis pada tahu 2002, Delphi 7 dibuat Borland populer karena stabilitas, kecepatan dan persyaratan perangkat keras yang rendah dan masih banyak digunakan hingga saat ini. Delphi 7 menambahkan dukungan untuk Windows XP, dan menambahkan lebih banyak dukungan untuk membangun aplikasi Web. Ini juga merupakan versi terakhir dari Delphi yang dapat digunakan tanpa aktivasi.

Borland Delphi 8
Delphi 8, dirilis Desember 2003, adalah rilis NET-satunya yang memungkinkan pengembang untuk mengkompilasi kode Delphi Object Pascal ke .NET CIL (Common Intermediate Language). IDE ditulis ulang untuk mengakomodasi untuk pengembangan .NETdan berubah menjadi antarmuka yang mirip dengan Microsoft Visual Studio.NET. Sayangnya versi ini tidak lagi mendukung pengembang untuk membuat aplikasi asli (*.exe).

Borland Delphi 2005
Disebut juga Delphi 9 atau Borland Developer Studio 3.0, versi ini memasukkan pengembangan Win32 dan pengembangan NET. dalam satu IDE. Banyak yang ditambahkan pada Delphi versi ini, seperti pada sisi IDE, dan perintah for..in (seperti foreach s # pada bahasa C). Kemampuan untuk mengkompilasi aplikasi asli windows (*. exe) telah ditambahkan kembali ke Delphi 2005.

Delphi 2006
Pada akhir 2005 versi baru, Delphi 2006 atau Delphi 10 atau Borland Developer Studio 4.0 dirilis. Versi ini menggabungkan beberapa pengembangan seperti Delphi .NET, C#, Delphi Win32 dan C++. Delphi 10 lebih stabil dibandingkan dengan Delphi 8 atau Delphi 2005, dan ditingkatkan bahkan lebih dengan merilis service pack dan beberapa perbaikan terbaru.

Delphi 2007

Delphi 2007 (Delphi 11), versi pertama oleh CodeGear, dirilis pada tanggal 16 Maret 2007. Fitur-fitur baru termasuk dukungan untuk MS Build dan penyempurnaan Visual Component Library untuk Windows Vista, tapi fitur C# Builder dalam rilis ini penjualannya tidak setinggi seperti yang diharapkan karena Visual Studio juga menawarkan C#. Windows Form desainer untuk Delphi. NET juga ditambahkan di D2007 karena didasarkan atas bagian dari NET framework. API yang telah dirubah begitu drastis oleh Microsoft di NET 2.0 yang akan memperbarui IDE menjadi langkah besar. Untuk pertama kalinya Delphi bisa di-download dari Internet dan diaktifkan dengan kunci lisensi, kemampuan didukung oleh teknologi instalasi InstallAware baru Internasionalisasi versi Delphi 2007 dikirim secara bersamaan dalam bahasa Inggris, Perancis, Jerman dan Jepang. RAD Studio 2007 (kode bernama Highlander), yang meliputi NET dan pengembangan C++ Builder, dirilis pada September 5, 2007

Pemfilteran Domain Spasial

Sebenarnya istilah filter mengacu pada proses melakukan penyaringan komponen frekuensi tertentu (yang sama diterima, yang tidak ditolak). Jika kita ingat kembali pelajaran tentang filter di Teknik Elektro, kita tahu bahwa filter lolos rendah (Low Pass Filter/LPF) akan meloloskan komponen yang berfrekuensi rendah, dalam image processing LPF akan menghasilkan citra Blur (lembut/halus). Lalu filter dalam pengolahan citra bentuknya seperti apa? Biasanya dalam bentuk piksel berukuran 2×2, 3×3 atau 5×5 dan seterusnya, tergantung kebutuhan, dan piksel ini biasa disebut dengan mask atau kernel ataupun window. Kalau saya menyebutnya saringan, karena cara kerjanya memang mirip saringan :).

Pemfilteran domain spasial adalah proses manipulasi kumpulan piksel dari sebuah citra untuk menghasilkan citra baru[1]. Aplikasinya untuk perbaikan kualitas citra. Read More

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.

if not OpenPictureDialog1.Execute then Exit else
begin
 Citra := TBitmap.Create;
 Citra.LoadFromFile(OpenPictureDialog1.FileName);
end;
Image1.Picture.Bitmap := Citra;
Temp_image := TImage.Create(Self);
Temp_image.Picture.Bitmap.Assign(Image1.Picture.Bitmap);
// cek apakah citra 8 bit
if Image1.Picture.Bitmap.PixelFormat = pf8bit then
begin
 CheckBox1.Checked := True;
 CheckBox1.Enabled := False;
 REDTrackBar.OnChange(Self);
end else
 CheckBox1.Enabled := True;

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.

procedure TForm1.Brightness(Trackbar: TObject);
var brs, kol, i, temp :Integer;
piksel, temp_piksel : PByteArray;
begin
 if Image1.Picture.Bitmap = nil then Exit else
 for brs := 0 to Image1.Picture.Bitmap.Height - 1 do
 begin
  piksel := Image1.Picture.Bitmap.ScanLine[brs];
  temp_piksel := Temp_image.Picture.Bitmap.ScanLine[brs];
  for kol := 0 to Image1.Picture.Bitmap.Width - 1 do
  begin
   if Trackbar = BLUETrackBar then
    temp := temp_piksel[3*kol]+ BLUETrackBar.Position;
   if Trackbar = GREENTrackBar then
    temp := temp_piksel[3*kol+1]+ GREENTrackBar.Position;
   if Trackbar = REDTrackBar then
    temp := temp_piksel[3*kol+2]+ REDTrackBar.Position;
   &amp;lt;p&amp;gt;if temp &amp;amp;amp;amp;amp;gt;255 then temp := 255;
   if temp &amp;amp;amp;amp;amp;lt;=0 then temp := 0;
   &amp;lt;p&amp;gt;if Trackbar = BLUETrackBar then piksel[3*kol] := temp;
   if Trackbar = GREENTrackBar then piksel[3*kol+1] := temp;
   if Trackbar = REDTrackBar then piksel[3*kol+2] := temp;
  end;
 end;
Image1.Invalidate;
end

;

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.

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
rgb1[0] := piksel[3*kol];
rgb1[1] := piksel[3*kol+1];
rgb1[2] := piksel[3*kol+2];
grey := MaxIntValue(rgb1);
end;
end;

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.

for bit := 0 to 2 do        //operasi citra 24 bit
begin
piksel[3* kol+bit] := grey;
if piksel[3* kol+bit] TrackBar1.Position then piksel[3* kol+bit] := 0;
if piksel[3* kol+bit] = TrackBar1.Position then piksel[3* kol+bit] := 255;
end;

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

procedure TForm1.BitBtn1Click(Sender: TObject);
brs, kol : Integer;
color : Longint;
r,g,b,clr : Byte;
rgb1 : array [0..2] of integer;
begin
  Image2.Picture.Bitmap := Image1.Picture.Bitmap;
  for kol := 0 to Image2.Picture.Bitmap.Height-1 do
  begin
    Application.ProcessMessages;
    for brs := 0 to Image2.Picture.Bitmap.Width-1 do
    begin
      color := ColorToRGB(Image2.Picture.Bitmap.Canvas.Pixels[brs,kol]); //---mengambil warna per piksel
       r := GetRValue(color);
       g := GetgValue(color);
       b := GetbValue(color);
       clr := ((r+g+b)div 3); //****Rumus 1
       //clr := round((0.2989*r)+(0.5870*g)+(0.1140*b)); //****Rumus 2
       rgb1[0]:= r;
       rgb1[1]:= g;
       rgb1[2]:= b;
       //clr := MaxIntValue(rgb1); //****Rumus 3&amp;lt;br&amp;gt;
       Image2.Picture.Bitmap.Canvas.Pixels[brs,kol] := RGB(clr,clr,clr);
    end;
  end;
end;

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.

procedure TForm1.Button4Click(Sender: TObject);
var brs, kol, r : Integer;
clr : longint;
temp : PByteArray;
rgb1 : array [0..2] of Integer;
begin
 Image2.Picture.Bitmap := Image1.Picture.Bitmap;
 Image2.Picture.Bitmap.PixelFormat := pf24bit;
 for brs := 0 to Image7.Picture.Bitmap.Height-1 do
 begin
  temp := Image2.Picture.Bitmap.ScanLine[brs];
  Application.ProcessMessages;
  kol := 0;
  repeat
   clr :=((temp[kol])+(temp[kol+1])+(temp[kol+2]))div 3;
   //clr :=round((0.1140*temp[kol])+(0.5870*temp[kol+1])+(0.2989*temp[kol+2]));
   Rgb1[0] := temp[kol];
   Rgb1[1] := temp[kol+1];
   Rgb1[2] := temp[kol+2];
   //clr := MaxIntValue(rgb1);
   for r:=0 to 2 do
     temp[kol+r] := clr;
   inc(kol,3);
   until kol &amp;amp;amp;gt;= 3*Image2.Picture.Bitmap.Width-1; //---format piksel 24bit(3x8bit)'R=8bit,G=8bit,B=8 bit
   end;
Image2.Invalidate;
end;

Download (source code):

Image Processing – Greyscale.rar

Referensi :

[1] Wikipedia

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