unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtDlgs, Menus, StdCtrls, ExtCtrls, Spin;
type
TRGBTripleArray = array[0..10000] of TRGBTriple;
PRGBTripleArray = ^TRGBTripleArray;
T3x3FloatArray = array[0..2] of array[0..2] of Extended;
TDeteksi = class(TForm)
Image1: TImage;
Label1: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
ComboBox1: TComboBox;
Edit10: TEdit;
Button1: TButton;
MainMenu1: TMainMenu;
File1: TMenuItem;
Open1: TMenuItem;
SaveAs1: TMenuItem;
Save1: TMenuItem;
N1: TMenuItem;
Exit1: TMenuItem;
Edit11: TMenuItem;
Undo1: TMenuItem;
Reset1: TMenuItem;
OpenPictureDialog1: TOpenPictureDialog;
SavePictureDialog1: TSavePictureDialog;
procedure Open1Click(Sender: TObject);
procedure EditChange(Sender : TObject);
procedure Exit1Click(Sender: TObject);
procedure SaveAs1Click(Sender: TObject);
procedure Save1Click(Sender: TObject);
procedure Undo1Click(Sender: TObject);
procedure Reset1Click(Sender: TObject);
procedure Edit9Change(Sender: TObject);
procedure Edit8Change(Sender: TObject);
procedure Edit7Change(Sender: TObject);
procedure Edit6Change(Sender: TObject);
procedure Edit5Change(Sender: TObject);
procedure Edit4Change(Sender: TObject);
procedure Edit3Change(Sender: TObject);
procedure Edit2Change(Sender: TObject);
procedure Edit10Change(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ComboBox1Select(Sender: TObject);
procedure SetMask(a1, a2, a3, a4, a5, a6, a7, a8, a9 : Extended ; ABias : integer);
function Convolve(ABitmap : TBitmap ; AMask : T3x3FloatArray ; ABias : integer) : TBitmap;
private
Mask : T3x3FloatArray;
Bias : integer;
UndoBitmap : TBitmap;
{ Private declarations }
public
{ Public declarations }
end;
var
Deteksi: TDeteksi;
implementation
{$R *.dfm}
procedure TDeteksi.EditChange(Sender : TObject);
Var
LTag : byte;
LValue : Extended;
begin
LTag := TEdit(Sender).Tag;
if (TEdit(Sender).Text = '') or (TEdit(Sender).Text = '-')
then LValue := 0
else LValue := StrToFloat(TEdit(Sender).Text);
if LTag = 9 then begin
if (LValue > 255) or (Frac(LValue) <> 0) then begin
ShowMessage('the bias has to be a whole number between -255 and 255');
Exit;
end;
Bias := trunc(LValue);
Exit;
end;
Mask[LTag mod 3, LTag div 3] := LValue;
end;
procedure TDeteksi.SetMask(a1, a2, a3, a4, a5, a6, a7, a8, a9 : Extended ; ABias : integer);
begin
Edit1.Text := FloatToStr(a1);
Edit2.Text := FloatToStr(a2);
Edit3.Text := FloatToStr(a3);
Edit4.Text := FloatToStr(a4);
Edit5.Text := FloatToStr(a5);
Edit6.Text := FloatToStr(a6);
Edit7.Text := FloatToStr(a7);
Edit8.Text := FloatToStr(a8);
Edit9.Text := FloatToStr(a9);
Edit10.Text := IntToStr(ABias);
end;
procedure TDeteksi.Open1Click(Sender: TObject);
begin
if not OpenPictureDialog1.Execute then Exit;
Image1.Picture.Bitmap.LoadFromFile(OpenPictureDialog1.FileName);
SaveAs1.Enabled := True;
Save1.Enabled := True;
Reset1.Enabled := True;
end;
procedure TDeteksi.Exit1Click(Sender: TObject);
begin
Close;
end;
procedure TDeteksi.SaveAs1Click(Sender: TObject);
begin
if not SavePictureDialog1.Execute then Exit;
Image1.Picture.Bitmap.SaveToFile(SavePictureDialog1.FileName);
end;
procedure TDeteksi.Save1Click(Sender: TObject);
begin
Image1.Picture.Bitmap.SaveToFile(OpenPictureDialog1.FileName);
end;
procedure TDeteksi.Undo1Click(Sender: TObject);
begin
Image1.Picture.Bitmap.Width := UndoBitmap.Width;
Image1.Picture.Bitmap.Height := UndoBitmap.Height;
Image1.Canvas.Draw(0, 0, UndoBitmap);
Undo1.Enabled := False;
end;
procedure TDeteksi.Reset1Click(Sender: TObject);
begin
Image1.Picture.Bitmap.LoadFromFile(OpenPictureDialog1.FileName);
end;
procedure TDeteksi.Edit9Change(Sender: TObject);
Var
LTag : byte;
LValue : Extended;
begin
LTag := TEdit(Sender).Tag;
if (TEdit(Sender).Text = '') or (TEdit(Sender).Text = '-')
then LValue := 0
else LValue := StrToFloat(TEdit(Sender).Text);
if LTag = 9 then begin
if (LValue > 255) or (Frac(LValue) <> 0) then begin
ShowMessage('the bias has to be a whole number between -255 and 255');
Exit;
end;
Bias := trunc(LValue);
Exit;
end;
Mask[LTag mod 3, LTag div 3] := LValue;
end;
procedure TDeteksi.Edit8Change(Sender: TObject);
Var
LTag : byte;
LValue : Extended;
begin
LTag := TEdit(Sender).Tag;
if (TEdit(Sender).Text = '') or (TEdit(Sender).Text = '-')
then LValue := 0
else LValue := StrToFloat(TEdit(Sender).Text);
if LTag = 9 then begin
if (LValue > 255) or (Frac(LValue) <> 0) then begin
ShowMessage('the bias has to be a whole number between -255 and 255');
Exit;
end;
Bias := trunc(LValue);
Exit;
end;
Mask[LTag mod 3, LTag div 3] := LValue;
end;
procedure TDeteksi.Edit7Change(Sender: TObject);
Var
LTag : byte;
LValue : Extended;
begin
LTag := TEdit(Sender).Tag;
if (TEdit(Sender).Text = '') or (TEdit(Sender).Text = '-')
then LValue := 0
else LValue := StrToFloat(TEdit(Sender).Text);
if LTag = 9 then begin
if (LValue > 255) or (Frac(LValue) <> 0) then begin
ShowMessage('the bias has to be a whole number between -255 and 255');
Exit;
end;
Bias := trunc(LValue);
Exit;
end;
Mask[LTag mod 3, LTag div 3] := LValue;
end;
procedure TDeteksi.Edit6Change(Sender: TObject);
Var
LTag : byte;
LValue : Extended;
begin
LTag := TEdit(Sender).Tag;
if (TEdit(Sender).Text = '') or (TEdit(Sender).Text = '-')
then LValue := 0
else LValue := StrToFloat(TEdit(Sender).Text);
if LTag = 9 then begin
if (LValue > 255) or (Frac(LValue) <> 0) then begin
ShowMessage('the bias has to be a whole number between -255 and 255');
Exit;
end;
Bias := trunc(LValue);
Exit;
end;
Mask[LTag mod 3, LTag div 3] := LValue;
end;
procedure TDeteksi.Edit5Change(Sender: TObject);
Var
LTag : byte;
LValue : Extended;
begin
LTag := TEdit(Sender).Tag;
if (TEdit(Sender).Text = '') or (TEdit(Sender).Text = '-')
then LValue := 0
else LValue := StrToFloat(TEdit(Sender).Text);
if LTag = 9 then begin
if (LValue > 255) or (Frac(LValue) <> 0) then begin
ShowMessage('the bias has to be a whole number between -255 and 255');
Exit;
end;
Bias := trunc(LValue);
Exit;
end;
Mask[LTag mod 3, LTag div 3] := LValue;
end;
procedure TDeteksi.Edit4Change(Sender: TObject);
Var
LTag : byte;
LValue : Extended;
begin
LTag := TEdit(Sender).Tag;
if (TEdit(Sender).Text = '') or (TEdit(Sender).Text = '-')
then LValue := 0
else LValue := StrToFloat(TEdit(Sender).Text);
if LTag = 9 then begin
if (LValue > 255) or (Frac(LValue) <> 0) then begin
ShowMessage('the bias has to be a whole number between -255 and 255');
Exit;
end;
Bias := trunc(LValue);
Exit;
end;
Mask[LTag mod 3, LTag div 3] := LValue;
end;
procedure TDeteksi.Edit3Change(Sender: TObject);
Var
LTag : byte;
LValue : Extended;
begin
LTag := TEdit(Sender).Tag;
if (TEdit(Sender).Text = '') or (TEdit(Sender).Text = '-')
then LValue := 0
else LValue := StrToFloat(TEdit(Sender).Text);
if LTag = 9 then begin
if (LValue > 255) or (Frac(LValue) <> 0) then begin
ShowMessage('the bias has to be a whole number between -255 and 255');
Exit;
end;
Bias := trunc(LValue);
Exit;
end;
Mask[LTag mod 3, LTag div 3] := LValue;
end;
procedure TDeteksi.Edit2Change(Sender: TObject);
Var
LTag : byte;
LValue : Extended;
begin
LTag := TEdit(Sender).Tag;
if (TEdit(Sender).Text = '') or (TEdit(Sender).Text = '-')
then LValue := 0
else LValue := StrToFloat(TEdit(Sender).Text);
if LTag = 9 then begin
if (LValue > 255) or (Frac(LValue) <> 0) then begin
ShowMessage('the bias has to be a whole number between -255 and 255');
Exit;
end;
Bias := trunc(LValue);
Exit;
end;
Mask[LTag mod 3, LTag div 3] := LValue;
end;
procedure TDeteksi.Edit10Change(Sender: TObject);
Var
LTag : byte;
LValue : Extended;
begin
LTag := TEdit(Sender).Tag;
if (TEdit(Sender).Text = '') or (TEdit(Sender).Text = '-')
then LValue := 0
else LValue := StrToFloat(TEdit(Sender).Text);
if LTag = 9 then begin
if (LValue > 255) or (Frac(LValue) <> 0) then begin
ShowMessage('the bias has to be a whole number between -255 and 255');
Exit;
end;
Bias := trunc(LValue);
Exit;
end;
Mask[LTag mod 3, LTag div 3] := LValue;
end;
procedure TDeteksi.Edit1Change(Sender: TObject);
Var
LTag : byte;
LValue : Extended;
begin
LTag := TEdit(Sender).Tag;
if (TEdit(Sender).Text = '') or (TEdit(Sender).Text = '-')
then LValue := 0
else LValue := StrToFloat(TEdit(Sender).Text);
if LTag = 9 then begin
if (LValue > 255) or (Frac(LValue) <> 0) then begin
ShowMessage('the bias has to be a whole number between -255 and 255');
Exit;
end;
Bias := trunc(LValue);
Exit;
end;
Mask[LTag mod 3, LTag div 3] := LValue;
end;
procedure TDeteksi.Button1Click(Sender: TObject);
begin
if not Save1.Enabled then Exit;
if (Image1.Picture.Bitmap.Width < 3) or (Image1.Picture.Bitmap.Height < 3) then begin ShowMessage('the image is too small to perform convolution on'); Exit; end; UndoBitmap.Width := Image1.Picture.Bitmap.Width; UndoBitmap.Height := Image1.Picture.Bitmap.Height; UndoBitmap.Canvas.Draw(0, 0, Image1.Picture.Bitmap); Undo1.Enabled := True; Image1.Picture.Bitmap := Convolve(Image1.Picture.Bitmap, Mask, Bias); end; procedure TDeteksi.FormCreate(Sender: TObject); begin Edit1.Tag := 0; Edit2.Tag := 1; Edit3.Tag := 2; Edit4.Tag := 3; Edit5.Tag := 4; Edit6.Tag := 5; Edit7.Tag := 6; Edit8.Tag := 7; Edit9.Tag := 8; Edit10.Tag := 9; // bias SetMask(1, 1, 1, 1, 1, 1, 1, 1, 1, 0); UndoBitmap := TBitmap.Create; UndoBitmap.PixelFormat := pf24bit; end; procedure TDeteksi.ComboBox1Select(Sender: TObject); begin if ComboBox1.ItemIndex = 0 then // edge detection SetMask(-1, -1, -1, -1, 8, -1, -1, -1, -1, 0); if ComboBox1.ItemIndex = 1 then // vertical edge detection SetMask( 0, 0, 0, -1, 2, -1, 0, 0, 0, 0); if ComboBox1.ItemIndex = 2 then // horizontal edge detection SetMask( 0, -1, 0, 0, 2, 0, 0, -1, 0, 0); end; function TDeteksi.Convolve(ABitmap : TBitmap ; AMask : T3x3FloatArray ; ABias : integer) : TBitmap; Var LRow1, LRow2, LRow3, LRowOut : PRGBTripleArray; LRow, LCol : integer; LNewBlue, LNewGreen, LNewRed : Extended; LCoef : Extended; begin LCoef := 0; for LRow := 0 to 2 do for LCol := 0 to 2 do LCoef := LCoef + AMask[LCol, LRow]; if LCoef = 0 then LCoef := 1; Result := TBitmap.Create; Result.Width := ABitmap.Width - 2; Result.Height := ABitmap.Height - 2; Result.PixelFormat := pf24bit; LRow2 := ABitmap.ScanLine[0]; LRow3 := ABitmap.ScanLine[1]; for LRow := 1 to ABitmap.Height - 2 do begin LRow1 := LRow2; LRow2 := LRow3; LRow3 := ABitmap.ScanLine[LRow + 1]; LRowOut := Result.ScanLine[LRow - 1]; for LCol := 1 to ABitmap.Width - 2 do begin LNewBlue := (LRow1[LCol-1].rgbtBlue*AMask[0,0]) + (LRow1[LCol].rgbtBlue*AMask[1,0]) + (LRow1[LCol+1].rgbtBlue*AMask[2,0]) + (LRow2[LCol-1].rgbtBlue*AMask[0,1]) + (LRow2[LCol].rgbtBlue*AMask[1,1]) + (LRow2[LCol+1].rgbtBlue*AMask[2,1]) + (LRow3[LCol-1].rgbtBlue*AMask[0,2]) + (LRow3[LCol].rgbtBlue*AMask[1,2]) + (LRow3[LCol+1].rgbtBlue*AMask[2,2]); LNewBlue := (LNewBlue / LCoef) + ABias; if LNewBlue > 255 then LNewBlue := 255;
if LNewBlue < 0 then LNewBlue := 0; LNewGreen := (LRow1[LCol-1].rgbtGreen*AMask[0,0]) + (LRow1[LCol].rgbtGreen*AMask[1,0]) + (LRow1[LCol+1].rgbtGreen*AMask[2,0]) + (LRow2[LCol-1].rgbtGreen*AMask[0,1]) + (LRow2[LCol].rgbtGreen*AMask[1,1]) + (LRow2[LCol+1].rgbtGreen*AMask[2,1]) + (LRow3[LCol-1].rgbtGreen*AMask[0,2]) + (LRow3[LCol].rgbtGreen*AMask[1,2]) + (LRow3[LCol+1].rgbtGreen*AMask[2,2]); LNewGreen := (LNewGreen / LCoef) + ABias; if LNewGreen > 255 then LNewGreen := 255;
if LNewGreen < 0 then LNewGreen := 0; LNewRed := (LRow1[LCol-1].rgbtRed*AMask[0,0]) + (LRow1[LCol].rgbtRed*AMask[1,0]) + (LRow1[LCol+1].rgbtRed*AMask[2,0]) + (LRow2[LCol-1].rgbtRed*AMask[0,1]) + (LRow2[LCol].rgbtRed*AMask[1,1]) + (LRow2[LCol+1].rgbtRed*AMask[2,1]) + (LRow3[LCol-1].rgbtRed*AMask[0,2]) + (LRow3[LCol].rgbtRed*AMask[1,2]) + (LRow3[LCol+1].rgbtRed*AMask[2,2]); LNewRed := (LNewRed / LCoef) + ABias; if LNewRed > 255 then LNewRed := 255;
if LNewRed < 0 then LNewRed := 0; LRowOut[LCol-1].rgbtBlue := trunc(LNewBlue); LRowOut[LCol-1].rgbtGreen := trunc(LNewGreen); LRowOut[LCol-1].rgbtRed := trunc(LNewRed); end; end; end; end.
DETEKSI TEPI
Diposting oleh fath_friend
Langganan:
Posting Komentar (Atom)


0 komentar:
Posting Komentar