38. Hasilnya sebagai berikut.
Gambar 5.20 Hasil SaveUnitImageProses
39. Ketik program berikut ke dalam UnitImageProses.
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 clrGray=thres 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;