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.
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
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:
gan bisa di share aplikasinya??
Posting Komentar