Membuat Histogram Dengan Delphi

Pembahasan kali ini, kita akan membuat Histogram sederhana.

Untuk mempelajari
pengolahan citra di Delphi dengan langsung coding algoritma, pertama kita perlu membuat kita GUI (antarmuka pengguna grafis) untuk memuat
gambar
, melihat, proses, dan menunjukkan hasilnya.


  1. Buat proyek baru (File-> New-> Aplikasi di Delphi 7 atau File-> New-> Formulir Aplikasi VCL di Turbo Delphi Explorer).
  2. Mengatur properti bentukFormStyle untuk fsMDIForm.
  3. Mengubah nama form dari Form1 ke MainForm.
  4. Tambahkan komponen menu utama (dari palet komponen Standard) pada formulir, klik dua kali dan mengatur menu File item, dengan Open, Save, Close, dan sub menu Keluar.
  5. Tambahkan OpenPictureDialog (dari palet komponen Dialog) dan SavePictureDialog (dari dialog palet komponen) komponen di form.
  6. Mengatur properti Option.ofOverwritePrompt dari SavePictureDialog ke true.
  7. Tambahkan status bar (dari palet komponen Win32) pada form ini untuk mengurangi ukuran jendela.
  8. Atur ukuran form.
  9. Simpan form (File-> Save As), MainUnit dengan nama kotak edit.
  10. Buat form baru untuk menampilkan gambar sebagai jendela anak pada form utama menggunakan menu Form File-> New->.
  11. Mengatur properti FormStyle dari form ini dengan fsMDIChild.
  12. Mengubah nama form dengan ImageForm.
  13. Atur ukuran form.
  14. Tambahkan komponen Image (dari komponen palet additional).
  15. Atur komponen Image.
  16. Atur properti Stretch dari komponen Image menjadi "true".
  17. Atur properti komponen proporsional dari Image menjadi "true".
  18. Simpan form menggunakan menu File-> Save as, dan ganti nama dengan ImageUnit.
  19. Simpan proyek dengan menggunakan menu File-> Save project as, dengan nama ImageProcessor, jadi ini akan menjadi nama file executable kita jika kita compile.
Selanjutnya atur properti style form ini untuk fsMDIChild. Klik tab Events pada inspektur objek, double klik event handler OnClose pada kotak edit. Anda akan diarahkan ke event handler, dan ubah variabel Aksi untuk caFree diantara begin dan end.
kemudian tulis koding di bawah ini dan simpan dengan nama HistogramUnit.

procedure
THistogramForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin

Action:=caFree;
end;

tambahkan juga koding dibawah ini pada HistogramForm abstraction di awal privat section dan procedure ShowHistogram( ) pad public section.

uses

ExtCtrls, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
type

THistogramForm = class(TForm)
procedure
FormClose(Sender: TObject; var Action: TCloseAction);
private

{ Private declarations }

MaxCount:Integer;
HistogramGray:Array[0..255]of Integer;
HistogramRed:Array[0..255]of Integer;
HistogramGreen:Array[0..255]of Integer;
HistogramBlue:Array[0..255]of Integer;
public

{ Public declarations }

procedure
ShowHistogram(Image:TImage);
end
;

tulis koding di bawah ini untuk procedur penghitungan histogram.

procedure
THistogramForm.ShowHistogram(Image:TImage);

var

i,j:integer;

pixelPointer:PByteArray;

begin

try

begin

for
i:=0 to 255 do

begin

HistogramGray[i]:=0;

HistogramRed[i]:=0;

HistogramGreen[i]:=0;

HistogramBlue[i]:=0;

end
;

if Image.Picture.Bitmap.PixelFormat=pf8bit then

begin

for
i:=0 to Image.Height-1 do

begin

pixelPointer:=Image.Picture.Bitmap.ScanLine[i];

for j:=0 to Image.Width-1 do

begin

Inc(HistogramGray[pixelPointer[j]]);

end;

end;

MaxCount:=0;

for i:=0 to 255 do

if HistogramGray[i]>MaxCount then

MaxCount:=HistogramGray[i];
end;
if
Image.Picture.Bitmap.PixelFormat=pf24bit then

begin

for i:=0 to Image.Height-1 do

begin

pixelPointer:=Image.Picture.Bitmap.ScanLine[i];

for j:=0 to Image.Width-1 do

begin

Inc(HistogramBlue[pixelPointer[3*j]]);

Inc(HistogramGreen[pixelPointer[3*j+1]]);

Inc(HistogramRed[pixelPointer[3*j+2]]);

end;

end;

for i:=0 to 255 do

begin

if HistogramRed[i]>MaxCount then

MaxCount:=HistogramRed[i];

if HistogramGreen[i]>MaxCount then

MaxCount:=HistogramGreen[i];

if
HistogramBlue[i]>MaxCount then

MaxCount:=HistogramBlue[i];

end;
end;
Canvas.MoveTo(10, 160);

Canvas.Pen.Color:=clBlack;

for
i:=0 to 255 do

Canvas.LineTo(10+i,
160-round(150*HistogramGray[i]/MaxCount));
Canvas.Pen.Color:=clRed;

Canvas.MoveTo(10, 160);

for
i:=0 to 255 do

Canvas.LineTo(10+i,
160-(round(150*HistogramRed[i]/MaxCount)));
Canvas.Pen.Color:=clGreen;

Canvas.MoveTo(10, 160);

for
i:=0 to 255 do

Canvas.LineTo(10+i,
160-(round(150*HistogramGreen[i]/MaxCount)));
Canvas.Pen.Color:=clBlue;

Canvas.MoveTo(10, 160);
for i:=0 to 255 do
Canvas.LineTo(10+i,
160-(round(150*HistogramBlue[i]/MaxCount)));
end
;

except

Free;

ShowMessage('Operation is not completed');

end
;

end
;

dan koding di bawah ini untuk memberi warna pada histogram.

procedure
THistogramForm.FormPaint(Sender: TObject);

var

i:integer;
begin

Canvas.MoveTo(10, 160);
Canvas.Pen.Color:=clBlack;
for
i:=0 to 255 do
Canvas.LineTo(10+i,160-round(150*HistogramGray[i]/MaxCount));
Canvas.Pen.Color:=clRed;
Canvas.MoveTo(10, 160);
for
i:=0 to 255 do
Canvas.LineTo(10+i,160-(round(150*HistogramRed[i]/MaxCount)));
Canvas.Pen.Color:=clGreen;
Canvas.MoveTo(10, 160);
for
i:=0 to 255 do
Canvas.LineTo(10+i,160-(round(150*HistogramGreen[i]/MaxCount)));
Canvas.Pen.Color:=clBlue;
Canvas.MoveTo(10, 160);
for
i:=0 to 255 do
Canvas.LineTo(10+i,160-(round(150*HistogramBlue[i]/MaxCount)));

end
;

Koding secara keseluruhan seperti di bawah ini:

unit MainUnit;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ExtDlgs, Menus;

type
TMainForm = class(TForm)
MainMenu1: TMainMenu;
File1: TMenuItem;
Open1: TMenuItem;
Save1: TMenuItem;
CLose1: TMenuItem;
Exit1: TMenuItem;
OpenPictureDialog1: TOpenPictureDialog;
SavePictureDialog1: TSavePictureDialog;
StatusBar1: TStatusBar;
Image1: TMenuItem;
Histogram1: TMenuItem;
procedure Open1Click(Sender: TObject);
procedure Save1Click(Sender: TObject);
procedure Histogram1Click(Sender: TObject);
procedure CLose1Click(Sender: TObject);
procedure Exit1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
MainForm: TMainForm;

implementation

uses ImageUnit, ActiveX, HistogramUnit;

{$R *.dfm}

procedure TMainForm.Open1Click(Sender: TObject);
var
formatInfo:string;
begin
if OpenPictureDialog1.Execute then
begin
Application.CreateForm(TImageForm, ImageForm);
ImageForm.Image1.Picture.LoadFromFile(
OpenPictureDialog1.FileName);
ImageForm.ClientHeight:=
ImageForm.Image1.Picture.Height;
ImageForm.ClientWidth:=
ImageForm.Image1.Picture.Width;
case (ImageForm.Image1.Picture.Bitmap.PixelFormat) of
pf1bit : formatInfo:='Binary';
pf8bit : formatInfo:='Gray scale';
pf24bit: formatInfo:='True color';
end;
StatusBar1.SimpleText:= OpenPictureDialog1.FileName +' '+
IntToStr(ImageForm.Image1.Picture.Width) + 'x'+
IntToStr(ImageForm.Image1.Picture.Height) + ' '+
formatInfo;
end;
end;

procedure TMainForm.Save1Click(Sender: TObject);
begin
try
begin
if SavePictureDialog1.Execute then
TImageForm(ActiveMDIChild).Image1.Picture.SaveToFile(
SavePictureDialog1.FileName);
end
except
ShowMessage('Cannot complete the operation');
end;
end;

procedure TMainForm.Histogram1Click(Sender: TObject);
begin
if ImageForm<>nil then
begin
ImageForm:=TImageForm(ActiveMDIChild);
try
begin
Application.CreateForm(THistogramForm,HistogramForm);
HistogramForm.ShowHistogram(ImageForm.Image1);
end;
except
HistogramForm.Free;
ShowMessage('Cannot complete the operation');
end;
end;
end;

procedure TMainForm.CLose1Click(Sender: TObject);
begin
try
ActiveMDIChild.Close;
except
ShowMessage('Cannot complete the operation');
end;
end;

procedure TMainForm.Exit1Click(Sender: TObject);
begin
Close;
end;

initialization
OleInitialize(nil);
finalization
OleUninitialize
end.

Selanjutnya jalankan program. Hasil program tampak pada gambar di bawah ini.

Hasil untuk gambar berwarna :
dilihat dari grafik, gambar tegolong normal brightness dan high contrast












Hasil untuk gamabar grayscale :
dilihat dari grafik, gambar cenderung putih (terang).

Komentar

  1. coba gunakan citra hitam-putih, tunjukan dengan histogram dan buktikan bahwa citra tersebut benar-benar berwarna hitam dan putih

    BalasHapus
  2. tenkyu mas bro salam dari kampus UPI

    BalasHapus
    Balasan
    1. sama-sama gan.
      semoga bermanfaat.
      :D
      salam dari STMIK DB Surakarta.

      Hapus
  3. Thanks Gan, membantu sekali tutorial nya :D

    BalasHapus

Posting Komentar

Postingan Populer