Pages

membuat histogram....

Ini coding untuk membuat histogram pengolahan citra dengan menggunakan delphi.... 


unit HistogramUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, TeEngine, Series, ExtCtrls, TeeProcs, Chart;

type
  THistogramForm = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormPaint(Sender: TObject);
  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;

var
  HistogramForm: THistogramForm;

implementation

{$R *.dfm}
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; //free the histogram form if an exception happens
  ShowMessage('Cannot complete the operation');
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;
end.


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.

hasil yang akan didapat untuk coding diatas...



1 komentar:

Unknown
17 Desember 2015 pukul 08.16 comment-delete
Komentar ini telah dihapus oleh pengarang.

Posting Komentar