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.