Kemudian tambahkan 2 Memo pada Form, kemudian properties ScrollBars pilih ssBoth. Kemudian tambahkan MainMenu pada form
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtDlgs, StdCtrls, ExtCtrls, ComCtrls, Menus; type
TFormHistogramCut = classTForm Image1: TImage;
Image2: TImage; btOpen: TButton;
OpenPictureDialog1: TOpenPictureDialog; btHistogramCut: TButton;
ProgressBar1: TProgressBar; btExit: TButton;
EditHistogramCut: TEdit; Label1: TLabel;
MainMenu1: TMainMenu; File1: TMenuItem;
MenampilkanNilaiIntensitasPixelAwal1: TMenuItem; MenampilkanNilaiIntensitasPixelHasil1: TMenuItem;
Memo1: TMemo; Memo2: TMemo;
procedure btOpenClickSender: TObject; procedure btHistogramCutClickSender: TObject;
procedure btExitClickSender: TObject; procedure MenampilkanNilaiIntensitasPixelAwal1ClickSender: TObject;
procedure MenampilkanNilaiIntensitasPixelHasil1ClickSender: TObject; private
{ Private declarations } public
{ Public declarations } end;
var FormHistogramCut: TFormHistogramCut;
FileNameImg: string; implementation
{R .dfm} uses
UnitImageProses; procedure TFormHistogramCut.btOpenClickSender: TObject;
begin if OpenPictureDialog1.Execute then
begin FileNameImg := OpenPictureDialog1.FileName;
Caption := Histogram Cut : + OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile OpenPictureDialog1.FileName;
Image2.Visible := False; end;
end; procedure TFormHistogramCut.btHistogramCutClickSender: TObject;
var thres:real; n:integer;
begin Image2.Visible := True;
Image2.Picture.Graphic := Image1.Picture.Graphic; n:= StrToIntDefEditHistogramCut.Text,5;
ImgHistogramCut Image2, n, ProgressBar1; end;
procedure TFormHistogramCut.btExitClickSender: TObject; begin
FormHistogramCut.Close; end;
procedure TFormHistogramCut.MenampilkanNilaiIntensitasPixelAwal1Click Sender: TObject;
var F : TextFile;
AgungFile: String; temp : PByteArray;
i,j : integer; gambar :TBitmap;
begin AgungFile:=nilai intensitas pixel awal.txt;
AssignFileF,AgungFile; gambar:=TBitmap.Create;
gambar:=image1.Picture.Bitmap; rewriteF;
writelnF,Matrik dirancang oleh Agung Gunawan; memo1.Clear;
for j:=0 to gambar.Height-1 do begin
temp:=gambar.ScanLine[j]; i:=0;
repeat writeF,inttostrtemp[i]+ ;
i:=i+1; until i =3gambar.Width-1;
end; closeFileF;
memo1.Lines.LoadFromFileAgungFile; image1.Picture.Bitmap:=gambar;
end; procedure TFormHistogramCut.MenampilkanNilaiIntensitasPixelHasil1Click
Sender: TObject; var
F2 : TextFile; AgungFile2: String;
temp : PByteArray;
i,j : integer; gambar2 :TBitmap;
begin AgungFile2:=nilai intensitas pixel hasil.txt;
AssignFileF2,AgungFile2; gambar2:=TBitmap.Create;
gambar2:=image2.Picture.Bitmap; rewriteF2;
writelnF2,Matrik dirancang oleh Agung BALI; memo2.Clear;
for j:=0 to gambar2.Height-1 do begin
temp:=gambar2.ScanLine[j]; i:=0;
repeat writeF2,inttostrtemp[i]+ ;
i:=i+1; until i =3gambar2.Width-1;
end; closeFileF2;
memo2.Lines.LoadFromFileAgungFile2; image2.Picture.Bitmap:=gambar2;
end; end.
unit UnitImageProses; interface
uses WINPROCS, Graphics, ExtCtrls, ComCtrls, Variants;
type TFreqHist = array [0..255] of longint;
TMatrixFilter = array [1..16,1..16] of real; function RgbToGray Clr:TColor : byte;
function ImgGetGray var Image:TImage; x,y:integer : byte; procedure ImgConvertToGrayscale var Image1:TImage; var ProgressBar1:
TProgressBar; procedure ImgHistogramCut var Image:TImage; nRepeat:integer; var
ProgressBar1: TProgressBar; implementation
const PercentR = 0.299;
PercentG = 0.587; PercentB = 0.114;
function ByteRange r:double : byte; begin
if r0 then ByteRange:=0 else if r255 then ByteRange:=255
else ByteRange:=Roundr; end;
function RgbToGray Clr:TColor : byte; var r,g,b:byte;
begin r := GetRValueClr;
g := GetGValueClr; b := GetBValueClr;
RgbToGray := ByteRange rPercentR + gPercentG + bPercentB; end;
function ImgGetGray var Image:TImage; x,y:integer : byte; begin
Result := RgbToGray Image.Canvas.Pixels[x,y]; end;
procedure ImgConvertToGrayscale var Image1:TImage; var ProgressBar1: TProgressBar;
var x,y:integer; ClrGray:byte; begin
ProgressBar1.Max := Image1.Width-1; ProgressBar1.Position := 0;
for x:=0 to Image1.Width-1 do begin
for y:=0 to Image1.Height-1 do begin
ClrGray := ImgGetGray Image1,x,y; Image1.Canvas.Pixels[x,y] := RGB ClrGray,ClrGray,ClrGray;
end; Image1.Repaint;
ProgressBar1.Position := x; end;
end; procedure ImgHistogramCut var Image:TImage; nRepeat:integer; var
ProgressBar1: TProgressBar; const
BLACK_THRES=2;
var x,y,i,counter:integer; clrGray,clrGrayMax:byte;
Freq: TFreqHist; TotFreq, ImgSize: longint;
thres: real; begin
ProgressBar1.Max := Image.Width-1; ProgressBar1.Position := 0;
for counter:=1 to nRepeat do begin
for i:=0 to 255 do Freq[i]:=0; ImgSize := 0;
clrGrayMax := 0; for x:=0 to Image.Width-1 do
for y:=0 to Image.Height-1 do begin
clrGray := ImgGetGray Image,x,y; Inc Freq[ClrGray];
if clrGrayBLACK_THRES then begin
IncImgSize; if clrGrayclrGrayMax then
clrGrayMax := clrGray; end;
end; { tentukan threshold }
TotFreq := 0; thres := 255;
for i:=255 downto 0 do begin
Inc TotFreq, Freq[i]; if TotFreqImgSize2 then
begin thres := i;
break; end;
end; { tuliskan pixel baru }
ProgressBar1.Position := 0; for x:=0 to Image.Width-1 do
begin for y:=0 to Image.Height-1 do
begin ClrGray := ImgGetGray Image,x,y;
if clrGraythres then Image.Canvas.Pixels[x,y] := RGB 0,0,0
else begin
clrGray := ByteRange clrGrayclrGrayMax255; Image.Canvas.Pixels[x,y] := RGB clrGray,clrGray,clrGray;
end; end;
ProgressBar1.Position := x; end;
end; Image.Repaint;
end; end.