Ilmu adalah hal yang terpenting dalam hidup, carilah ilmu dan amalkan ilmu yang kau dapat...

PROGRAM MENAMPILKAN IMAGE DAN HISTOGRAM DENGAN DELPHI

Histogram adalah representasi grafis untuk distribusi warna dari citra digital. Sumbu ordinat vertikal merupakan representasi piksel dengan nilai tonal dari tiap-tiap deret bin pada sumbu axis horizontalnya. Sumbu axis terdiri dari deret logaritmik bin densitometry yang membentuk rentang luminasi atau exposure range yang mendekati respon spectral sensitivity visual mata manusia. Deret bin pada density yang terpadat mempunyai interval yang relatif sangat linear dengan variabel mid-tone terletak tepat di tengahnya.
Pada histogram fotografis, grafis batang tidak mempunyai luasan yang menunjukkan jumlah piksel pada tiap bin. Grafis batang menjadi grafis garis vertikal yang mewakili seluruh jumlah piksel pada deret bin luminasi tersebut. Sebagai contoh, sebuah foto ukuran 4288x2848 piksel yang mempunyai 1 tone akan mempunyai histogram dengan 1 garis lurus vertikal pada nilai bin luminasinya, bukan berupa 12,212,224 garis vertikal yang mempunyai panjang sama.
Untuk membuat program histogram dengan cara sebagai berikut :

Terdiri dari 3 form : MainForm, HistogramForm, ImageForm. 

1. Membuat MainForm
Terdiri dari MainMenu1 yang isinya Fale1 yang didalamnya terdapat Open1, Close1, Exit1, Histogram1 dan Diluar Image1, dan terdiri dari OpenPictureDialog1.











Yang menghasilkan form seperti di bawah ini







Dengan source code :

- Pada TMainForm.Open1:
   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;
  end;
  end;


- Pada TMainForm.CLose1
  procedure procedure TMainForm.CLose1Click(Sender: TObject);
  begin
  try
   ActiveMDIChild.Close;
  except
   ShowMessage('Gambar Belum Terbuka');
  end;
  end;


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


- Pada TMainForm.Histogram1
  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;

- Pada TMainForm.Image1
  procedure TMainForm.Image1Click(Sender: TObject);
  begin
   ShowMessage('Maaf Aplikasi Belum Tersedia...')
  end;

  initialization //Public
  OleInitialize(nil);
  finalization
  OleUninitialize
  end.

  
2.  HistogramForm
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('Gambar Terlalu Besar');
end;
end;

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

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;




3. ImageForm
      Terdiri dari Image1 
Source code pada ImageForm.FormClos :
   procedure TImageForm.FormClose(Sender: TObject; var Action: TCloseAction);
   begin
     Free;
   end;



 HASIL APLIKASI


 

1 komentar:

Posting Komentar