Letakkan disebelah kiri edit, ganti captionnya dengan nama Cut. Simpan program dengan cara file save all.
procedure btHistogramCutClickSender: TObject; procedure btExitClickSender: 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; 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;