Modul Praktikum Pengolahan Citra Digital

31
MODUL PRAKTIKUM PENGOLAHAN CITRA DIGITAL (RESPONSI PENGOLAHAN CITRA DIGITAL) Tujuan Praktikum : 1. Memanggil dan menampilkan image 2. Menampilkan matriks pixel image 3. Mengkonvolusi image 4. Menampilkan histogram dari image awal dan image Grey Scale Pada praktikum pengolahan citra digital kali ini tools yang digunakan adalah Borland Delphi. Berikut ini adalah langkah- langkah yang dapat diikuti oleh mahasiswa untuk membuat program sederhana pengolahan citra digital. Tugas 1. Memanggil dan Menampilkan Image 1. Buatlah project dan form baru. Anda dapat memberi nama form tersebut dengan nama yang lain. Untuk praktikum kali ini saya sengaja tidak mengganti nama project, form dan unit. 2. Tujuan tugas pertama ini adalah membuat program untuk dapat memanggil dan menampilkan image. Oleh karena itu dibutuhkan komponen yang dapat digunakan untuk membuka file image, tambahkan komponen ‘OpenPictureDialog’.Pilih tab Dialog >> OpenPictureDialog

description

pcd

Transcript of Modul Praktikum Pengolahan Citra Digital

MODUL PRAKTIKUM PENGOLAHAN CITRA DIGITAL(RESPONSI PENGOLAHAN CITRA DIGITAL)

Tujuan Praktikum :1. Memanggil dan menampilkan image2. Menampilkan matriks pixel image3. Mengkonvolusi image4. Menampilkan histogram dari image awal dan image Grey Scale

Pada praktikum pengolahan citra digital kali ini tools yang digunakan adalah Borland Delphi. Berikut ini adalah langkah-langkah yang dapat diikuti oleh mahasiswa untuk membuat program sederhana pengolahan citra digital.

Tugas 1. Memanggil dan Menampilkan Image 1. Buatlah project dan form baru. Anda dapat memberi nama form tersebut dengan nama yang lain. Untuk praktikum kali ini saya sengaja tidak mengganti nama project, form dan unit. 2. Tujuan tugas pertama ini adalah membuat program untuk dapat memanggil dan menampilkan image. Oleh karena itu dibutuhkan komponen yang dapat digunakan untuk membuka file image, tambahkan komponen OpenPictureDialog.Pilih tab Dialog >> OpenPictureDialog

3. Tambahkan image pada untuk menampilkan gambar yang akan dipanggil dengan memilih tab Additional >> Image

4. Pada object inspector, properties image pilih Strech =True5. Tambahkan button, pada caption berikan nama Open, ganti nama menjadi btn_open6. Klik dua kali pada button Open dan ketikkan source code berikut ini :if not OpenPictureDialog1.Execute then exit else begin gambar := TBitmap.Create; gambar.LoadFromFile(OpenPictureDialog1.filename); Form1.Caption:='Image Processing - '+ ExtractFileName(OpenPictureDialog1.Filename); end; Image1.Picture.Bitmap := gambar;

7. Pada variabel public tambahkan Vargambar:TBitmap;8. Adapun listing program keseluruhan adalah sebagai berikut:unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ExtDlgs;

type TForm1 = class(TForm) OpenPictureDialog1: TOpenPictureDialog; Panel1: TPanel; Image1: TImage; btn_open: TButton; procedure btn_openClick(Sender: TObject); private { Private declarations } public { Public declarations } end;

var Form1: TForm1; gambar:TBitmap;

implementation

{$R *.dfm}

procedure TForm1.btn_openClick(Sender: TObject);beginif not OpenPictureDialog1.Execute then exit else begin gambar := TBitmap.Create; gambar.LoadFromFile(OpenPictureDialog1.filename); Form1.Caption:='Image Processing - '+ ExtractFileName(OpenPictureDialog1.Filename); end; Image1.Picture.Bitmap := gambar;end;

end.

9. Jalankan program dengan menekan tombol F9

Tugas 2 Menampilkan Matriks Pixel ImageAnda dapat membuat form baru untuk menampilkan matriks pixel atau menambahkan di form 1. Jika ingin menampilkan matriks pixel pada form baru maka Anda dapat melakukan langkah berikut:1. Pilih menu fiel>>New>>Form atau dapat klik langsung pada icon 2. Tambahkan string grid pada form 2 untuk menampung nilai pixel image. Pilih tab Additional >> StringGrid

3. Kembali lagi ke form1. Tambahkan satu button dan beri nama pada caption Show matriks, ubah name button menjadi btn_matriks4. Karena stringgrid untuk menampilkan matriks pixel berada pada form yang berbeda dengan button yang memanggil mariks maka tambahkan uses unit 2 pada listing program Andaunit Unit1;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ExtDlgs;

type TForm1 = class(TForm) OpenPictureDialog1: TOpenPictureDialog; Panel1: TPanel; Image1: TImage; btn_open: TButton; procedure btn_openClick(Sender: TObject); private { Private declarations } public { Public declarations } end;

var Form1: TForm1; gambar:TBitmap;

implementationuses unit2;

5. Tambahkan label untuk memberikan informasi ukuran image pada saat matriks pixel dipanggil. Image yang ditampilkan memiliki format bmp dengan size tidak lebih dari 256

6. Klik dua kali pada button Show Matriks dan tambahkan source code berikutvari,j:integer;begin vlbr:=Form1.Image1.Picture.Width; // lebar image vtgg:=Form1.Image1.Picture.Height; //tinggi image Label1.Caption:='image size :' + IntToStr(vlbr) +' x '+ IntToStr(vtgg); Form2.StringGrid1.Cells[0,0]:='pixel'; Form2.StringGrid1.RowCount:=vtgg+1; // atur banyaknya baris tabel Form2.StringGrid1.ColCount:=vlbr+1; // atur banyaknya kolom tabel for I:=1 to vtgg do begin // scan tinggi image dari 1 sampai tinggi image for j:=1 to vlbr do begin // scan lebar image dari 1 sampai tinggi image Form2.StringGrid1.Cells[j,0]:=IntToStr(j); Form2.StringGrid1.Cells[0,i]:=IntToStr(i); Image[i,j]:=255 - Image1.Canvas.Pixels[j-1,i-1]; //pindahkan data per piksel ke var i dan j Form2.StringGrid1.Cells[j,i]:=IntToStr(image[i,j]); // simpan data ke tabel cell end; end; Form2.Show; // tampilkan From2 Form2.StringGrid1.Height:=i*8; // atur tinggi tabel Form2.StringGrid1.Width:=j*8; // atur lebar tabel

7. Pada source code tersebut terdapat variabel yang disimpan pada variabel public, maka tambahakan variabel dan type di publictypeTimage=array [1..256,1..256] of byte ;

var Form1: TForm1; gambar:TBitmap; Image:timage; vlbr,vtgg:integer;

8. Jalankan program dengan menekan tombol F9

Tugas 3 Konvolusi Image1. Pada form 1 tambahkan button dengan caption Konvolusi dan ubah name button btn_konvolusi2. Klik dua kali pada button konvolusi dan ketikkan source code berikut ini :const konvolusi : array[0..1,0..2,0..2] of smallint = (((1,0,-1),(2,8,2),(1,0,-1)), ((0,0,0),(0,0,0),(0,0,0)));

var row : array[0..8] of pbytearray; col : pbytearray; x,y : smallint; i,j,p : smallint; l :integer; image : tbitmap; sum,jum : longint;

begin P:=-120; image := tbitmap.Create; Image.Assign(gambar); for y:=1 to gambar.Height-2 do begin for i:=-1 to 1 do row[i+1]:= Image.ScanLine[y+i]; col := gambar.ScanLine[y]; x:=3; repeat sum := 0; for i:=-1 to 1 do for j:=-1 to 1 do sum:=sum+(konvolusi[0,i+1,j+1]*row[i+1,x+j*3]); jum:=0; for i:=-1 to 1 do for j:=-1 to 1 do jum:=jum+(konvolusi[1,i+1,j+1]*row[i+1,x+j*3]); sum := (sum + jum)+p; if sum>255 then sum:=255; if sum=3*(gambar.Width-4); end; Image1.Picture.bitmap := gambar; Image.free;

3. Jalankan program dengan menekan tombol F9Tugas 4 HistogramSebelum citra (RGB) dimanipulasi dengan berbagai operasi tertentu, biasanya, citra dikonversikan dahulumenjadi citra grey-scale. Penkonversian ini bertujuanagar citra tersebut dapat dimanipulasi secara efisientanpa perlu terjadinya perhitungan yang sama berulang-ulang pada setiap kanal citra.Oleh karena itu pada tugas 4 ini selain membuat histogram Anda juga harus membuat image Gray Scale. Berikut ini adalah Langkah-langkah yang dapat Anda lakukan:1. Tambahkan image pada form 1 untuk menampilkan image yang telah di gray scale kan2. Tambahkan button dengan caption Gray Scale dan name button btn_grayscale3. Klik dua kali pada button dan ketikkan source code berikut inivar

temp : PByteArray;i,j: integer;x: byte;digit: byte;

begingambar := TBitmap.Create;gambar.LoadFromFile(OpenPictureDialog1.filename);Form1.Caption:= 'Image Processing - '+ExtractFileName (OpenPictureDialog1.Filename);if gambar.PixelFormat pf24bit thengambar.PixelFormat := Pf24bit;

for j:=0 togambar.Height-1 do begintemp := gambar.ScanLine[j];i:=0;repeatx :=round((0.11*temp[i])+(0.59*temp[i+1])+(0.3*temp[i+2]));for digit:=0 to 2 dotemp[i+digit]:=x;inc(i,3);until i >= 3*gambar.Width-1;end;Image2.Picture.Bitmap := gambar;end;

4. Setelah itu barulah masuk ke tugas selajutnya untuk menampilkan histogram gambar. Program yang akan saya buat adalah menamplkan histogram pada form yang berbeda,5. Klik pada icon new form untuk menambah dan menampilkan form baru6. Kemudian pilih tab Additional >> Chart

7. Klik dua kali pada komponen chart yang telah Anda pindahkan ke form

8. Lakukan setting chart yang pertama adalah pada tab Series >> Add, hapus checkbox pada tulisan 3D dan klik pada gambar Bar, kemudian klik OK

9. Pada tab axis, hilangkan checkbox pada Show Axis 10. Plih tab tittle dan beri nama pada Histogram Anda 11. Pada tab Legend hapus checkbox pada visible 12. Pada tab panel Menu Bevel Inner klik pada checkbox Raised dan pada menu Bevel Outer klik pada checkbox Lowered 13. Kemudian klik pada tab utama Series, klik sub menu Mark, hapus checkbox pada Visible

14. Kemudian klik button Close, maka Anda akan mendapatkan tampilan histogram sebagai berikut 15. Kembali lagi ke form 1 tambahkan button dengan Caption Histogram, name button btn_histogram16. Klik dua kali pada btn_histogram dan tambahkan source code berikutvari: Integer;

beginHistogram;for i := 0 to 255 doForm3.Series1.AddXY(i,datamod[i],'-',clBlue);Form3.show;

17. Pada source code diatas form 1 memanggil form 3 maka lakukan seperti langkah sebelumnya pada tugas awal, tambahkan unit 3 setelah uses18. Button histogram akan memanggil procedure histogram, maka Anda dapat menambahkan procedure Histogram dan ketikkan source code berikut ini :procedure TForm1.Histogram;vartemp : pbytearray;x,y,jum : integer;tengah : integer;a,b,c : real;

beginjum:=0;for y:=0 to (Gambar.Height-1) dobegintemp := Gambar.ScanLine[y];x:=0;repeata := 0.11*temp[x];b := 0.59*temp[x+1];c := 0.3*temp[x+2];tengah := round(a+b+c);datamod[tengah] := datamod[tengah]+1;inc(jum);inc(x,3);untilx>3*(gambar.Width-1);end;for x:=0 to 255 dodatamod[x]:=datamod[x]/jum;end;

19. Tambahkan variabel datamod pada variabel globalvar Form1: TForm1; gambar:TBitmap; Image:timage; vlbr,vtgg:integer; datamod : array[0..255] of real;

20. Procedure ini belum dideklarasikan, maka pada badan program bagian atas tambahkan Procedure Histogram setelah private--- procedure btn_matriksClick(Sender: TObject); procedure btn_konvolusiClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure btn_GrayScaleClick(Sender: TObject); procedure btn_histogramClick(Sender: TObject); private Procedure Histogram; { Private declarations } public { Public declarations } end;

21. Jalankan program

Tampilan Program keseluruhan

Pada program ini saya juga mengganti fungsi button dengan menggunakan file menu. Anda dapat melakukannya dengan cara klik tab Standar >> MainMenu1. Setelah klik komponen MainMenu kemudian Anda dapat menambahkan menu seperti berikut

2. Beri nama Captionnya dan ganti name pada properties komponen3. Berikut listing program secara keseluruhan menggunakan menu fileunit Unit1;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ExtDlgs, Menus;

type TForm1 = class(TForm) OpenPictureDialog1: TOpenPictureDialog; Panel1: TPanel; Image1: TImage; Label1: TLabel; Panel2: TPanel; Image2: TImage; MainMenu1: TMainMenu; File1: TMenuItem; mnu_open: TMenuItem; mn_image: TMenuItem; Exit1: TMenuItem; mn_konvolusi: TMenuItem; mn_grayscale: TMenuItem; mn_matriks: TMenuItem; mn_histogram: TMenuItem; procedure Exit1Click(Sender: TObject); procedure mnu_openClick(Sender: TObject); procedure mn_matriksClick(Sender: TObject); procedure mn_konvolusiClick(Sender: TObject); procedure mn_grayscaleClick(Sender: TObject); procedure mn_histogramClick(Sender: TObject); private Procedure Histogram; { Private declarations } public { Public declarations } end;

typeTimage=array [1..256,1..256] of byte ;

var Form1: TForm1; gambar:TBitmap; Image:timage; vlbr,vtgg:integer; datamod : array[0..255] of real;

implementationuses unit2,unit3;{$R *.dfm}

procedure TForm1.Histogram;vartemp : pbytearray;x,y,jum : integer;tengah : integer;a,b,c : real;

beginjum:=0;for y:=0 to (Gambar.Height-1) dobegintemp := Gambar.ScanLine[y];x:=0;repeata := 0.11*temp[x];b := 0.59*temp[x+1];c := 0.3*temp[x+2];tengah := round(a+b+c);datamod[tengah] := datamod[tengah]+1;inc(jum);inc(x,3);untilx>3*(gambar.Width-1);end;for x:=0 to 255 dodatamod[x]:=datamod[x]/jum;end;

procedure TForm1.Exit1Click(Sender: TObject);beginApplication.Terminate;end;

procedure TForm1.mnu_openClick(Sender: TObject);beginif not OpenPictureDialog1.Execute then exit else begin gambar := TBitmap.Create; gambar.LoadFromFile(OpenPictureDialog1.filename); Form1.Caption:='Image Processing - '+ ExtractFileName(OpenPictureDialog1.Filename); end; Image1.Picture.Bitmap := gambar;end;

procedure TForm1.mn_matriksClick(Sender: TObject);vari,j:integer;begin vlbr:=Form1.Image1.Picture.Width; // lebar image vtgg:=Form1.Image1.Picture.Height; //tinggi image Label1.Show; Label1.Caption:='image size :' + IntToStr(vlbr) +' x '+ IntToStr(vtgg); Form2.StringGrid1.Cells[0,0]:='pixel'; Form2.StringGrid1.RowCount:=vtgg+1; // atur banyaknya baris tabel Form2.StringGrid1.ColCount:=vlbr+1; // atur banyaknya kolom tabel for I:=1 to vtgg do begin // scan tinggi image dari 1 sampai tinggi image for j:=1 to vlbr do begin // scan lebar image dari 1 sampai tinggi image Form2.StringGrid1.Cells[j,0]:=IntToStr(j); Form2.StringGrid1.Cells[0,i]:=IntToStr(i); Image[i,j]:=255 - Image1.Canvas.Pixels[j-1,i-1]; //pindahkan data per piksel ke var i dan j Form2.StringGrid1.Cells[j,i]:=IntToStr(image[i,j]); // simpan data ke tabel cell end; end; Form2.Show; // tampilkan From2 Form2.StringGrid1.Height:=i*8; // atur tinggi tabel Form2.StringGrid1.Width:=j*8; // atur lebar tabel

end;

procedure TForm1.mn_konvolusiClick(Sender: TObject);const konvolusi : array[0..1,0..2,0..2] of smallint = (((1,0,-1),(2,8,2),(1,0,-1)), ((0,0,0),(0,0,0),(0,0,0)));

var row : array[0..8] of pbytearray; col : pbytearray; x,y : integer; i,j,p : longint; image : tbitmap; sum,jum,l : longint;

begin P:=-120; image := tbitmap.Create; Image.Assign(gambar); for y:=1 to gambar.Height-2 do begin for i:=-1 to 1 do row[i+1]:= Image.ScanLine[y+i]; col := gambar.ScanLine[y]; x:=3; repeat sum := 0; for i:=-1 to 1 do for j:=-1 to 1 do sum:=sum+(konvolusi[0,i+1,j+1]*row[i+1,x+j*3]); jum:=0; for i:=-1 to 1 do for j:=-1 to 1 do jum:=jum+(konvolusi[1,i+1,j+1]*row[i+1,x+j*3]); sum := (sum + jum)+p; if sum>255 then sum:=255; if sum=3*(gambar.Width-4); end; Image1.Picture.bitmap := gambar; Image.free;

end;

procedure TForm1.mn_grayscaleClick(Sender: TObject);var

temp : PByteArray;i,j: integer;x: byte;digit: byte;

begingambar := TBitmap.Create;gambar.LoadFromFile(OpenPictureDialog1.filename);Form1.Caption:= 'Image Processing - '+ExtractFileName (OpenPictureDialog1.Filename);if gambar.PixelFormat pf24bit thengambar.PixelFormat := Pf24bit;

for j:=0 togambar.Height-1 do begintemp := gambar.ScanLine[j];i:=0;repeatx :=round((0.11*temp[i])+(0.59*temp[i+1])+(0.3*temp[i+2]));for digit:=0 to 2 dotemp[i+digit]:=x;inc(i,3);until i >= 3*gambar.Width-1;end;Image2.Picture.Bitmap := gambar;

end;

procedure TForm1.mn_histogramClick(Sender: TObject);vari: Integer;

beginHistogram;for i := 0 to 255 doForm3.Series1.AddXY(i,datamod[i],'-',clBlue);Form3.show;

end;

end.

4. Listing program menggunakan buttonunit Unit1;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ExtDlgs, Menus;

type TForm1 = class(TForm) OpenPictureDialog1: TOpenPictureDialog; Panel1: TPanel; Image1: TImage; Label1: TLabel; Panel2: TPanel; Image2: TImage; MainMenu1: TMainMenu; File1: TMenuItem; procedure btn_openClick(Sender: TObject); procedure btn_matriksClick(Sender: TObject); procedure btn_konvolusiClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure btn_GrayScaleClick(Sender: TObject); procedure btn_histogramClick(Sender: TObject); private Procedure Histogram; { Private declarations } public { Public declarations } end;

typeTimage=array [1..256,1..256] of byte ;

var Form1: TForm1; gambar:TBitmap; Image:timage; vlbr,vtgg:integer; datamod : array[0..255] of real;

implementationuses unit2,unit3;{$R *.dfm}

procedure TForm1.btn_openClick(Sender: TObject);beginif not OpenPictureDialog1.Execute then exit else begin gambar := TBitmap.Create; gambar.LoadFromFile(OpenPictureDialog1.filename); Form1.Caption:='Image Processing - '+ ExtractFileName(OpenPictureDialog1.Filename); end; Image1.Picture.Bitmap := gambar;end;

procedure TForm1.btn_matriksClick(Sender: TObject);

vari,j:integer;begin vlbr:=Form1.Image1.Picture.Width; // lebar image vtgg:=Form1.Image1.Picture.Height; //tinggi image Label1.Show; Label1.Caption:='image size :' + IntToStr(vlbr) +' x '+ IntToStr(vtgg); Form2.StringGrid1.Cells[0,0]:='pixel'; Form2.StringGrid1.RowCount:=vtgg+1; // atur banyaknya baris tabel Form2.StringGrid1.ColCount:=vlbr+1; // atur banyaknya kolom tabel for I:=1 to vtgg do begin // scan tinggi image dari 1 sampai tinggi image for j:=1 to vlbr do begin // scan lebar image dari 1 sampai tinggi image Form2.StringGrid1.Cells[j,0]:=IntToStr(j); Form2.StringGrid1.Cells[0,i]:=IntToStr(i); Image[i,j]:=255 - Image1.Canvas.Pixels[j-1,i-1]; //pindahkan data per piksel ke var i dan j Form2.StringGrid1.Cells[j,i]:=IntToStr(image[i,j]); // simpan data ke tabel cell end; end; Form2.Show; // tampilkan From2 Form2.StringGrid1.Height:=i*8; // atur tinggi tabel Form2.StringGrid1.Width:=j*8; // atur lebar tabel

end;

procedure TForm1.btn_konvolusiClick(Sender: TObject);const konvolusi : array[0..1,0..2,0..2] of smallint = (((1,0,-1),(2,8,2),(1,0,-1)), ((0,0,0),(0,0,0),(0,0,0)));

var row : array[0..8] of pbytearray; col : pbytearray; x,y : smallint; i,j,p : smallint; l :integer; image : tbitmap; sum,jum : longint;

begin P:=-120; image := tbitmap.Create; Image.Assign(gambar); for y:=1 to gambar.Height-2 do begin for i:=-1 to 1 do row[i+1]:= Image.ScanLine[y+i]; col := gambar.ScanLine[y]; x:=3; repeat sum := 0; for i:=-1 to 1 do for j:=-1 to 1 do sum:=sum+(konvolusi[0,i+1,j+1]*row[i+1,x+j*3]); jum:=0; for i:=-1 to 1 do for j:=-1 to 1 do jum:=jum+(konvolusi[1,i+1,j+1]*row[i+1,x+j*3]); sum := (sum + jum)+p; if sum>255 then sum:=255; if sum=3*(gambar.Width-4); end; Image1.Picture.bitmap := gambar; Image.free; end;

procedure TForm1.FormCreate(Sender: TObject);beginLabel1.Hide;end;

procedure TForm1.btn_GrayScaleClick(Sender: TObject);var

temp : PByteArray;i,j: integer;x: byte;digit: byte;

begingambar := TBitmap.Create;gambar.LoadFromFile(OpenPictureDialog1.filename);Form1.Caption:= 'Image Processing - '+ExtractFileName (OpenPictureDialog1.Filename);if gambar.PixelFormat pf24bit thengambar.PixelFormat := Pf24bit;

for j:=0 togambar.Height-1 do begintemp := gambar.ScanLine[j];i:=0;repeatx :=round((0.11*temp[i])+(0.59*temp[i+1])+(0.3*temp[i+2]));for digit:=0 to 2 dotemp[i+digit]:=x;inc(i,3);until i >= 3*gambar.Width-1;end;Image2.Picture.Bitmap := gambar;end;

procedure TForm1.btn_histogramClick(Sender: TObject);vari: Integer;

beginHistogram;for i := 0 to 255 doForm3.Series1.AddXY(i,datamod[i],'-',clBlue);Form3.show;end;

procedure TForm1.Histogram;vartemp : pbytearray;x,y,jum : integer;tengah : integer;a,b,c : real;

beginjum:=0;for y:=0 to (Gambar.Height-1) dobegintemp := Gambar.ScanLine[y];x:=0;repeata := 0.11*temp[x];b := 0.59*temp[x+1];c := 0.3*temp[x+2];tengah := round(a+b+c);datamod[tengah] := datamod[tengah]+1;inc(jum);inc(x,3);untilx>3*(gambar.Width-1);end;for x:=0 to 255 dodatamod[x]:=datamod[x]/jum;end;

end.

Tampilan membuka dan menampilkan file

Tampilan image setelah konvolusi

Tampilan image Gray Scale

Tampilan Histogram GrayScale Image