Ekstraksi Fitur Haralick Menggunakan Citra Mikroskop Digital Trinocular Untuk Proses Identifikasi Cacing Penyakit Kaki Gajah

54

Lampiran 1
unit Unit1;
interface
uses
Windows,
Messages,
SysUtils,
Variants,
Graphics, Controls, Forms,
Dialogs, ExtDlgs, StdCtrls, ExtCtrls, Menus;

Classes,

type
TForm1 = class(TForm)
Image2: TImage;
OpenPictureDialog1: TOpenPictureDialog;
GroupBox2: TGroupBox;
Edit1: TEdit;

Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
MainMenu1: TMainMenu;
File1: TMenuItem;
OpenCitra1: TMenuItem;
Proses1: TMenuItem;
Grayscale1: TMenuItem;
DeteksiTepi1: TMenuItem;
Morfologi1: TMenuItem;
Dilation1: TMenuItem;
Erosion1: TMenuItem;
Methode1: TMenuItem;
LaplaceTwoSide1: TMenuItem;
FeatureHaralick1: TMenuItem;
Lokalisir1: TMenuItem;
Blocking1: TMenuItem;
GroupBox1: TGroupBox;
Image1: TImage;

Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;

Universitas Sumatera Utara

55

GroupBox3: TGroupBox;
Button13: TButton;
Memo1: TMemo;
procedure OpenCitra1Click(Sender: TObject);
procedure Grayscale1Click(Sender: TObject);
procedure DeteksiTepi1Click(Sender: TObject);
procedure Dilation1Click(Sender: TObject);
procedure Erosion1Click(Sender: TObject);
procedure Blocking1Click(Sender: TObject);
procedure Button13Click(Sender: TObject);

procedure LaplaceTwoSide1Click(Sender: TObject);
procedure FeatureHaralick1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
gambar, source
: TBitmap;
//tanda,tanda2
: string;
koeffilter
: array[0..8,0..8]of real;
old,new
: tbitmap;
size
: byte;
t_r_h

: byte;
nm
: string;
fille
: textfile;
glaptwoside
: tbitmap;
lapTwoSide_temp
: array [0..10000,0..10000] of
byte;
m0,m45,m90,m135,mkum : array [0..255, 0..255] of real;
tampungbit
: array [0..300, 0..300] of byte;
energi,contras,entropi,idm
: real;
implementation
{$R *.dfm}
procedure TForm1.Blocking1Click(Sender: TObject);
var temp
: PByteArray;

i,j,k, d_sem
: integer;
x,cek
: byte;
cacing
: array [0..600, 0..600]
of byte;

Universitas Sumatera Utara

56

Fi
: Textfile;
NamaArsip
: String;
tampung_x, tampung_y
: array [0..600] of
integer;
begin

for j:=0 to 600 do
for i:=0 to 600 do cacing[j,i]:=0;
//---------------------------------gambar := TBitmap.Create;
gambar := image2.picture.Bitmap;
for j:=5 to gambar.Height-3 do
begin
temp := gambar.ScanLine[j];
i:=9;
repeat
if temp[i]>1 then
for cek:=0 to 2 do
begin
temp[i+cek]:=255;
cacing[j,i+cek]:=temp[i+cek];
end;
inc(i,3);
until i >= 3*(gambar.Width-3);
end;
//simpan data koordinat hasil cacing
NamaArsip:='cacing.txt';

AssignFile(Fi,NamaArsip);
rewrite(Fi);
for j:=5 to 600 do
for i:=9 to 600 do
if cacing[j,i]=255 then
writeln(Fi, inttostr(j) + ',' + inttostr(i) +
':=' + inttostr(cacing[j,i]) +' ')
else cacing[j,i]:=0;
closefile(Fi);
// Pengujian pada data cacing
k:=0;
for j:=5 to 600 do
for i:=9 to 600 do
if cacing[j,i]=255 then
begin

Universitas Sumatera Utara

57


tampung_x[k]:=i;
tampung_y[k]:=j;
k:=k+1;
end;
//urutkan data cacing x
for i:=0 to k-1 do
for j:=0 to k-1 do
if
tampung_x[i]=5) or (tampung_x[j]>=5) then
begin
d_sem:=tampung_x[j];
tampung_x[j]:=tampung_x[i];
tampung_x[i]:=d_sem;
end;

//if

//simpan data
NamaArsip:='x.txt';
AssignFile(Fi,NamaArsip);

rewrite(Fi);
for j:=0 to k-1 do
writeln(Fi, inttostr(tampung_x[j]) );
closefile(Fi);
//urutkan data cacing y
for i:=0 to k-1 do
for j:=0 to k-1 do
if tampung_y[i]255 then sum:=255;
if sum=3*(gambar.Width-2);
end;
Image2.Picture.bitmap := gambar;
Image.free;
end;
procedure TForm1.Dilation1Click(Sender: TObject);
var temp:array of array of byte;
baris:pbytearray;
x,y,smax,s,t:smallint;
destination:tbitmap;
begin
size:=3;

koeffilter[0,0]:=1;
koeffilter[0,1]:=1;
koeffilter[0,2]:=1;
koeffilter[1,0]:=1;
koeffilter[1,1]:=1;
koeffilter[1,2]:=1;
koeffilter[2,0]:=1;
koeffilter[2,1]:=1;
koeffilter[2,2]:=1;
//
old:=geoper(dilation,old);
//---------------------------------source := tbitmap.Create;
source.Assign(gambar);
//---------------------------------destination:=tbitmap.Create;
destination.Assign(source);
setlength(temp,3*source.Width,source.Height);
for y:=0 to source.Height-1 do
begin
baris:=source.ScanLine[y];
for x:=0 to 3*(source.Width-1) do

temp[x,y]:=baris[x];
end;

Universitas Sumatera Utara

61

for y:=0 to destination.Height-1 do
begin
baris:=destination.ScanLine[y];
for x:=0 to 3*(destination.Width-1) do
begin
s:=0;
{if kode=dilation then} smax:=0;
//else smax:=255;
repeat
t:=0;
repeat
if
((1+x+s3*size
div
2
)>=0)and((y+t-size div 2)>=0)
and
((1+x+s3*size
div
2
)=size;
inc(s,3)
until s>=3*size;
baris[x]:=smax;
end;
end;
//result:=destination;
Image2.Picture.bitmap := destination;
end;

Universitas Sumatera Utara

62

procedure TForm1.Erosion1Click(Sender: TObject);
var temp:array of array of byte;
tm : pbytearray;
baris:pbytearray;
x,y,smax,s,t:smallint;
destination:tbitmap;
i,j,cek : integer;
begin
gambar := TBitmap.Create;
gambar := image2.picture.Bitmap;
for j:=5 to gambar.Height-3 do
begin
tm := gambar.ScanLine[j];
i:=9;
repeat
if tm[i]>1 then
for cek:=0 to 2 do
begin
tm[i+cek]:=255;
//cacing[j,i+cek]:=temp[i+cek];
end;
inc(i,3);
until i >= 3*(gambar.Width-3);
end;
size:=3;
koeffilter[0,0]:=1;
koeffilter[0,1]:=1;
koeffilter[0,2]:=1;
koeffilter[1,0]:=1;
koeffilter[1,1]:=1;
koeffilter[1,2]:=1;
koeffilter[2,0]:=1;
koeffilter[2,1]:=1;
koeffilter[2,2]:=1;
//
old:=geoper(dilation,old);
//---------------------------------source := tbitmap.Create;
source.Assign(gambar);
//---------------------------------destination:=tbitmap.Create;
destination.Assign(source);
setlength(temp,3*source.Width,source.Height);

Universitas Sumatera Utara

63

for y:=0 to source.Height-1 do
begin
baris:=source.ScanLine[y];
for x:=0 to 3*(source.Width-1) do
temp[x,y]:=baris[x];
end;
for y:=0 to destination.Height-1 do
begin
baris:=destination.ScanLine[y];
for x:=0 to 3*(destination.Width-1) do
begin
s:=0;
{if kode=dilation then} smax:=255;
//else smax:=255;
repeat
t:=0;
repeat
if
((1+x+s3*size
div
2
)>=0)and((y+t-size div 2)>=0)
and
((1+x+s3*size
div
2
)=3*size;

Universitas Sumatera Utara

64

baris[x]:=smax;
end;
end;
//result:=destination;
Image2.Picture.bitmap := destination;
end;
procedure TForm1.FeatureHaralick1Click(Sender: TObject);
var j,f : integer;
begin
for j := 0 to 255 do
for f := 0 to 255 do
begin
end;
//============ Start M0
for j:=0 to gambar.Height-1 do
for f:=0 to gambar.Width-1 do
begin
m0[tampungbit[j,f],tampungbit[j,f+1]]:=m0[tampungbit[j,f]
,tampungbit[j,f+1]]+1;
m0[tampungbit[j,f+1],tampungbit[j,f]]:=m0[tampungbit[j,f]
,tampungbit[j,f+1]];
end;
//simpam matrik kookurensi 0 derajat
nm:='m0.txt';
AssignFile(fille,nm);
rewrite(fille);
//--------------------------------------------for j:=0 to 255 do
begin
for f:=0 to 255 do
begin
write(fille, floattostr(m0[j,f])+' ');
end;
writeln(fille);
end;
closefile(fille);

Universitas Sumatera Utara

65

//============ End M0
//============ Start M45
for j:=1 to gambar.Height-1 do
for f:=0 to gambar.Width-1 do
begin
m45[tampungbit[j,f],tampungbit[j1,f+1]]:=m45[tampungbit[j,f],tampungbit[j-1,f+1]]+1;
m45[tampungbit[j1,f+1],tampungbit[j,f]]:=m45[tampungbit[j,f],tampungbit[j
-1,f+1]];
end;
//simpam matrik kookurensi 45 derajat
nm:='m45.txt';
AssignFile(fille,nm);
rewrite(fille);
//--------------------------------------------for j:=0 to 255 do
begin
for f:=0 to 255 do
begin
write(fille, floattostr(m45[j,f])+' ');
end;
writeln(fille);
end;
closefile(fille);
//============ End M45
//============ Start M90
for j:=1 to gambar.Height-1 do
for f:=0 to gambar.Width-1 do
begin
m90[tampungbit[j,f],tampungbit[j1,f]]:=m90[tampungbit[j,f],tampungbit[j-1,f]]+1;
m90[tampungbit[j1,f],tampungbit[j,f]]:=m90[tampungbit[j,f],tampungbit[j1,f]];
end;
//simpam matrik kookurensi 90 derajat
nm:='m90.txt';
AssignFile(fille,nm);

Universitas Sumatera Utara

66

rewrite(fille);
//--------------------------------------------for j:=0 to 255 do
begin
for f:=0 to 255 do
begin
write(fille, floattostr(m90[j,f])+' ');
end;
writeln(fille);
end;
closefile(fille);
//============ End M90
//============ Start M135
for j:=1 to gambar.Height-1 do
for f:=1 to gambar.Width-1 do
begin
m135[tampungbit[j,f],tampungbit[j-1,f1]]:=m135[tampungbit[j,f],tampungbit[j-1,f-1]]+1;
m135[tampungbit[j-1,f1],tampungbit[j,f]]:=m135[tampungbit[j,f],tampungbit[j1,f-1]];
end;
//simpam matrik kookurensi 135 derajat
nm:='m135.txt';
AssignFile(fille,nm);
rewrite(fille);
//--------------------------------------------for j:=0 to 255 do
begin
for f:=0 to 255 do
begin
write(fille, floattostr(m135[j,f])+' ');
end;
writeln(fille);
end;
closefile(fille);
//============ End M135
nm:='mkum.txt';
AssignFile(fille,nm);
rewrite(fille);

Universitas Sumatera Utara

67

//--------------------------------------------for j:=0 to gambar.Height-1 do
begin
for f:=0 to gambar.Width-1 do
begin
mkum[j,f]:=(m0[j,f]+m45[j,f]+m90[j,f]+m135[j,f])/4;
write(fille, floattostr(mkum[j,f])+' ');
end;
writeln(fille);
end;
closefile(fille);
//================================
energi := 0;
contras := 0;
entropi := 0;
idm := 0;
for j:=0 to 255 do
for f:=0 to 255 do
begin
// hitung ENERGI - ANGULAR SECOND MOMENT
energi:=energi+mkum[j,f];
// ukuran penyebaran (momen inersia) elemenelemen matriks citra
contras:=contras+((sqr(f-j)*mkum[j,f]));
// ukuran ketidakteraturan bentuk
if mkum[j,f]0 then
entropi:=entropi+(1*(mkum[j,f]*(ln(mkum[j,f]))));
// Inverse Different Moment --> Menunjukkan
kehomogenan citra yang berderajat keabuan sejenis
idm:=idm+((mkum[j,f])*(1+sqr(j-f)));
end;
edit2.Text:=floattostr(energi);
edit3.Text:=floattostr(contras);
edit4.Text:=floattostr(entropi);
edit5.Text:=floattostr(idm);
end;
procedure TForm1.Grayscale1Click(Sender: TObject);

Universitas Sumatera Utara

68

var temp
i,j,f
x,cek
begin
gambar

: PByteArray;
: integer;
: byte;
:= TBitmap.Create;

gambar.LoadFromFile(OpenPictureDialog1.filename);
//Form1.Caption:='Image
Processing
'+ExtractFileName(OpenPictureDialog1.Filename);
if
gambar.PixelFormat

gambar.PixelFormat := Pf24bit;
Image2.Picture.Bitmap := gambar;

pf24bit

then

for j:=0 to gambar.Height-1 do
begin
temp := gambar.ScanLine[j];
i:=0; f:=0;
repeat
x
:=round((0.11*temp[i])+(0.59*temp[i+1])+(0.3*temp[i+2]));
tampungbit[j,f]:=x;
for cek:=0 to 2 do
temp[i+cek]:=x;
inc(i,3);
inc(f,1);
until i >= 3*gambar.Width-1;
end;
Image2.Picture.Bitmap := gambar;
end;
procedure TForm1.LaplaceTwoSide1Click(Sender: TObject);
var temp
: PByteArray;
i,j
: integer;
x
: byte;
c_s, c_t, s, t : integer;
total_lapTwoSide, energi_lapTwoSide, lapTwoSide
:
real;
fii
: textfile;
arsip : string;
begin

Universitas Sumatera Utara

69

//memo1.Clear;
glapTwoSide := tbitmap.Create;
glapTwoSide.assign(image1.Picture.Bitmap);
if glapTwoSide.PixelFormat pf24bit then
glapTwoSide.PixelFormat := pf24bit;
c_s:=0;
for j := 0 to glapTwoSide.Height -1 do
begin
temp := glapTwoSide.ScanLine[j];
i := 0;
c_t:=0;
repeat
lapTwoSide_temp[c_t,c_s]:=temp[i];
c_t:=c_t+1;
inc(i,3);
until i >= 3*glapTwoSide.Width -1;
c_s:=c_s+1;
end;
//transformasi lapTwoSide
arsip := 'lts.txt';
AssignFile(fii,arsip);
rewrite(fii);
total_lapTwoSide:=0;
for s:=1 to c_s do
for t:=1 to c_t do
begin
lapTwoSide := exp(-s*t) * lapTwoSide_temp[s,t];
total_lapTwoSide
:=
total_lapTwoSide
+
lapTwoSide;
writeln(fii,floattostr(lapTwoSide));
// memo1.Lines.Add(floattostr(lapTwoSide))
end;
//akhir lapTwoSide
energi_lapTwoSide:=total_lapTwoSide/(c_s*c_t);
edit1.Text := floattostr(energi_lapTwoSide);
closefile(fii);
memo1.Lines.LoadFromFile(arsip);

Universitas Sumatera Utara

70

end;
procedure TForm1.OpenCitra1Click(Sender: TObject);
begin
if not OpenPictureDialog1.Execute then exit else
begin
gambar := TBitmap.Create;
gambar.LoadFromFile(OpenPictureDialog1.filename);
end;
if
gambar.PixelFormat

pf24bit
then
gambar.PixelFormat := Pf24bit;
if (gambar.Height) AND (gambar.Width) < 200 then
Image1.Picture.Bitmap := gambar
else
showmessage('Ukuran gambar harus lebih kecil dari
200x200');
end;
end.

Universitas Sumatera Utara