Cara membuat aplikasi Histogram Pada " Delphi Xenon"


Pada Pembahasan, kali ini kita akan membuat Program Histogram Pada Delphi Xenon.
Untuk mempelajari Pengolagan Citra Di Delphi XE dengan Langsung Coding Algoritma,pertama kita perlu membuat GUI (antar muka pengguna Grafis) suntuk membuat gambar,Melihat Proses, dan menunjukan Hasilnya.
Berikut ini adalah penjelasan singkat tentang Histogram.

Apa itu HISTOGRAM CITRA..??
HISTOGRAM CITRA  adalah grafik yang menggambarkan penyebaran nilai-nilai intensitas Pixel dari suatu citra atau bagian tertentu didalam citra.
Misalkan Citra digital Memiliki L derajat keabuan, yaitu dari 0 sampai L-l. Secara matematis histogram citra dihitung dengan rumus:
dimana :
         : Jumlah pixel yang memiliki derajat keabuan l
          : Jumlah seluruh pixel di dam citra.
Itulah menjelasan singkat dari saya tentang histogram, sekarang kita masuk pada sesi pembuatn aplikasi Histogram .

Alat & Bahan
  1. Aplikasi Delphi Xenon
  2. 1 Leptop (terserah kalian mau pakai leptop atou Pc juga boleh, asalkan ada aplikasi Delphi Xe nya.
Langkah-langkah
  • Buat Project baru pada delphi Xenon .
  • Buat unit baru dengan cara klik File kemudian pilih New lalu pilih Unit.
  • Kemudian Save All dan beri nama Unit1 sebagai FHistogram, Unit2 sebagai UHistogram dan Project1 sebagai Project_Histogram.
  • Tambahkan Beberapa object kedalam Form :
           Shape1: TShape;
           Shape2: TShape;
           ImageAsli: TImage;
           ImageHistogram: TImage;
           Button1: TButton;
           Panel1: TPanel;
           Label1: TLabel;
           OpenPictureDialogCitra: TOpenPictureDialog      
  • Pada aplikasi Delphi xe5, atur desainnya seperti pada gambar di bawah ini :
  • Klik 2x pada buton "Ambil Citra" dan masukan coding program seperti berikut ini:
          procedure TForm1.Button1Click(Sender: TObject);
var
  Histogram : THistogram;

begin
  if OpenPictureDialogCitra.Execute then
  begin
    // Ambil citra
    ImageAsli.Picture.LoadfromFile(
       OpenPictureDialogCitra.FileName);

    // Cek Citra
    if not ((ImageAsli.Picture.Bitmap.PixelFormat = pf8bit) or
            (ImageAsli.Picture.Bitmap.PixelFormat = pf16bit) or
            (ImageAsli.Picture.Bitmap.PixelFormat = pf24bit)) then
    begin
      ShowMessage('Pilihlah citra warna 24 bit atau ' +
                  'citra berskala keabuan 8 bit');
      ImageAsli.Picture := Nil;
      Exit;
    end;

    // Tampilkan histogram citra
    Histogram := THistogram.Create;
    Histogram.Proses(ImageAsli, ImageHistogram);
    Histogram.Free;
  end;
end;
  •  Buka Unit UHistogram, dan masukkan kode progam seperti berikut ini.
unit UHistogram;
interface
  uses SysUtils, Vcl.Graphics, Vcl.ExtCtrls, vcl.Dialogs,
       VCLTee.TeEngine, VCLTee.Series, VCLTee.TeeProcs,
       VCLTee.Chart;
  type
    THistogram = class  (TObject)
      private
        FrekuensiMaks  : Integer;
        HistogramAbu   : array[0..255] of Integer;
        HistogramMerah : array[0..255] of Integer;
        HistogramHijau : array[0..255] of Integer;
        HistogramBiru  : array[0..255] of Integer;
      public
        constructor Create;
        procedure Proses(Citra: TImage; Histog: TImage;
                         Opsi: Char = 'A');
    end;
implementation
  constructor THistogram.Create;
  begin
  end;
  procedure THistogram.Proses(Citra: TImage; Histog: TImage; Opsi: Char);
  var
    Baris, Kolom, Indeks: Integer;
    PData : PByteArray;

  begin
    for Indeks := 0 to 255 do
    begin
      HistogramAbu[Indeks]   := 0;
      HistogramMerah[Indeks] := 0;
      HistogramHijau[Indeks] := 0;
      HistogramBiru[Indeks]  := 0;
    end;

    if Citra.Picture.Bitmap.PixelFormat = pf8bit then
    begin
      for Baris :=0 to Citra.Picture.Bitmap.Height-1 do
      begin
        PData := Citra.Picture.Bitmap.ScanLine[Baris];

        for Kolom := 0 to Citra.Picture.Bitmap.Width-1 do
          Inc(HistogramAbu[PData[Kolom]]);
      end;
      FrekuensiMaks:=0;
      for Indeks := 0 to 255 do
        if HistogramAbu[Indeks] > FrekuensiMaks then
          FrekuensiMaks := HistogramAbu[Indeks];
    end;
    if Citra.Picture.Bitmap.PixelFormat = pf24bit then
    begin
      for Baris := 0 to Citra.Picture.Bitmap.Height-1 do
      begin
        PData := Citra.Picture.Bitmap.ScanLine[Baris];
        for Kolom := 0 to Citra.Picture.Bitmap.Width-1 do
        begin
          Inc(HistogramBiru[PData[3 * Kolom]]);
          Inc(HistogramHijau[PData[3 * Kolom + 1]]);
          Inc(HistogramMerah[PData[3 * Kolom + 2]]);
        end;
      end;

      for Indeks := 0 to 255  do
      begin
        if HistogramMerah[Indeks] > FrekuensiMaks then
          FrekuensiMaks := HistogramMerah[Indeks];

        if HistogramHijau[Indeks] > FrekuensiMaks then
          FrekuensiMaks := HistogramHijau[Indeks];

        if HistogramBiru[Indeks] > FrekuensiMaks then
          FrekuensiMaks := HistogramBiru[indeks];
      end;
    end;
    // Gambar histogram
    // -- Kosongkan citra
    Histog.Picture := Nil;
    // -- Tentukan panjang dan lebar citra
    Histog.Picture.Bitmap.Height := 200;
    Histog.Picture.Bitmap.Width := 275;
    with Histog.Picture.Bitmap do
    begin
      // -- Buat garis pembagi
      Canvas.Pen.Color := clBlack;
      Canvas.MoveTo(10, 165);
      Canvas.LineTo(265, 165);
      Indeks := 0;
      while Indeks < 255 do
      begin
        Canvas.MoveTo(10 + Indeks, 163);
        Canvas.LineTo(10 + Indeks, 167);
        Canvas.TextOut(10 + Indeks, 168,
           IntToStr(Indeks));

        Indeks := Indeks + 40;
      end;
      if Citra.Picture.Bitmap.PixelFormat = pf8bit then
      begin
        // -- Buat histogram komponen abu-abu
        Canvas.Pen.Color := clBlack;
        Canvas.MoveTo(10, 160);
        for Indeks := 0 to 255 do
          Canvas.LineTo(10 + Indeks,
             160 - Round(150 * HistogramAbu[Indeks] /
                         FrekuensiMaks));
      end;
      // Pastikan Opsi berupa A, R, G, B
      if not ((Opsi = 'R') or (Opsi = 'G')
         or (Opsi = 'B')) then
        Opsi := 'A';
      if (Citra.Picture.Bitmap.PixelFormat = pf24bit) and
         ((Opsi = 'A') or (Opsi = 'R')) then
      begin
        // -- Buat histogram komponen merah
        Canvas.Pen.Color := clRed;
        Canvas.MoveTo(10, 160);
        for Indeks := 0 to 255 do
          Canvas.LineTo(10 + Indeks,
             160 - Round(150 * HistogramMerah[Indeks] /
                         FrekuensiMaks));
      end;
      if (Citra.Picture.Bitmap.PixelFormat = pf24bit) and
         ((Opsi = 'A') or (Opsi = 'G')) then
      begin
        // -- Buat histogram komponen hijau
        Canvas.Pen.Color := clGreen;
        Canvas.MoveTo(10, 160);
        for Indeks := 0 to 255 do
          Canvas.LineTo(10 + Indeks,
             160 - Round(150 * HistogramHijau[Indeks] /
                         FrekuensiMaks));
      end;
      if (Citra.Picture.Bitmap.PixelFormat = pf24bit) and
         ((Opsi = 'A') or (Opsi = 'B')) then
      begin
        // -- Buat histogram komponen biru
        Canvas.Pen.Color := clBlue;
        Canvas.MoveTo(10, 160);
        for Indeks := 0 to 255 do
          Canvas.LineTo(10 + Indeks,
             160 - Round(150 * HistogramBiru[Indeks] /
                         FrekuensiMaks));
      end;
             end;
                    end;
                                       end.

  • Selanjutnya Run 1.      program dengan menekan tombol F9, dan hasilnya akan seperti pada gambar dibawah ini:



  • Lakukan uji coba dengan mengambil file berupa gambar dengan jenis Citra Warna, dengan mengklik tombol Ambil Citra lalu pilih gambar.


  • Maka tampilannya akan seperti pada fambabawah ini:

  • Pilih  gambar dengan jenis Citra Grayscale, dengan mengklik tombol Ambil Citra lalu pilih gambar

  • Maka tampilanya akan seperti pada gambar di bawah in:





  • SELESAI

Sekian tutorial dari saya tentang cara membuat Cara membuat aplikasi Histogram Pada " Delphi Xenon".
tunggu tutorial yang lain dari saya.



SAMPAI JUMPA















Share this

Related Posts

First