1
Anak Agung Ngurah Gunawan
PENGOLAHAN CITRA DIGITAL STEP BY STEP MENGGUNAKAN DELPHI 7
Penerbit : ANDI
2
PENGOLAHAN CITRA DIGITAL STEP BY STEP MENGGUNAKAN DELPHI 7
Anak Agung Ngurah Gunawan
Penerbit : ANDI
PENGOLAHAN CITRA DIGITAL STEP BY STEP MENGGUNAKAN DELPHI 7
3 Oleh : Anak Agung Ngurah Gunawan Hak Cipta @ 2013 pada Penulis Editor Setting Desain Cover Korektor
: : : :
Hak cipta dilindungi undang-undang. Dularang memperbanyak atau memendahkan sebagian atau seluruh isi buku ini dalam bentuk apapun, baik secara elektronis maupun mekanis, termasuk memfotocopy, merekam, atau dengan sistem penyimpanan lainnyatanpa izin tertulis dari penulis. Penerbit: ANDI
Percetakan:
Perpustakaan Nasional: Katalog dalam Terbitan (KDT)
4 Buku ini kupersembahkan kepada
Orang tuaku tercinta Almr. A. A. Pt. Oka Pudjawan dan A.A. Ayu Kompiang Raka Mertuaku tercinta Almr. Ahmad Simin dan Alrm Sih Niti Istriku tercinta Sumi Natalia Anakku tersanyang Jacqueline, Franky, Frady Cucuku tersayang A.A. Ngr. Brawijaya (Wah Brow) Dan mantu : IGst Agung Prabawa Weda Kehadiranmu adalah pembuka jalan terciptanya buku ini
5
6
KATA PENGANTAR Puji syukur Penulis panjatkan ke hadirat Tuhan Yang Maha Esa atas selesainya penyusunan buku Pratikum Pengolahan Citra Digital. Buku ini disusun untuk melengkapi khasanah buku teks perkuliahan di Teknik Informatika atau Ilmu Komputer, khususnya di bidang pengolahan citra. Penulis berharap dengan adanya buku ini, mahasiswa mendapatkan panduan dalam mengikuti Pratikum Pengolahan Citra Digital di pendidikan D3 atau S1 Teknik Informatika atau Ilmu Komputer. Materi dalam buku ini adala teori dan langkah pemrograman, diharapkan setelah membaca buku ini pembaca bisa membuat priram sederhana pengolahan citra digital dengan menggunakan bahasa pemrograman dephi 7. Sebagai sebuah karya manusia, tentu buku ini masih banyak mengandung kelemahan. Kami berharap masukan kritik dan saran dari pembaca melalui email
[email protected]. Penulis berterimakasi atas kritik saran pembaca yang akan kami sempurnakan penerbitan buku berikutnya. Denpasar, Agustus 2013 Penyusun
7
8
DAFTAR ISI
KATA PENGANTAR DAFTAR ISI DAFTAR GAMBAR DAFTAR TABEL
v vii x xviii
BAB I 1.1 1.2
OPEN IMAGE Cara Membuat Program Open Image Program Open Image Selengkapnya Adalah Sebagai Berikut
BAB II 2.1 2.2 2.3
HISTOGRAM EQUALIZATION Perataan Histogram
BAB III 3.1 3.2 3.3
WIENER FILTER Teori Wiener Filter Cara Membuat Program Wiener Filter Program Wiener Filter Selengkapnya Adalah Sebagai Berikut
31 31 32 45
BAB IV 4.1 4.2 4.3
GLOBAL TRESHOLDING Dasar Teori Global Thresholding Cara Membuat Program Global Thresholding Program Global Thresholding Selengkapnya Adalah Sebagai Berikut
51 51 51 61
BAB V 5.1 5.2 5.3
HISTOGRAM CUT Dasar Teori Histogram Cut Cara Menbuat Program Histogram Cut Program Histogram Cut Selengkapnya Adalah Sebagai Berikut
65 65 69 84
BAB VI 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5
MORPOLOGI Dasar Teori Morpologi Struktur elemen Dilasi Erosi Opening Closing
89 89 89 89 90 91 91
Cara Membuat Program Equalization Program Histogram Equalization Selengkapnya Adalah sebagai Berikut
1 1 7 9 9 13 25
9 6.2 6.3
Cara Menbuat Program Morpologi Program Morpologi Selengkapnya Adalah Sebagai Berikut
92 105
BAB VII 7.1 7.2 7.3
SUBTRAK Dasar Teori Subtrak Cara Membuat Program Subtrak Program Subtrak Selengkapnya Adalah Sebagai Berikut
111 111 111 123
BAB VIII 8.1 8.2 8.3
DETEKSI TEPI SOBEL Dasar Teori Deteksi Tepi Sobel Cara Membuat Program Deteksi Tepi Sobel Program Deteksi Tepi Sobel Selengkapnya Adalah Sebagai Berikut
127 127 128 140
BAB IX 9.1 9.2 9.3
DETEKSI TEPI PREWITT Dasar Teori Deteksi Tepi Prewitt Cara Membuat Program Deteksi Tepi Prewitt Program Deteksi Tepi Prewitt Selengkapnya Adalah Sebagai Berikut
145 145 146 159
BAB X 10.1 10.2 10.3
DETEKSI TEPI ROBERT Dasar Teori Deteksi Tepi Robert Cara Membuat Program Deteksi Tepi Robert Program Deteksi Tepi Robert Selengkapnya Adalah Sebagai Berikut
163 163 164 176
BAB XI 11.1 11.2 11.3
LOW PASS FILTER Dasar Teori Low Pass Filter Cara Membuat Program Low Pass Filter Program Low Pass Filter Selengkapnya Adalah Sebagai Berikut
181 181 181 194
BAB XII 12.1 12.2 12.3
HIGHT PASS FILTER Dasar Teori Hight Pass Filter Cara Membuat Program Hight Pass Filter Program Hight Pass Filter Selengkapnya Adalah Sebagai Berikut
199 199 200 214
BAB XIII 13.1 13.2 13.3
K-MEANS Algoritma K-Means Cara Membuat Program K-Means Program K-Means Selengkapnya Adalah Sebagai Berikut
219 219 222 240
BAB XIV 14.1 14.2 14.3
MENAMPILKAN NILAI INTENSITAS PIXEL Pendahuluan Cara Membuat Program Menampilkan Nilai Intensitas Pixel Program Menampilkan Nilai Intensitas Pixel Selengkapnya Adalah Sebagai Berikut
247 247 247 255
BAB XV 15.1 15.2 15.3
LOG IN Pendahuluan Cara Membuat Program Log In Program Log In Selengkapnya Adalah Sebagai Berikut
261 261 261 268
10 DAFTAR PUSTAKA
271
DAFTAR RIWAYAT HIDUP
273
11
DAFTAR GAMBAR
Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar
1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13 1.14 1.15 1.16
Start Program Delphi New Application Object Inspector Save All Save Unit Save Project Menu Image Stretch True Menu Button Button Open Menu OpenPictureDialog Hasil OpenPictureDialog Button Exit Menu Compiler Menu Run Hasil Program
Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar
2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11 2.12 2.13 2.14 2.15 2.16 2.17 2.18 2.19 2.20 2.21 2.22 2.23 2.24 2.25 2.26 2.27
Fungsi Transformasi Histogram Citra Sebelum Perataan Histogram Citra Hasil Pemetaan. Start Program Delphi New Application Object Inspector Save All Save UnitEqualization Save ProjectEqualization Menu Image Stretch True Penambahan Image 2 Menu Button Button Open Menu OpenPictureDialog Hasil OpenPictureDialog Button Equalization Menu ProgresBar Hasil ProgresBar New Unit Save All Save UnitImageProses Hasil Save UnitImageProses Kembali ke FormEqualization Menu Toggle Form Klik Button Equalization Button Exit
1 1 2 2 2 3 3 3 4 4 4 5 5 6 6 7 10 11 12 13 13 14 14 14 15 15 15 16 16 16 17 17 18 18 18 19 19 19 20 22 23 23 24
12 Gambar 2.28 Gambar 2.29 Gambar 2.30
Compile ProjectEqualization Run ProjectEqualization Hasil Program Equalization
24 25 25
Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar
3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 3.16 3.17 3.18 3.19 3.20 3.21 3.22 3.23 3.24 3.25 3.26 3.27
Start Program New Application Form Wiener Filter Save All Unit Wiener Filter Project Wiener Filter Menu Image Stretch True Penambahan Image 2 Menu Button Button Open Menu OpenPictureDialog Hasil OpenPictureDialog Button Wiener Filter Menu ProgresBar Hasil ProgresBar New Unit Save All Save UnitImageProses Hasil Save UnitImageProses Kembali ke FormWienerFilter Menu Toggle Form Klik Button Wiener Filter Button Exit Menu Compile Menu Run Hasil Wiener Filter
32 33 33 33 34 34 34 35 35 35 36 36 36 37 37 38 38 38 39 39 42 43 43 44 44 45 45
Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar
4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 4.12
Start Program Form Global Thresholding Button Open Save All Save Unit Global Thresolding Save Project Global Thresolding Button Thresolding New Unit Save Image Proses Edit Thresolding Button Exit Hasil Program Thresolding
51 52 52 53 53 54 55 55 56 59 60 60
Gambar Gambar Gambar Gambar
5.1 5.2 5.3 5.4
Start Program New Application Form Histogram Cut Save All
69 69 70 70
13 Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar
5.5 5.6 5.7 5.8 5.9 5.10 5.11 5.12 5.13 5.14 5.15 5.16 5.17 5.18 5.19 5.20 5.21 5.22 5.23 5.24 5.25 5.26 5.27 5.28 5.29 5.30 5.31
Save UnitHistogramCut Save ProjectHistogramCut Menu Image AutoSize True Penambahan Image 2 Menu Button Button Open Menu OpenPictureDialog Hasil OpenPictureDialog Button HistogramCut Menu ProgresBar Hasil ProgresBar New Unit Save As Save UnitImageProses Hasil Save UnitImageProses Kembali ke Form HistogramCut Menu Toggle Klik Button HistogramCut Button Exit Menu Edit Object InspectorEdit Menu Label Object Inspector Cut Menu Compile Menu Run Hasil Program Histogram Cut
Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar
6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 6.10 6.11 6.12 6.13 6.14 6.15 6.16 6.17 6.18 6.19 6.20 6.21 6.22
Start Program New Application Form Morpologi Save All Save UnitMorpologi Save ProjectMorpologi Menu Image Stretch True Penambahan Image 2 Menu Button Button Open Menu OpenPictureDialog Hasil OpenPictureDialog Button Morpologi Menu ProgresBar Hasil ProgresBar New Unit Save As Save UnitImageProses Hasil Save UnitImageProses Kembali ke FormMorpologi Menu Toggle
70 71 71 71 72 72 72 73 73 74 74 74 75 75 75 76 79 79 89 81 81 81 82 82 83 83 84 92 92 93 93 93 94 94 94 95 95 95 96 96 97 97 97 98 98 98 99 102 102
14 Gambar Gambar Gambar Gambar Gambar
6.23 6.24 6.25 6.26 6.27
Klik Button Morpologi Button Exit Compiler ProjectMorpologi Menu Run Hasil Program Morpologi
102 103 104 104 104
Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar
7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 7.10 7.11 7.12 7.13 7.14 7.15 7.16 7.17 7.18 7.19 7.20 7.21 7.22 7.23 7.24 7.25 7.26 7.27
Start Program New Application Form Substrak Save All Save UnitSubtrak Save ProjectSubstrak Menu Image Stretch True Penambahan Image 2 Menu Button Button Open Menu OpenPictureDialog Hasil OpenPictureDialog Button Subtrak Menu ProgresBar Hasil ProgresBar New Unit Save As Save UnitImageProses Hasil Save UnitImageProses Kembali ke FormSubstrak Menu Toggle Klik Button Substrak Button Exit Compiler ProjectSubtrak Menu Run Hasil Program Subtrak
111 112 112 112 113 113 113 114 114 114 115 115 115 116 116 117 117 117 118 118 120 121 121 122 122 122 123
Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar
8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 8.9 8.10 8.11 8.12 8.13 8.14 8.15 8.16
Start Program New Application Form Sobel Save All Save UnitSobel Save ProjectSobel Menu Image Stretch True Penambahan Image 2 Menu Button Button Open Menu OpenPictureDialog Hasil OpenPictureDialog Button Sobel New Unit Save As
128 128 129 129 129 130 130 130 131 131 131 132 132 133 133 133
15 Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar
8.17 8.18 8.19 8.20 8.21 8.22 8.23 8.24 8.25 8.26
Save UnitImageProses Hasil Save UnitImageProses Kembali ke FormSobel Menu Toggle Button Sobel Button Exit Compiler ProjectSobel Menu Run Hasil Mammografi Hasil Photo
134 134 136 136 136 138 139 139 140 140
Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar
9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 9.10 9.11 9.12 9.13 9.14 9.15 9.16 9.17 9.18 9.19 9.20 9.21 9.22 9.23 9.24 9.25 9.26
Start Program New Application Form Prewitt Save All Save UnitPrewitt Save ProjectPrewitt Menu Image Stretch True Penambahan Image 2 Menu Button Button Open Menu OpenPictureDialog Hasil OpenPictureDialog Button Prewitt New Unit Save As Save UnitImageProses Hasil Save UnitImageProses Kembali ke FormPrewitt Menu Toggle Button Sobel Button Exit Compiler ProjectPrewitt Menu Run Hasil Mammografi Hasil Photo
146 146 147 147 147 148 148 148 149 149 149 150 150 151 151 151 152 152 154 154 154 156 157 157 158 158
Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar
10.1 10.2 10.3 10.4 10.5 10.6 10.7 10.8 10.9 10.10 10.11 10.12
Start Program New Application Form Robert Save All Save UnitRobert Save ProjectRobert Menu Image Stretch True Penambahan Image 2 Menu Button Button Open Menu OpenPictureDialog
164 164 165 165 165 166 166 166 167 167 167 168
16 Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar
10.13 10.14 10.15 10.16 10.17 10.18 10.19 10.20 10.21 10.22 10.23 10.24 10.25
Hasil OpenPictureDialog Button Robert New Unit Save As Save UnitImageProses Hasil Save UnitImageProses Kembali ke FormRobert Menu Toggle Button Robert Button Exit Compiler ProjectRobert Menu Run Hasil Program Robert
168 169 169 169 170 170 172 172 172 174 175 175 175
Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar
11.1 11.2 11.3 11.4 11.5 11.6 11.7 11.8 11.9 11.10 11.11 11.12 11.13 11.14 11.15 11.16 11.17 11.18 11.19 11.20 11.21 11.22 11.23 11.24 11.25 11.26
Start Program New Application Form LowPassFilter Save All Save UnitLowPassFilter Save ProjectLowPassFilter Menu Image Stretch True Penambahan Image 2 Menu Button Button Open Menu OpenPictureDialog Hasil OpenPictureDialog Button Low Pass Filter New Unit Save As Save UnitImageProses Hasil Save UnitImageProses Kembali ke FormLowPassFilter Menu Toggle Klik Button Low Pass Filter Button Exit Compiler ProjectLowPassFilter Menu Run Hasil Mammografi Hasil Photo
181 182 182 182 183 183 183 184 184 184 185 185 185 186 187 187 187 188 190 190 190 192 193 193 194 194
Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar
12.1 12.2 12.3 12.4 12.5 12.6 12.7 12.8 12.9
Start Program New Application FormHighPassFilter Save All Save UnitHighPassFilter Save ProjectHighPassFilter Menu Image Stretch True Penambahan Image 2
200 200 201 201 202 202 202 203 203
17 Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar
12.10 12.11 12.12 12.13 12.14 12.15 12.16 12.17 12.18 12.19 12.20 12.21 12.22 12.23 12.24 12.25 12.26
Menu Button Button Open Menu OpenPictureDialog Hasil OpenPictureDialog Button High Pass filter ton Low Pass Filter New Unit Save As Save UnitImageProses Hasil Save UnitImageProses Kembali ke FormHighPassFilter Menu Toggle Klik Button High Pass Filter Button Exit Compiler ProjectHighPassFilter Menu Run Hasil Mammografi Hasil Photo
204 204 204 205 206 206 206 207 207 209 209 209 211 212 212 213 213
Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar
13.1 13.2 13.3 13.4 13.5 13.6 13.7 13.8 13.9 13.10 13.11 13.12 13.13 13.14 13.15 13.16 13.17 13.18 13.19 13.20 13.21 13.22 13.23 13.24 13.25 13.26 13.27 13.28 13.29 13.30 13.31 13.32
Start Program New Application FormKMean Save All Save UnitKMean Save ProjectKMean Menu Image Stretch True Penambahan Image 2 Menu Button Button Open Menu OpenPictureDialog Hasil OpenPictureDialog Button K-Mean Menu Label Label K Menu Edit EditCluster Label Weight Clr Wight 40Menu Toggle Menu ProgressBar Hasil ProgressBar Menu New Unit Menu Save As Save UnitImageProses Hasil UnitImageProses Kembali ke FormKMean Toggle Button K-Mean Button Exit Compiler ProjectKMean Menu Run
222 223 223 223 224 224 224 225 225 225 226 226 226 227 228 228 228 229 229 230 230 230 231 231 232 232 237 237 237 238 239 239
18 Gambar 13.33
Hasil Program K-Mean
239
Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar
14.1 14.2 14.3 14.4 14.5 14.6 14.7 14.8 14.9 14.10 14.11 14.12 14.13 14.14
Menu Open Project Open ProjectHistogramCut Hasil OpenProjectHistogramCut Menu Memo Hasil Memo MainMenu Hasil Main Menu Pada Form Tampilan Main Menu Tulisan Caption File Pada Main Menu Hasil Tampilan Fle Main Menu Menampilkan Tulisan Nilai Intensitas Pixel Awal Menampilkan Nilai Intensitas Pixel Hasil Kembali ke FormHistogramCut Hasil Program Menampilkan Nialai Intensitas Pixel
247 248 248 249 249 249 250 250 251 251 251 252 252 254
Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar Gambar
15.1 15.2 15.3 15.4 15.5 15.6 15.7 15.8 15.9 15.10 15.11 15.12 15.13 15.14 15.15
Start Program New Application Form LogIn Tambah Edit ke Form Tambah Button ke Form New Form Form Aplikasi Menu Save All Save UnitLogIn Use Unit Mengelingkan Form Aplikasi Dengan UnitLogIn Mengelingkan UnitLogIn Dengan Form Aplikasi Compiler ProjectLogIn Menu Run Hasil Program LogIn
261 261 262 262 263 263 264 264 265 265 266 266 267 267 268
19
DAFTAR TABEL
TABEL TABEL TABEL TABEL
2.1 2.2 2.3 2.4
Nilai-nilai rk jika L=8 Histogram Citra Semula Sebelum Perataan Hasil Transformasinya Histogram Citra Hasil Perataan
9 10 11 12
20
BAB 1 OPEN IMAGE
1.1 CARA MEMBUAT PROGRAM OPEN IMAGE LAKUKAN LANGKAH BERIKUT: 1. Buka program delphi, dengan cara pilih menu start, program borland delphi 7, delphi 7.
Gambar 1.1 Start Program Delphi 2. Kemudian pilih menu file, new, application.
Gambar 1.2 New Application
21
3. Pada object inspector, ubah properti captionnya dengan nama OpenImage, dan namenya dengan nama FormOpenImage.
Gambar 1.3 Object Inspector 4. Simpan unit dan projectnya dengan cara save all.
Gambar 1.4 Save All
5. Beri nama unitnya dengan nama UnitOpenImage.
Gambar 1.5 Save Unit
22
6. Beri nama projectnya dengan nama ProjectOpenImage.
Gambar 1.6 Save Project 7. Tambahkan image ke form dengan cara pilih menu Additional, image, lalu klik ke form.
Gambar 1.7 Menu Image 8. Rubah stretchnya ke true dan AutoSizenya true.
Gambar 1.8 Stretch True
23
9.
Tambahkan button ke form, dengan cara pilih menu standart, button, lalu klik ke form
Gambar 1.9 Menu Button 10. Pada oject inspector rubah properti captionnya dengan nama Open, kemudian namenya dengan nama btOpen.
Gambar 1.10 Button Open 11. Tambahkan OpenPictureDialog ke form, dengan cara pilih menu dialog, OpenPictureDialog, lalu klik ke form.
Gambar 1.11 Menu OpenPictureDialog
24 12. Hasilnya sebagai berikut.
Gambar 1.12 Hasil OpenPictureDialog 13. Doble klik button open kemudian ketik program yang di hurup tebal berikut. procedure TFormOpenImage.btOpenClick(Sender: TObject); begin if OpenPictureDialog1.Execute then begin Caption := 'Program MammoAnalisis Image : '+ OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile (OpenPictureDialog1.FileName); end; end; end. 14. Tambahkan button ke form, lalu pada object inspector rubah properties captionnya dengan nama Exit dan namenya dengan nama btExit.
Gambar 1.13 Button Exit
15. Doble klik button Exit, lalu ketik program berikut.
25 procedure TFormOpenImage.btExitClick(Sender: TObject); begin FormOpenImage.Close; end; 16. Simpan program dengan cara File, save all. 17. Compiler progran ProjectOpenImage.
dengan
cara
pilih
menu
Gambar 1.14 Menu Compiler
18. Lalu jalankan progran dengan cara pilih menu Run, Run.
Gambar 1.15 Menu Run
19. Hasil sebagai berikut.
Project,
Compile
26
Gambar 1.16 Hasil Program
20. Keluar dari program klik button Exit.
1.2 PROGRAM OPEN IMAGE SELENGKAPNYA ADALAH SEBAGAI BERIKUT: unit UnitOpenImage; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtDlgs, StdCtrls, ExtCtrls; type TFormOpenImage = class(TForm) Image1: TImage; btOpen: TButton; OpenPictureDialog1: TOpenPictureDialog; btExit: TButton; procedure btOpenClick(Sender: TObject); procedure btExitClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var FormOpenImage: TFormOpenImage;
27 implementation {$R *.dfm} procedure TFormOpenImage.btOpenClick(Sender: TObject); begin if OpenPictureDialog1.Execute then begin Caption := 'Program MammoAnalisis Image : '+ OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile (OpenPictureDialog1.FileName); end; end; procedure TFormOpenImage.btExitClick(Sender: TObject); begin FormOpenImage.Close; end; end.
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TFormOpenImage = class(TForm) private { Private declarations } public { Public declarations } end; var FormOpenImage: TFormOpenImage; implementation {$R *.dfm} end.
28
BAB 2 HISTOGRAM EQUALIZATION 2.1 PERATAAN HISTOGRAM (HISTOGRAM EQUALIZATION) Histogram citra memberikan informasi tentang penyebaran intensitas pixel-pixel di dalam citra. Misalnya, citra yang terlalu terang atau terlalu gelap memiliki histogram yang sempit. Agar diperoleh citra yang baik, maka penyebaran nilai intensitas harus diubah. Teknik yang lazim dipakai adalah histogram equalization. Tujuan dari perataan histogram adalah untuk memperoleh penyebaran histogram yang merata, sehingga setiap derajat keabuan memiliki jumlah pixel yang relatif sama. Dengan r, r k, s, sk, k, Pr, L, nk , n,T(r), w secara berurutan adalah nilai keabuan citra semula, nilai keabuan citra semula dengan derajat keabuan tertentu , nilai keabuan yang baru, nilai keabuan yang baru dengan derajat keabuan tertentu, derajat keabuan, peluang pixel dengan derajat keabuan tertentu, jumlah derajat keabuan, jumlah pixel dengan derajat keabuan tertentu, jumlah pixel total, fungsi transformasi, variabel dummi. Karena histogram menyatakan peluang pixel dengan derajat keabuan tertentu, maka rumus menghitung histogram ditulis kembali sebagai peluang Pr (rk) = nk / n ...................................................................................(2.1) Yang didalam hal ini rk = k / (L – 1), 0 ≤ k ≤ L – 1 ...............................(2.2) yang artinya, derajat keabuan (k) dinormalkan terhadap derajat keabuan terbesar (L1). Nilai rk = 0 menyatakan hitam, dan rk = 1 menyatakan putih dalam skala keabuan yang didefinisikan. Contohnya, jika L=8, maka nilai-nilai rk dinyatakan di dalam tabel 2.1. Tabel 2.1. Nilai-nilai rk jika L=8 k 0 1 2 3 4 5 6 7
rk 0/7 = 0 1/7 2/7 3/7 4/7 5/7 6/7 7/7 = 1
29 Yang dimaksud dengan perataan histogram adalah mengubah derajat keabuan suatu pixel (r) dengan derajat keabuan yang baru (s) dengan suatu fungsi transformasi T, yang dalam hal ini s = T(r). Gambar 2.2 memperlihatkan transformasi r menjadi s. s
1 sk=T(rk)
0
rk
1
r
Gambar 2.1. Fungsi Transformasi Untuk fungsi histogram yang kontinu,
s = T(r) = ∫0 (),
0 ≤ r ≤ 1 .................................................(2.3)
dengan : w = variabel dummi. Dalam bentuk diskrit, nilai-nilai s diperoleh dengan persamaan berikut : sk = T (rk) = ∑#"=0
!" !
= ∑#"=0 (" ) ..........................................................(2.4)
dengan : 0 ≤ rk ≤ 1, k = 0, 1, 2, ......, L-1 Contoh : Misalkan terdapat citra yang berukuran 64 x 64 dengan jumlah derajaat keabuan (L) = 8 dan jumlah seluruh pixel (n) = 64 x 64 = 4096: Table 2.2 Histogram Citra Semula Sebelum Perataan. k 0 1 2 3 4 5 6 7
0/7 1/7 2/7 3/7 4/7 5/7 6/7 7/7
rk = 0.00 = 0.14 = 0.29 = 0.43 = 0.57 = 0.71 = 0.86 = 1.00
nk 790 1023 850 656 329 245 122 81
Pr(rk) = nk/n 0.19 0.25 0.21 0.16 0.08 0.06 0.03 0.02
30
Pr(rk) 0.30 0.25 0.20 0.15 0.10 0.05 0
1/7
2/7
3/7
4/7
5/7
6/7
1
rk
Gambar 2.2. Histogram Citra Sebelum Perataan Perhitungan perataan histogram adalah sebagai berikut : s0 = T(r0) = ∑0" =0 $" % = (0 ) = 0.19 s1 = T(r1) = ∑1" =0 $" % = (0 ) + (1 ) = 0.19 + 0.25 = 0.44 s2 = T(r2) = ∑2" =0 $" % = (0 ) + (1 ) + (2 ) = 0.19 + 0.25 + 0.21 = 0.65 dan seterusnya, diperoleh : s3 = 0.81 s5 = 0.95 s7 = 1.00 s4 = 0.89 s6 = 0.98 Karena pada citra ini hanya ada 8 nilai intensitas, maka nilai-nilai sk harus dibulatkan ke nilai-nilai r yang terdekat : s0 = 0.19 lebih dekat ke nilai 1/7 (=0.14), maka s0 = 1/7. s1 = 0.44 lebih dekat ke nilai 3/7 (=0.43), maka s1 = 3/7. s2 = 0.65 lebih dekat ke nilai 5/7 (=0.71), maka s2 = 5/7. s3 = 0.81 lebih dekat ke nilai 6/7 (=0.86), maka s3 = 6/7. s4 = 0.89 lebih dekat ke nilai 6/7 (=0.86), maka s4 = 6/7. s5 = 0.95 lebih dekat ke nilai 7/7 (=1.00), maka s5 = 7/7. s6 = 0.98 lebih dekat ke nilai 7/7 (=1.00), maka s6 = 7/7. s7 = 1.00 lebih dekat ke nilai 7/7 (=1.00), maka s7 = 7/7. Table 2.3 Hasil Transformasinya : k 0 1 2 3 4 5 6 7
rk 0 1/7 2/7 3/7 4/7 5/7 6/7 1
sk 1/7 3/7 5/7 6/7 6/7 1 1 1
Terlihat dari contoh di atas hanya lima nilai intensitas yang terisi yaitu 1/7, 3/7, 5/7, 6/7, dan 1. Notasi untuk tiap hasil transformasi didefinisi ulang menjadi :
31 s0 = 1/7, s1 = 3/7, s2 = 5/7, s3 = 6/7, s4 = 1. Karena r0 = 0 dipetakan ke s0 = 1/7, terdapat 790 pixel hasil transformasi yang memiliki nilai intensitas 1/7. Selanjutnya, s1 = 3/7 memiliki 1023 pixel, s2 = 5/7 memiliki 850 pixel. Juga, karena r3 dan r4 dipetakan ke nilai yang sama, s3 = 6/7, maka jumlah pixel yang bernilai 6/7 adalah 656 + 329 = 985. Jumlah pixel hasil tranformasi diringkas pada tabel di bawah ini : Table 2.4 Histogram Citra Hasil Perataan sk 1/7 3/7 5/7 6/7 7/7
nk 790 1023 850 656 + 329 = 958 245 + 122 + 81 = 448
Ps(sk) = nk/n 0.19 0.25 0.21 0.23 0.11
Ps(sk) 0.30 0.25 0.20 0.15 0.10 0.05 0
1/7
2/7
3/7
4/7
5/7
6/7
1
sk
Gambar 2.3. Histogram Citra Hasil Pemetaan.
2.2 CARA MEMBUAT PROGRAM EQUALIZATION LAKUKAN LANGKAH BERIKUT:
32
1. Buka program delphi, dengan cara pilih menu start, program borland delphi 7, delphi 7.
Gambar 2.4 Start Program Delphi
2. Kemudian pilih menu file, new, application.
Gambar 2.5 New Application
3. Pada
object inspector,
33 ubah properti captionnya dengan nama Equalization, dan namenya dengan nama FormEqualization.
Gambar 2.6 Object Inspector 4. Simpan unit dan projectnya dengan cara save all.
Gambar 2.7 Save All 5. Beri nama unitnya dengan nama UnitEqualization.
Gambar 2.8 Save UnitEqualization
34 6. Beri nama projectnya dengan nama ProjectEqualization.
Gambar 2.9 Save ProjectEqualization 7. Tambahkan image ke form dengan cara pilih menu Additional, image, lalu klik ke form.
Gambar 2.10 Menu Image 8. Rubah stretchnya ke true dan autosizenya true.
Gambar 2.11 Stretch True
35 9. Dengan cara yang sama tambahkan image2 di sebelah kanan image1 kemudian ubah stretchnya ke true dan autosizenya true.
Gambar 2.12 Penambahan Image 2 10. Tambahkan button ke form, dengan cara pilih menu standart, button, lalu klik ke form
Gambar 2.13 Menu Button 11. Pada oject inspector rubah properti captionnya dengan nama Open, kemudian namenya dengan nama btOpen.
Gambar 2.14 Button Open
36 12. Tambahkan OpenPictureDialog ke form, dengan cara pilih menu dialog, OpenPictureDialog, lalu klik ke form.
Gambar 2.15 Menu OpenPictureDialog
13. Hasilnya sebagai berikut.
Gambar 2.16 Hasil OpenPictureDialog 14. Doble klik button open kemudian ketik program yang di hurup tebal berikut. var FormEqualization: TFormEqualization; FileNameImg: string; implementation {$R *.dfm} procedure TFormEqualization.btOpenClick(Sender: TObject); begin if OpenPictureDialog1.Execute then begin Caption := 'Histogram Equalization : OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile (OpenPictureDialog1.FileName); Image2.Visible := False; end; end; end.
'+
37 15. Tambahkan button pada form, pada object inspector rubah properties captionnya dengan nama Equalization dan Namenya dengan nama btEqualization.
Gambar 2.17 Button Equalization 16. Tambahkan ProgressBar ke form dengan cara, ProgressBar. Lalu klik ke form, lalu geser kekanan.
Gambar 2.18 Menu ProgresBar
17. Hasilnya sebagai berikut.
Gambar 2.19 Hasil ProgresBar
18. Tambahkan unit baru, dengan cara file, new unit.
pilih
menu
Win32,
38
Gambar 2.20 New Unit 19. Simpan unitnya dengan cara save as.
Gambar 2.21 Save All
20. Berinama unitnya dengan nama UnitImageProses.
Gambar 2.22 Save UnitImageProses 21. Hasilnya sebagai berikut.
39
Gambar 2.23 Hasil Save UnitImageProses
22. Ketik program berikut ke dalam UnitImageProses. unit UnitImageProses; interface uses WINPROCS, Graphics, ExtCtrls, ComCtrls; type TFreqHist = array [0..255] of longint; function ImgGetGray (var Image:TImage; x,y:integer) : byte; procedure ImgHistogramEqu (var Image:TImage; var TProgressBar); implementation const PercentR = 0.299; PercentG = 0.587; PercentB = 0.114; function ByteRange (r:double) : byte; begin if r<0 then ByteRange:=0 else if r>255 then ByteRange:=255 else ByteRange:=Round(r); end; function RgbToGray (Clr:TColor) : byte; var r,g,b:byte; begin r := GetRValue(Clr);
ProgressBar1:
40 g := GetGValue(Clr); b := GetBValue(Clr); RgbToGray := ByteRange (r*PercentR + g*PercentG + b*PercentB); 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 ImgHistogramEqu (var TProgressBar); var x,y,i:integer; Clr:TColor; ClrGray:byte; Freq, NewColor: TFreqHist; TotFreq, ImgSize: longint; begin ProgressBar1.Max := Image.Width-1; ProgressBar1.Position := 0; { set Frek[i]=0 } for i:=0 to 255 do Freq[i]:=0; { hitung frekuensi tiap warna } 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]); end;
Image:TImage;
var
ProgressBar1:
41 { hitung pixel baru } TotFreq := 0; ImgSize := Image.Width * Image.Height; for i:=0 to 255 do begin Inc (TotFreq, Freq[i]); NewColor[i] := Round((TotFreq/ImgSize)*255); end; { tuliskan pixel baru } for x:=0 to Image.Width-1 do begin for y:=0 to Image.Height-1 do begin ClrGray := ImgGetGray (Image,x,y); ClrGray := ByteRange (NewColor[ClrGray]); Image.Canvas.Pixels[x,y] := RGB (ClrGray,ClrGray,ClrGray); end; ProgressBar1.Position := x; Image.Repaint; end; end; end. 23. Kembali ke FormEqualization, caranya klik unitEqualization
Gambar 2.24 Kembali ke FormEqualization
24. Lalu klik toggle form.
42
Gambar 2.25 Menu Toggle Form
25. Doble klik button Equalization.
Gambar 2.26 Klik Button Equalization 26. Lalu ketik program dengan hurup tebal berikut. procedure TFormEqualization.btEqualizationClick(Sender: TObject); begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; ImgHistogramEqu(Image2,ProgressBar1); end; 27. Dibawah implementasi ketik program yang tertulis huruf tebal berikut. implementation {$R *.dfm} uses UnitImageProses; 28. Tambahkan button ke form, lalu pada object inspector rubah properties captionnya dengan nama Exit dan namenya dengan nama btExit.
43
Gambar 2.27 Button Exit 29. Doble klik button Exit, lalu ketik program berikut. procedure TFormEqualization.btExitClick(Sender: TObject); begin FormEqualization.Close; end; 30. Simpan program dengan cara file save all. 31. Compiler progran dengan cara pilih menu Project, Compile ProjectEqualization.
Gambar 2.28 Compile ProjectEqualization
32. Lalu jalankan progran dengan cara pilih menu Run, Run.
44
Gambar 2.29 Run ProjectEqualization 33. Hasil sebagai berikut.
Gambar 2.30 Hasil Program Equalization 34. Keluar dari program klik button Exit.
2.3 PROGRAM HISTOGRAM EQUALIZATION SELENGKAPNYA ADALAH SEBAGAI BERIKUT: unit UnitEqualization; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtDlgs, StdCtrls, ExtCtrls, ComCtrls; type TFormEqualization = class(TForm) Image1: TImage; Image2: TImage; btOpen: TButton; OpenPictureDialog1: TOpenPictureDialog;
45 btEqualization: TButton; ProgressBar1: TProgressBar; btExit: TButton; procedure btOpenClick(Sender: TObject); procedure btEqualizationClick(Sender: TObject); procedure btExitClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var FormEqualization: TFormEqualization; FileNameImg: string; implementation {$R *.dfm} uses UnitImageProses; procedure TFormEqualization.btOpenClick(Sender: TObject); begin if OpenPictureDialog1.Execute then begin Caption := 'Histogram Equalization : '+ OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile (OpenPictureDialog1.FileName); Image2.Visible := False; end; end; procedure TFormEqualization.btEqualizationClick(Sender: TObject); begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; ImgHistogramEqu(Image2,ProgressBar1); end; procedure TFormEqualization.btExitClick(Sender: TObject); begin FormEqualization.Close; end; end. unit UnitImageProses; interface
46
uses WINPROCS, Graphics, ExtCtrls, ComCtrls; type TFreqHist = array [0..255] of longint; function ImgGetGray (var Image:TImage; x,y:integer) : byte; procedure ImgHistogramEqu (var Image:TImage; var ProgressBar1: TProgressBar); implementation const PercentR = 0.299; PercentG = 0.587; PercentB = 0.114; function ByteRange (r:double) : byte; begin if r<0 then ByteRange:=0 else if r>255 then ByteRange:=255 else ByteRange:=Round(r); end; function RgbToGray (Clr:TColor) : byte; var r,g,b:byte; begin r := GetRValue(Clr); g := GetGValue(Clr); b := GetBValue(Clr); RgbToGray := ByteRange (r*PercentR + g*PercentG + b*PercentB); 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
47 ClrGray := ImgGetGray (Image1,x,y); Image1.Canvas.Pixels[x,y] := RGB (ClrGray,ClrGray,ClrGray); end; Image1.Repaint; ProgressBar1.Position := x; end; end; procedure ImgHistogramEqu (var Image:TImage; var ProgressBar1: TProgressBar); var x,y,i:integer; Clr:TColor; ClrGray:byte; Freq, NewColor: TFreqHist; TotFreq, ImgSize: longint; begin ProgressBar1.Max := Image.Width-1; ProgressBar1.Position := 0; { set Frek[i]=0 } for i:=0 to 255 do Freq[i]:=0; { hitung frekuensi tiap warna } 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]); end; { hitung pixel baru } TotFreq := 0; ImgSize := Image.Width * Image.Height; for i:=0 to 255 do begin Inc (TotFreq, Freq[i]); NewColor[i] := Round((TotFreq/ImgSize)*255); end; { tuliskan pixel baru } for x:=0 to Image.Width-1 do begin for y:=0 to Image.Height-1 do begin ClrGray := ImgGetGray (Image,x,y); ClrGray := ByteRange (NewColor[ClrGray]); Image.Canvas.Pixels[x,y] := RGB (ClrGray,ClrGray,ClrGray); end; ProgressBar1.Position := x; Image.Repaint;
48 end; end; end.
49
50
BAB 3 WIENER FILTER 3.1 TEORI WIENER FILTER Wiener filter merupakan discrete time linier finite impulse response (FIR) filter. Prinsip ini telah dikembangkan luas untuk rekontruksi dari sinyal satu dimensi dan citra dua dimensi. Meskipun demikian wiener filter sensitive terhadap nois, tepi filter tersebut dapat mengkontruksi citra secara bagus (Mauridhi , Arif ,2010). Wiener filter mencari sebuah estimasi f^ yang meminimisasi fungsi kesalahan statistic dapat ditulis menggunakan persamaan e2 = E { (f – f^)2 }…………………...........................................……………(3.1) Dimensi E{.} adalah nilai argument yang diharapkan. Dimana f^ (x,y) = w(x,y) * g(x,y)…………......................................…………..(3.2) Dimana w(x,y) adalah Wiener Filter Persamaan (3.1) dapat diuraikan menjadi E{(f(x,y) –f^(x,y))2} = E[f(x,y)2] + E[f^(x,y)2] – 2E[f(x,y)f^(x,y)] =Rf(x,y)+E[{w(x,y)*g(x,y)}2] – 2 E[f(x,y){w(x,y)*g(x,y)}]...........(3.3) Dimana Rf(x,y) = E[f(x,y)2] Berdasarkan persamaan diatas, maka error nya dapat dinyatakan dalam bentuk persamaan e2 = Rf(x,y)+w(x,y)*h(x,y)*Rf(x,y)*h(x,y)*w(x,y)*w(x,y)*Rf(x,y)*w(x,y) – 2w(x,y)*h(x,y)*Rf(x,y)………………...............................................…….(3.4) Persamaan tersebut diatas dapat ditulis dalam bentuk matrik e2 = Tr[[Rf]+[w][H][Rf][H]T[w]+[w][Rn][w]T – 2[w][H][Rf]]…………………………..(3.5) Dan [w]opt = [Rf][H]T[[H][Rf][H]T + [Rn]]-1………………............................……..(3.6) Dengan menggunakan aplikasi Transformasi Fourier, maka akan menghasilkan W(u,v) =
&∗(*,+),-(*,+) ………….......................................…………(3.7) |&(*,+)]2 .-(*,+)+.! (*,+)
51 Jika persamaan (3.7) dibagi dengan Sf(u,v),maka akan dihasilkan persamaan W(u,v) =
&∗(*,+) ………….......................................…….….(3.8) |&(*,+)]2 +.!(*,+)/,-(* ,+)
Dan F^(u,v) = w(u,v) G(u,v)………………………............................……………(3.9) Dan asumsi bahwa citra dan nois tidak saling berkorelasi dan salah satu dari keduanya adalah zero mean. Estimasi dari citra asli diberikan dalam domain frekwensi dari persamaan diatas dalam bentuk model sebagai berikut: F^ (u,v) =
/(*,+)|&(*,+)|+ 0(*,+)| &∗(*,+)| ……..........................………………..(3.10) |&(* ,+)|2 +.!(*,+)/,-(* ,+)
H(u,v) adalah transformasi fourier dari mekanisme degradasi representasi suatu fungsi dan G(u,v) adalah spectrum dari image yang terdegradasi. Power spectrum dari nois dan citra asli masing-masing dapat direpresentasikan dalam bentuk persamaan. Sn(u,v) = |N(u,v)|2…………………………....................…………………(3.11) Dan sf(u,v) = |F(u,v)|2…………………………….....................………….(3.12)
3.2 CARA MEMBUAT PROGRAM WIENER FILTER LAKUKAN LANGKAH BERIKUT: 1. Buka program delphi, dengan cara pilih menu start, program borland delphi 7, delphi 7.
Gambar 3.1 Start Program
2. Kemudian pilih menu file, new, application.
52
Gambar 3.2 New Aplication
3. Pada object inspector, ubah properti captionnya dengan nama Wiener Filter, dan namenya dengan nama FormWienerFilter.
Gambar 3.3 Form Wiener Filter 4. Simpan unit dan projectnya dengan cara save all.
Gambar 3.4 Save All
5. Beri nama unitnya dengan nama UnitWienerFilter.
53
Gambar 3.5 Unit Wiener Filter 6. Beri nama projectnya dengan nama ProjectWienerFilter.
Gambar 3.6 Project Wiener Filter 7. Tambahkan image ke form dengan cara pilih menu Additional, image, lalu klik ke form.
Gambar 3.7 Menu Image 8. Rubah stretchnya ke true dan autozizenya true.
54
Gambar 3.8 Stretch True 9. Dengan cara yang sama tambahkan image2 di sebelah kanan image1 kemudian ubah stretchnya ke true dan auto sizenya true.
Gambar 3.9 Penambahan Image 2 10. Tambahkan button ke form, dengan cara pilih menu standart, button, lalu klik ke form
Gambar 3.10 Menu Button
11. Pada oject inspector rubah properti captionnya dengan nama Open, kemudian namenya dengan nama btOpen.
55
Gambar 3.11 Button Open 12. Tambahkan OpenPictureDialog ke form, dengan cara pilih menu dialog, OpenPictureDialog, lalu klik ke form.
Gambar 3.12 Menu OpenPictureDialog 13. Hasilnya sebagai berikut.
Gambar 3.13 Hasil OpenPictureDialog
14. Doble klik button open kemudian ketik program yang di hurup tebal berikut. var
56 FormWienerFilter: TFormWienerFilter; FileNameImg: string; implementation {$R *.dfm} procedure TFormWienerFilter.btOpenClick(Sender: TObject); begin if OpenPictureDialog1.Execute then begin FileNameImg := OpenPictureDialog1.FileName; Caption := 'Wiener Filter : '+ OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile (OpenPictureDialog1.FileName); Image2.Visible := False; end; end; 15. Tambahkan button pada form, pada object inspector rubah properties captionnya dengan nama WienerFilter dan Namenya dengan nama btWienerFilter.
Gambar 3.14 Button Wiener Filter 16. Tambahkan ProgressBar ke ProgressBar. Lalu klik ke form.
form
dengan
cara,
Gambar 3.15 Menu ProgressBar 17. Hasilnya sebagai berikut.
pilih
menu
Win32,
57
Gambar 3.16 Hasil Progress Bar 18. Tambahkan unit baru, dengan cara file, new unit.
Gambar 3.17 New Unit 19. Simpan unitnya dengan cara save as.
Gambar 3.18 Save All
20. Beri nama unitnya dengan nama UnitImageProses.
58
Gambar 3.19 Save UnitImageProses 21. Hasilnya sebagai berikut.
Gambar 3.20 Hasil Unit Image Proses
22. 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);
59
procedure ImgFilterWiener (var Image:TImage; nCol,nRow:byte; var ProgressBar1: TProgressBar);
Mtrx:TMatrixFilter;
implementation const PercentR = 0.299; PercentG = 0.587; PercentB = 0.114; function ByteRange (r:double) : byte; begin if r<0 then ByteRange:=0 else if r>255 then ByteRange:=255 else ByteRange:=Round(r); end; function RgbToGray (Clr:TColor) : byte; var r,g,b:byte; begin r := GetRValue(Clr); g := GetGValue(Clr); b := GetBValue(Clr); RgbToGray := ByteRange (r*PercentR + g*PercentG + b*PercentB); 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;
60 end; procedure ImgFilterWiener (var Image:TImage; nCol,nRow:byte; var ProgressBar1: TProgressBar); var dx,dy:byte; ImgTemp:TImage; mean,pSpectrum:Variant; pSpectrumNoise: real;
Mtrx:TMatrixFilter;
procedure CalculateParameter (x,y:integer); var row,col:integer; clrGray,tot,tot2:real; begin tot:=0; tot2:=0; for col:=1 to nCol do for row:=1 to nRow do begin clrGray := ImgGetGray (ImgTemp, x+col-dx-1, y+row-dy-1); tot := tot + Mtrx[col,row] * clrGray; tot2 := tot2 + Mtrx[col,row] * Sqr(clrGray); end; mean[x,y] := tot/(nCol*nRow); pSpectrum[x,y] := tot2/(nCol*nRow) - mean[x,y]; end; procedure CalculatePixel (x,y:integer; var clrGray:byte); var c:real; begin clrGray := ImgGetGray (ImgTemp, x,y); c := mean[x,y] + pSpectrum[x,y]/(pSpectrum[x,y]+pSpectrumNoise) * (clrGray-mean[x,y]); clrGray := ByteRange (c); end; var x,y: integer; clrGray: byte; begin dx := nCol div 2; dy := nRow div 2; ImgTemp := TImage.Create (Image.Parent); ImgTemp.Picture.Graphic := Image.Picture.Graphic;; mean := VarArrayCreate([0,Image.Width-1, 0,Image.Height-1], varSingle); pSpectrum := VarArrayCreate([0,Image.Width-1, 0,Image.Height-1], varSingle); pSpectrumNoise := 0; { parameter }
61 ProgressBar1.Max := Image.Width; ProgressBar1.Position := 0; pSpectrumNoise := 0; for x:=dx to Image.Width-1-dx do begin for y:=dy to Image.Height-1-dy do begin CalculateParameter (x,y); pSpectrumNoise := pSpectrumNoise + pSpectrum[x,y]; Image.Canvas.Pixels[x,y] := RGB (clrGray,clrGray,clrGray); end; { for y } ProgressBar1.Position := x; end; { for x } pSpectrumNoise := pSpectrumNoise / (Image.Width-dx)/(Image.Height-dy); ProgressBar1.Position := ProgressBar1.Max; { filtering process } for x:=dx to Image.Width-1-dx do begin for y:=dy to Image.Height-1-dy do begin CalculatePixel (x,y, clrGray); Image.Canvas.Pixels[x,y] := RGB (clrGray,clrGray,clrGray); end; { for y } ProgressBar1.Position := x; end; { for x } ProgressBar1.Position := ProgressBar1.Max; Image.Repaint; end; end. 23. Kembali ke FormWienerFilter, caranya klik UnitWienerFilter.
Gambar 3.21 Kembali ke FormWienerFilter 24. Lalu klik toggle form.
62
Gambar 3.22 Menu Toggle 25. Doble klik button WienerFilter.
Gambar 3.23 Klik Button Wiener Filter 26. Lalu ketik program berikut. procedure TFormWienerFilter.btWienerFilterClick(Sender: TObject); var Mtrx:TMatrixFilter; nRow,nCol,r,c:integer; begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; begin nRow:=3; nCol:=3; for c:=1 to nCol do for r:=1 to nRow do Mtrx[r,c]:=1; ImgFilterWiener (Image2, Mtrx,nCol,nRow, ProgressBar1); end; end;
27. Dibawah implementasi ketik program yang tertulis huruf tebal berikut. implementation {$R *.dfm}
63 uses UnitImageProses; 28. Tambahkan button ke form, lalu pada object inspector rubah properties captionnya dengan nama Exit dan namenya dengan nama btExit.
Gambar 3.24 Button Exit 29. Doble klik button Exit, lalu ketik program berikut. procedure TFormWienerFilter.btExitClick(Sender: TObject); begin FormWienerFilter.Close; end;
30. Compiler progran dengan cara pilih menu Project, Compile ProjectWienerFilter.
Gambar 3.25 Menu Compile
31. Lalu jalankan progran dengan cara pilih menu Run, Run.
64
Gambar 3.26 Menu Run 32. Hasil sebagai berikut.
Gambar 3.27 Hasil Wiener Filter 33. Keluar dari program klik button Exit.
3.3 PROGRAM WIENER FILTER SELENGKAPNYA ADALAH SEBAGAI BERIKUT: unit UnitWienerFilter; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtDlgs, StdCtrls, ExtCtrls, ComCtrls; type TFormWienerFilter = class(TForm) Image1: TImage; Image2: TImage; btOpen: TButton; OpenPictureDialog1: TOpenPictureDialog; btWienerFilter: TButton;
65 ProgressBar1: TProgressBar; btExit: TButton; procedure btOpenClick(Sender: TObject); procedure btWienerFilterClick(Sender: TObject); procedure btExitClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var FormWienerFilter: TFormWienerFilter; FileNameImg: string; implementation {$R *.dfm} uses UnitImageProses; procedure TFormWienerFilter.btOpenClick(Sender: TObject); begin if OpenPictureDialog1.Execute then begin FileNameImg := OpenPictureDialog1.FileName; Caption := 'Wiener Filter : '+ OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile (OpenPictureDialog1.FileName); Image2.Visible := False; end; end; procedure TFormWienerFilter.btWienerFilterClick(Sender: TObject); var Mtrx:TMatrixFilter; nRow,nCol,r,c:integer; begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; begin nRow:=3; nCol:=3; for c:=1 to nCol do for r:=1 to nRow do Mtrx[r,c]:=1; ImgFilterWiener (Image2, Mtrx,nCol,nRow, ProgressBar1); end; end; procedure TFormWienerFilter.btExitClick(Sender: TObject);
66 begin FormWienerFilter.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 ImgFilterWiener (var Image:TImage; Mtrx:TMatrixFilter; nCol,nRow:byte; var ProgressBar1: TProgressBar); implementation const PercentR = 0.299; PercentG = 0.587; PercentB = 0.114; function ByteRange (r:double) : byte; begin if r<0 then ByteRange:=0 else if r>255 then ByteRange:=255 else ByteRange:=Round(r); end; function RgbToGray (Clr:TColor) : byte; var r,g,b:byte; begin r := GetRValue(Clr); g := GetGValue(Clr); b := GetBValue(Clr); RgbToGray := ByteRange (r*PercentR + g*PercentG + b*PercentB); end;
67 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 ImgFilterWiener (var Image:TImage; Mtrx:TMatrixFilter; nCol,nRow:byte; var ProgressBar1: TProgressBar); var dx,dy:byte; ImgTemp:TImage; mean,pSpectrum:Variant; pSpectrumNoise: real; procedure CalculateParameter (x,y:integer); var row,col:integer; clrGray,tot,tot2:real; begin tot:=0; tot2:=0; for col:=1 to nCol do for row:=1 to nRow do begin clrGray := ImgGetGray (ImgTemp, x+col-dx-1, y+row-dy-1); tot := tot + Mtrx[col,row] * clrGray; tot2 := tot2 + Mtrx[col,row] * Sqr(clrGray); end; mean[x,y] := tot/(nCol*nRow); pSpectrum[x,y] := tot2/(nCol*nRow) - mean[x,y]; end; procedure CalculatePixel (x,y:integer; var clrGray:byte); var c:real; begin clrGray := ImgGetGray (ImgTemp, x,y); c := mean[x,y] + pSpectrum[x,y]/(pSpectrum[x,y]+pSpectrumNoise)
68 * (clrGray-mean[x,y]); clrGray := ByteRange (c); end; var x,y: integer; clrGray: byte; begin dx := nCol div 2; dy := nRow div 2; ImgTemp := TImage.Create (Image.Parent); ImgTemp.Picture.Graphic := Image.Picture.Graphic;; mean := VarArrayCreate([0,Image.Width-1, 0,Image.Height-1], varSingle); pSpectrum := VarArrayCreate([0,Image.Width-1, 0,Image.Height-1], varSingle); pSpectrumNoise := 0; { parameter } ProgressBar1.Max := Image.Width; ProgressBar1.Position := 0; pSpectrumNoise := 0; for x:=dx to Image.Width-1-dx do begin for y:=dy to Image.Height-1-dy do begin CalculateParameter (x,y); pSpectrumNoise := pSpectrumNoise + pSpectrum[x,y]; Image.Canvas.Pixels[x,y] := RGB (clrGray,clrGray,clrGray); end; { for y } ProgressBar1.Position := x; end; { for x } pSpectrumNoise := pSpectrumNoise / (Image.Width-dx)/(Image.Height-dy); ProgressBar1.Position := ProgressBar1.Max; { filtering process } for x:=dx to Image.Width-1-dx do begin for y:=dy to Image.Height-1-dy do begin CalculatePixel (x,y, clrGray); Image.Canvas.Pixels[x,y] := RGB (clrGray,clrGray,clrGray); end; { for y } ProgressBar1.Position := x; end; { for x } ProgressBar1.Position := ProgressBar1.Max; Image.Repaint;
69 end; end.
70
BAB 4 GLOBAL THRESHOLDING 4.1 DASAR TEORI GLOBAL THRESHOLDING Tresholding adalah suatu metode untuk menghasilkan citra biner hitam (0) dan putih (1), dengan menggunkan rumus sebagai berikut: 1 "5#6 -(2, 3) ≥ 8 9…………………………………….………………………..4.1 1(2, 3) = 4 0 "5#6 -(2, 3) < 8 Dengan g(x,y) adalah citra biner dari citra grascale f(x,y), dan T merupakan nilai ambang.
4.2 CARA MEMBUAT PROGRAM THRESOLDING: 1. Klik tombol start lalu Program, Borland Delphi 7, Delphi 7. Nanti akan muncul gambar berikut:
Gambar 4.1 Start Program
2. P a d a o b
71 ject inspector berinama captionnya dengan Global Thresholding dan namenya dengan nama FormGlobalThreshold.
Gambar 4.2 Form Global Thresholding
3. Tambahkan image1, image2, OpenPictureDialog dan button1 ke form. Pada object inspector stetch kedua image di ganti true, kemudian caption pada button diganti dengan Open, Namenya dengan btOpen.
Gambar
4.3 Button Open
72 4. Simpan project dan unitnya dengan cara save all.
Gambar 4.4 Save All
5. Beri nama unitnya dengan nama UnitGlobalThresolding. Projectnya dengan nama ProjectGlobalThresolding.
Gambar 4.5 Save Unit Global Thresolding
73 6. Berinama Projectnya dengan nama ProjectGlobalThresolding.
Gambar 4.6 Save Project Global Thresolding
7. Doble clik button open, lalu keting program berikut: var GlobalThreshold: TGlobalThreshold; FileNameImg: string; implementation {$R *.dfm} procedure TGlobalThreshold.btOpenClick(Sender: TObject); begin if OpenPictureDialog1.Execute then begin FileNameImg := OpenPictureDialog1.FileName; Caption := 'Mammo Analisys : '+ OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile (OpenPictureDialog1.FileName); Image2.Visible := False; end; end; end.
74 8. Tambahkan button ke form, beri nama captionnya dengan Global Thresolding dan namenya dengan btGlobalThresholding dan tambahkan juga ProgresBar kedalam form.
Gambar 4.7 Button Thresolding
9. Tambahkan unit dengan cara file new unit.
Gambar 4.8 New Unit
10. Simpan unitnya dengan cara file save as, beri nama dengan ImageProses.
75
Gambar 4.9 Save Image Proses 11. Kemudian ketik program berikut pada unit imageproses: unit ImageProses; 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 ImgGlobalThresholding (var Image:TImage; var thres:real; var ProgressBar1: TProgressBar); implementation const PercentR = 0.299; PercentG = 0.587; PercentB = 0.114; function ByteRange (r:double) : byte; begin if r<0 then ByteRange:=0
76 else if r>255 then ByteRange:=255 else ByteRange:=Round(r); end; function RgbToGray (Clr:TColor) : byte; var r,g,b:byte; begin r := GetRValue(Clr); g := GetGValue(Clr); b := GetBValue(Clr); RgbToGray := ByteRange (r*PercentR + g*PercentG + b*PercentB); 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 ImgGlobalThresholding (var Image:TImage; var thres:real; var ProgressBar1: TProgressBar); var x,y,counter:integer; m1,m2,n1,n2:real; Clr:TColor; ClrGray:byte; thresOld:real; begin ProgressBar1.Max := 5; ProgressBar1.Position := 0; counter := 0; repeat thresOld := thres; m1:=0; m2:=0; n1:=0; n2:=0;
77 for x:=0 to Image.Width-1 do for y:=0 to Image.Height-1 do begin ClrGray := ImgGetGray (Image,x,y); if ClrGray
12. Tambahkan Label1, Label2, Label3 kemudian ganti captionnya dengan nama masing-masing THRESHOLD, AWAL, AKHIR. Kemudian tambahkan
78 Edit (ada pada Standard) ke form beri namenya dengan EditThreshold dan Text = 12. Seperti berikut ini.
Gambar 4.10 Edit Thresolding
13. Tambahkan program berikut ke UnitGlobalThressolding. implementation {$R *.dfm} uses ImageProses; 14. Doble klik button Global Thresolding lalu ketik program berikut procedure TGlobalThreshold.btGlobalThresoldingClick(Sender: TObject); var thres:real; begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; thres := StrToFloatDef (EditThreshold.Text,5); ImgGlobalThresholding (Image2,thres,ProgressBar1); EditThreshold.Text := IntToStr(Round(thres)); end;
15. Tambahkan button ke dalam form lalu captionnya diganti dengan Exit, namenya diberinama btExit.
79
Gambar 4.11 Button Exit 16. Doble klik button exit kemudin ketik program berikut. procedure TFormGlobalThreshold.btExitClick(Sender: TObject); begin FormGlobalThreshold.Close; end; 17. Simpan program dengan save all, kemudian jalankan progran dengan cara compile kemudian run. Hasilnya sebagai berikut.
Gambar 4.12 Hasil Program Thresolding
18. Tutup program tekan button exit.
80
4.3 PROGRAM GLOBAL THRESOLDING SELENGKAPNYA ADALAH SEBAGAI BERIKUT: unit UnitGlobalThresolding; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ExtDlgs, ComCtrls; type TFormGlobalThreshold = class(TForm) Image1: TImage; Image2: TImage; btOpen: TButton; OpenPictureDialog1: TOpenPictureDialog; btGlobalThresolding: TButton; ProgressBar1: TProgressBar; EditThreshold: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; btExit: TButton; procedure btOpenClick(Sender: TObject); procedure btGlobalThresoldingClick(Sender: TObject); procedure btExitClick(Sender: TObject);
private { Private declarations } public { Public declarations } end; var FormGlobalThreshold: TFormGlobalThreshold; FileNameImg: string; implementation {$R *.dfm} uses ImageProses;
81
procedure TFormGlobalThreshold.btOpenClick(Sender: TObject); begin if OpenPictureDialog1.Execute then begin FileNameImg := OpenPictureDialog1.FileName; Caption := 'Mammo Analisys : '+ OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile (OpenPictureDialog1.FileName); Image2.Visible := False; end; end; procedure TFormGlobalThreshold.btGlobalThresoldingClick(Sender: TObject); var thres:real; begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; thres := StrToFloatDef (EditThreshold.Text,5); ImgGlobalThresholding (Image2,thres,ProgressBar1); EditThreshold.Text := IntToStr(Round(thres)); end; procedure TFormGlobalThreshold.btExitClick(Sender: TObject); begin FormGlobalThreshold.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 ImgGlobalThresholding (var Image:TImage; var thres:real; var ProgressBar1: TProgressBar); implementation
82 const PercentR = 0.299; PercentG = 0.587; PercentB = 0.114; function ByteRange (r:double) : byte; begin if r<0 then ByteRange:=0 else if r>255 then ByteRange:=255 else ByteRange:=Round(r); end; function RgbToGray (Clr:TColor) : byte; var r,g,b:byte; begin r := GetRValue(Clr); g := GetGValue(Clr); b := GetBValue(Clr); RgbToGray := ByteRange (r*PercentR + g*PercentG + b*PercentB); 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 ImgGlobalThresholding (var Image:TImage; var thres:real; var ProgressBar1: TProgressBar); var x,y,counter:integer; m1,m2,n1,n2:real; Clr:TColor; ClrGray:byte;
83 thresOld:real; begin ProgressBar1.Max := 5; ProgressBar1.Position := 0; counter := 0; repeat thresOld := thres; m1:=0; m2:=0; n1:=0; n2:=0; for x:=0 to Image.Width-1 do for y:=0 to Image.Height-1 do begin ClrGray := ImgGetGray (Image,x,y); if ClrGray
BAB 5 HISTOGRAM CUT
84
5.1 DASAR TEORI HISTOGRAM CUT Histogram Cut digunakan untuk mencerahkan (enlightmen) image berdasarkan distribusi frekuensi citra. Algoritma Histogram Cut 1. Masukkan nilai black_thres = 2. 2. Hitung frekuensi kemunculan nilai gray 3. Hitung frekuansi total dari gray (imgsize awal) 4. Bila nilai gray < black_thres, maka tidak ikut diperhitungkan, karena dianggap benar-benar background. 5. Hitung imgsizebaru = imgsize awal – frekkuensi yang tidak diperhitungkan. 6. Cari nilai gray maksimum 7. Cari nilai threshold dengan cara menghitung frekuensi kumulatif dimulai dari gray tertinggi. 8. Threshold ditentukan berdasarkan nilai gray dimana ditemukan frekuensi kumulatif > imgsizebaru/2. 9. Bila nilai gray < thresodl maka nilai grayBaru = 0. 10. Lakukan transformasi linear grayBaru = clrGray / clrGrayMax * 20 (karena skala maksimum 20,pada program sebenarnya 255). 11. Sehingga didapat image yang lebih kontras. 12. Ulangi langkah 2 sampai langkah 10 sampai didapat image dengan kontras yang diinginkan.
Cara kerja Histogram Thresholding (Histogram Cut). 1.Misalkan skala keabuan antara 0-20, dan didapatkan distribusi frekuensi sbb. Gray 0
frek 10
1 2 3
20 5 8
4 5 6
7 11 10
7 8 9 10 11
20 5 5 7 8
12
0
Keterangan Misalkan Black_Thres=2, maka nilai gray <= 2 tidak ikut di perhitungkan (dianggap benar-benar background) ß batas Black thres Proses dilanjutkan dengan menghitung imgSize berdasarkan kasus ini imgSize = 116-10-20-5 = 81
Pada saat yang sama juga dicari nilai maksimum, pada kasus ini ditemukan clrGrayMax = 11
çclrGrayMax (artinya nilai intensitas pixel maksimum adalah 11)
85 13 14 15 16 17 18 19 20 Total
0 0 0 0 0 0 0 0 116
2.Proses berikutnya mencari threshold dengan cara mencari frekuensi kumulatif dimulai dari gray tertinggi. Threshold ditentukan berdasarkan nilai gray dimana frekuensi kumulatif > imgSize /2 ( dalam hal ini 81/2 = 40,5). Gray
Frek
Frek Kum
0 1 2 3 4 5 6 7
10 20 5 8 7 11 10 20
81 73 66 55 45
8 9 10 11
5 5 7 8
25 20 15 8
12 13 14 15 16 17 18 19 20 Total
0 0 0 0 0 0 0 0 0 116
Keterangan
Frek kum = 73 + 8 = 81 Frek kum = 66 + 7 = 73 Frek kum = 55 + 11 = 66 Frek kum = 45 + 10 = 55 Frek kum = 25 + 20 = 45 ( pada titik ini pertama kali ditemukan frek kumulatif >= imgSize/2= 40,5. Maka nilai threshold yang baru = 7. Frek kum = 20 + 5 = 25 Frek kum = 15 + 5 = 20 Gray 10, frek 7, frek kum = 8+7=15 Frek kumulatif mulai dari sini gray 11, frek 8, frek kum = 8
3.Kemudian dilakukan transformasi linier grayBaru = clrGray / clrGrayMax* 20 (karena skala maksimum 20, pada program sebenarnya 255). Sementara nilai gray < threshold dijadikan 0.
86 Gray 0 1 2 3 4 5
Frek 10 20 5 8 7 11
Gray Baru 0 0 0 0 0 0
6 7 8 9
10 20 5 5
0 13 15 16
10 11 12 13 14 15 16 17 18 19 20 Total
7 8 0 0 0 0 0 0 0 0 0 116
18 20
Keterangan
Perubahan nilai gray, lebih kecil dari threshold maka lebih gelap 6 < 7 maka gray baru = 0 Gray baru = 7/11 * 20 =12,7 = 13 Gray baru = 8/11 * 20 =14,5 = 15 Perubahan nilay gray, yang lebih besar dari threshold maka lebih cerah
4.Akhirnya dihasilkan image yang lebih kontras dengan distribusi frekuensi sebagai berikut: Gray 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
Frek lama 10 20 5 8 7 11 10 20 5 5 7 8 0 0 0
Frek baru 71
keterangan Background Kosong artinya o
20
Hasil perhitungan piksel baru diatas
87 15 16 17 18 19 20 Total
0 0 0 0 0 0 116
5 5
Hasil perhitungan piksel baru diatas Hasil perhitungan piksel baru diatas
7
Hasil perhitungan piksel baru diatas
8 116
Hasil perhitungan piksel baru diatas
5. ulangi langkah 2 sampai langkah 4, Proses histogram thresholding bias dilakukan berulangkali sehingga dihasilkan image yang semakin kontras. Makanya pada procedurenya, penulis tambahkan parameter nRepeat.
88
5.2 CARA MEMBUAT PROGRAM HISTOGRAMCUT LAKUKAN LANGKAH BERIKUT: 1. Buka program delphi, dengan cara pilih menu start, program borland delphi 7, delphi 7.
Gambar 5.1 Start Program 2. Kemudian pilih menu file, new, application.
Gambar 5.2 New Aplication
3. Pada object inspector, ubah properti captionnya dengan nama HistogramCut, dan namenya dengan nama FormHistogramCut.
89
Gambar 5.3 Form Histogram Cut 21. Simpan unit dan projectnya dengan cara save all.
Gambar 5.4 Save All 22. Beri nama unitnya dengan nama UnitHistogramCut.
Gambar 5.5 Save UnitHistogramCut 23. Beri nama projectnya dengan nama ProjectHistogramCut.
90
Gambar 5.6 Save ProjectHistogramCut 24. Tambahkan image ke form dengan cara pilih menu Additional, image, lalu klik ke form.
Gambar 5.7 Menu Image 25. Pada properties rubah stretchnya ke true dan autosizenya true.
Gambar 5.8 AutoSize True
26. Dengan cara yang sama tambahkan image2 di sebelah kanan image1 kemudian ubah stretchnya ke true dan autosizenya true.
91
Gambar 5.9 Penambahan Image 2
27. Tambahkan button ke form, dengan cara pilih menu standart, button, lalu klik ke form.
Gambar 5.10 Menu Button 28. Pada oject inspector rubah properti captionnya dengan nama Open, kemudian namenya dengan nama btOpen.
Gambar 5.11 Button Open
29. Tambahkan OpenPictureDialog ke form, dengan cara pilih menu dialog, OpenPictureDialog, lalu klik ke form.
92
Gambar 5.12 Menu OpenPictureDialog 30. Hasilnya sebagai berikut.
Gambar 5.13 Hasil Open Dialog
31. Doble klik button open kemudian ketik program yang di hurup tebal berikut. var FormHistogramCut: TFormHistogramCut; FileNameImg: string; implementation {$R *.dfm} procedure TFormHistogramCut.btOpenClick(Sender: 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;
93 32. Tambahkan button pada form, pada object inspector rubah properties captionnya dengan nama HistogramCut dan Namenya dengan nama btHistogramCut.
Gambar 5.14 Button HistogramCut
33. Tambahkan ProgressBar ke ProgressBar. Lalu klik ke form.
form
dengan
cara,
Gambar 5.15 Menu ProgresBar 34. Hasilnya sebagai berikut.
Gambar 5.16 Hasil ProgresBar
pilih
menu
Win32,
94 35. Tambahkan unit baru, dengan cara file, new unit.
Gambar 5.17 New Unit 36. Simpan unitnya dengan cara save as.
Gambar 5.18 Save As
37. Berinama unitnya dengan nama UnitImageProses.
Gambar 5.19 Save UnitImageProses
95
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 ProgressBar1: TProgressBar);
(var
implementation const PercentR = 0.299; PercentG = 0.587; PercentB = 0.114; function ByteRange (r:double) : byte; begin if r<0 then ByteRange:=0 else if r>255 then ByteRange:=255
Image:TImage;
nRepeat:integer;
var
96 else ByteRange:=Round(r); end; function RgbToGray (Clr:TColor) : byte; var r,g,b:byte; begin r := GetRValue(Clr); g := GetGValue(Clr); b := GetBValue(Clr); RgbToGray := ByteRange (r*PercentR + g*PercentG + b*PercentB); 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; 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;
nRepeat:integer;
var
97 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 clrGray>BLACK_THRES then begin Inc(ImgSize); if clrGray>clrGrayMax then clrGrayMax := clrGray; end; end; { tentukan threshold } TotFreq := 0; thres := 255; for i:=255 downto 0 do begin Inc (TotFreq, Freq[i]); if TotFreq>ImgSize/2 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 (clrGray/clrGrayMax*255); Image.Canvas.Pixels[x,y] := RGB (clrGray,clrGray,clrGray); end; end; ProgressBar1.Position := x;
98 end; end; Image.Repaint; end; end.
40. Kembali ke FormHistogramCut, caranya klik UnitHistogramCut.
Gambar 5.21 Klik Unit Histogram Cut 41. Lalu klik toggle form.
Gambar 5.22 Menu Toggle
99 42. Doble klik button HistogramCut.
Gambar 5.23 Klik Button HistogramCut 43. Lalu ketik program berikut yang tercetak huruf tebal.. procedure TFormHistogramCut.btHistogramCutClick(Sender: TObject); var n:integer; begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; n:= StrToIntDef(EditHistogramCut.Text,5); ImgHistogramCut (Image2, n, ProgressBar1); end; 44. Dibawah implementasi ketik program yang tertulis huruf tebal berikut. implementation {$R *.dfm} uses UnitImageProses;
45. Tambahkan button ke form, lalu pada object inspector rubah properties captionnya dengan nama Exit dan namenya dengan nama btExit.
100
Gambar 5.24 Button Exit 46. Tambahkan edit ke form dengan cara pilih menu standart, edit.
Gambar 5.25 Menu Edit 47. Pada object inspector namenya EditHistogramCut, Textnya = 10.
beri
nama
editnya
Gambar 5.26 Object InspectorEdit
48. Tambahkan label pada form dengan cara pilih menu standart, label.
dengan
101
Gambar 5.27 Menu Label 49. Letakkan disebelah kiri edit, ganti captionnya dengan nama Cut.
Gambar 5.28 Object Inspector Cut
50. Doble klik button Exit lalu ketik program berikut. procedure TFormHistogramCut.btExitClick(Sender: TObject); begin FormHistogramCut.Close; end; 51. Simpan program dengan cara file save all.
52. Compiler progran ProjectHistogramCut.
dengan
cara
pilih
menu
Project,
Compile
102
Gambar 5.29 Menu Compile
53. Lalu jalankan progran dengan cara pilih menu Run, Run.
Gambar 5.30 Menu Run
54. Hasil sebagai berikut.
103
Gambar 5.31 Hasil Program Histogram Cut
55. Keluar dari program klik button Exit.
5.3 PROGRAM SELENGKAPNYA ADALAH SEBAGAI BERIKUT: unit UnitHistogramCut; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtDlgs, StdCtrls, ExtCtrls, ComCtrls; type TFormHistogramCut = class(TForm) Image1: TImage; Image2: TImage; btOpen: TButton; OpenPictureDialog1: TOpenPictureDialog; btHistogramCut: TButton; ProgressBar1: TProgressBar; btExit: TButton; EditHistogramCut: TEdit; Label1: TLabel; procedure btOpenClick(Sender: TObject);
104 procedure btHistogramCutClick(Sender: TObject); procedure btExitClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var FormHistogramCut: TFormHistogramCut; FileNameImg: string; implementation {$R *.dfm} uses UnitImageProses; procedure TFormHistogramCut.btOpenClick(Sender: 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.btHistogramCutClick(Sender: TObject); var thres:real; n:integer; begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; n:= StrToIntDef(EditHistogramCut.Text,5); ImgHistogramCut (Image2, n, ProgressBar1); end; procedure TFormHistogramCut.btExitClick(Sender: TObject); begin FormHistogramCut.Close; end; end. unit UnitImageProses;
105 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 r<0 then ByteRange:=0 else if r>255 then ByteRange:=255 else ByteRange:=Round(r); end; function RgbToGray (Clr:TColor) : byte; var r,g,b:byte; begin r := GetRValue(Clr); g := GetGValue(Clr); b := GetBValue(Clr); RgbToGray := ByteRange (r*PercentR + g*PercentG + b*PercentB); 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);
106 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 clrGray>BLACK_THRES then begin Inc(ImgSize); if clrGray>clrGrayMax then clrGrayMax := clrGray; end; end;
107 { tentukan threshold } TotFreq := 0; thres := 255; for i:=255 downto 0 do begin Inc (TotFreq, Freq[i]); if TotFreq>ImgSize/2 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 (clrGray/clrGrayMax*255); Image.Canvas.Pixels[x,y] := RGB (clrGray,clrGray,clrGray); end; end; ProgressBar1.Position := x; end; end; Image.Repaint; end; end.
108
BAB 6 MORPOLOGI 6.1 DASAR TEORI MORPOLOGI Kata morpphologi secara sederhana dapat diartikan sebagai bentuk dan struktur suatu objek atau dalam deskripsi lainnya disebutkan bahwa morpologi adalah susunan dan hubungan antar bagian pada suatu objek. Morpologi di dunia digital dapat diartikan sebuah cara untuk mendeskripsikan ataupun menganalisa bentuk dari objek digital (Darma Putra,2010). 6.1.1 Structuring Elemens (SE) Operasi morpologi menggunakan dua input himpunan yaitu suatu citra (pada umumnya citra biner) dan suatu kernel. Khusus dalam morpologi, istilah kernel biasa disebut dengan structuring elemens ( elemen pembentuk struktur). SE merupakan suatu matrik dan pada umumnya berukuran kecil. Elemen dari SE dapat bernilai 1, 0, dan don’t care. Nilai don’t care biasanya ditandai dengan nilai elemen dikosongkan atau diberi tanda silang (Darma Putra,2010). Ada 2 operasi dasar morpologi yaitu dilasi dan erosi. Kedua operasi dasar tersebut menjadi basis untuk membuat berbagai operasi morphologi yang sangat berguna untuk pengolahan citra digital, seperti opening, closing, dan thining. Dalam hal ini penulis menggunakan operasi opening. 6.1.2 Dilasi (Dilation) Bila suatu objek (citra input) dinyatakan dengan A dan SE dinyatakan dengan B serta Bx menyatakan translasi B sedemikian sehingga pusat B terletak pada x, operasi dilasi A dengan B dapat dinyatakan sebagai berikut. D(A,B) = A
B = {x:Bx ∩ A ≠ ∅}………….............................……..…..(6.1)
Dengan ∅ menyatakan himpunan kosong. Proses dilasi dilakukan dengan membandingkan setiap piksel citra input dengan nilai pusat SE dengan cara melapiskan (superimpose) SE dengan citra sehingga pusat SE tepat dengan posisi pixel citra yang diproses. Jika paling sedikit ada 1 pixel pada SE sama dengan nilai pixel objek (foreground) citra maka pixel input diset nilainya dengan nilai pixel foreground dan bila semua pixel yang berhubungan adalah background maka input pixel diberi nilai background. Proses seupa dilanjutkan dengan mengerakan (translasi) SE pixel demi pixel pada citra input. Efek dilasi terhadap citra biner adalah memperbesar batas objek yang ada sehingga terlihat besar dan lubang-lubang yang terdapat di tengah objek akan tampak mengecil.
Dilasi pada Citra Grayscale
109 Proses dilasi dapat juga dilakukan pada citra grayscale dengan menggunakan rumus pada citra grayscale dengan menggunakan rumus yang agak beda dengan rumus dilasi di atas yaitu: (Basha s.Saheb,2009) DG (A,B) = max{j,k}∈B {a [m - j, n - k] + b[j,k] }………..........................…(6.2) Rumus di atas menyatakan untuk input koordinat [m,n], setiap elemen SE dijumlahkan dengan nilai pixel pada koordinat bersesuaian dari bagian citra yang sedang diproses dan nilai pixel hasil adalah nilai maksium dari masing-masing penjumlahan. Elemen SE pada dilasi citra grayscale dapat bernilai grayscale pula. Pada disertasi ini penulis menggunakan matrik satuan 3x3. Contoh proses dilasi pada grayscale ditunjukkan pada matrik berikut: 1 1 1 11 16 14 10 15 13 + 1 1 1 = 21 " 18 = 20 ! 17 !# 1 1 1 6 7 1 5 6 0 Proses dilasi pada citra grayscale akan menyebabkan bagian terang yang dikelilingi oleh bagian yang lebih gelap akan melebar sedangkan bagian gelab yang dikelilingi oleh bagian yang lebih terang akan mengecil. Dengan kata lain proses dilasi terhadap citra grayscale akan menghasilkan citra yang lebih terang karena sebagian dari pixel yang memiliki intensitas keabuan yang rendah diubah menjadi tinggi. 6.1.3 Erosi Operasi erosi dapat dinyatakan sebagai berikut. E(A,B) = A Θ B = {x:Bx C X}………..........………………...............……..(6.3) Sama seperti dilasi, proses erosi dilakukan membandingkan setiap citra input dengan nilai pusat SE dengan cara melapiskan SE dengan citra sehingga pusat SE tepat dengan posisi pixel citra yang diproses. Jika semua pixel pada SE tepat sama dengan semua piksel nilai pixel objek (foreground) citra maka pixel input diset nilainya dengan nilai pixel foreground, bila tidak maka input pixel diberi nilai pixel background. Proses serupa dilanjutkan dengan menggerakkan SE pixel demi pixel pada citra input. Proses erosi merupakan kebalikan dari proses dilasi, jika daalam proses dilasi menghasilkan objek yang lebih luas maka dalam proses erosi akan menghasilkan objek yang menyempit (mengecil). Lubang pada objek juga akan tampak membesar seiring menyempitnya batas objek tersebut. Erosi pada Citra Grayscale Proses erosi dapat diperluas pada citra grayscale dengan menggunakan rumus berikut. (Basha s.Saheb,2009) DG (A,B) = max{j,k}∈B {a [m + j, n + k] - b[j,k] }…….........................……(6.4) Rumus diatas menyatakan untuk input koordinat [m,n] setiap nilai pixel citra dikurangi dengan nilai elemen SE pada koordinat bersesuaian dari bagian citra yang sedang diproses dan nilai pixel hasil adalah nilai minimum dari masing-masing pengurangan. Contoh proses erosi pada citra grayscale seperti maatrik berikut ini.
110 10 15 20 ! 5 6
13 17 0
1 - 1 1
9 1 1 1 1 = 19 4 1 1
14 12 # 16 = 5 0
$
Proses erosi pada citra grayscale secara umum akan menyebabkan citra keluaran lebih gelap. Proses ini akan memperkecil wilayah terang yang dikelilingi oleh wilayah gelap serta akan memperbesar wilayah gelap yang dikelilingi wilayah terang. Proses erosi menyebabkan citra keluaran tampak lebih gelap karena beberapa pixel citra yang memiliki intensitas keabuan yang lebih tinggi diubah menjadi pixel dengan nilai intensitas yang rendah.
6.1.4 Opening Operasi erosi sangat berguna untuk dalam menghilangkan obejk-obejk kecil yang terdapat dalam citra, namun operasi ini memiliki kelemahan yakni terjadinya penurunan ukuran objek yang lainnya. Untuk mengatasi hal ini dapat dilakukan operasi dilasi setelah melakukan operasi erosi dengan menggunakan SE yang sama. Kombinasi dari kedua proses ini dinamakan operasi opening. Secara matematis proses opening dapat dinyatakan dengan (Basha s.Saheb,2009): O (A,B) = A o B = D ( E(A,B), B)……...................................…………….(6.5) Operasi opening mencegah penurunan ukuran objek secara keseluruhan. Opening pada Citra Grayscale Proses opening pada citra grayscale dapat dinyatakan sebagai berikut. OG(A,B) = DG(EG (A,B), B)……………………........................……………..(6.6) Operasi opening pada citra grayscale ini akan memberikan efek penurunan intensitas bagian citra yang terang yang berukuran lebih kecil dari SE. Sedangkan untuk bagian citra terang yang lebih besar dari SE tidak akan berubah. 6.1.5 Closing Sama seperti opening, operasi closing merupakan penggabungan antara operasi erosi dan dilasi. Hanya saja operasi dilasi dilakukan terlebih dulu kemudian baru diikuti dengan operasi erosi (Basha s.Saheb,2009). Operasi closing dapat dinyatakan sebagai berikut. C(A,B) = A o B = E ( D(A,- B), - B)………………….................................(6.7) Hasil operasi closing hamper sama seperti hasil operasi dilasi yakni memperbesar batas objek luar objek foreground dan juga menutup lubang kecil yang terletak di tengah objek, namun hasil operasi closing tidak sebesar hasil dilasi. Hasil dilasi akan menyebabkan pembekakan bentuk keseluruhan objek. Efek ini dapat dikurangi dengan menerapkan proses erosi setelah proses dilasi tersebut. Closing pada Citra Grayscale. Proses closing pada citra grayscale dapat dinyatakan sebagai berikut.
111
CG(A,B) = EG ( DG(A,B~), B~)………………….................................….(6.8)
6.2 CARA MEMBUAT PROGRAM MORPOLOGI LAKUKAN LANGKAH BERIKUT: 1. Buka program delphi, dengan cara pilih menu start, program borland delphi 7, delphi 7.
Gambar 6.1 Start Program 2. Kemudian pilih menu file, new, application.
Gambar 6.2 New Application 3. Pada object inspector, ubah properti captionnya dengan nama Morpologi, dan namenya dengan nama FormMorpologi.
112
Gambar 6.3 Form Morpologi 4. Simpan unit dan projectnya dengan cara save all.
Gambar 6.4 Save All
5. Beri nama unitnya dengan nama UnitMorpologi.
Gambar 6.5 Save UnitMorpologi
6. Beri nama projectnya dengan nama ProjectMorpologi.
113
Gambar 6.6 Save ProjectMorpologi 7. Tambahkan image ke form dengan cara pilih menu Additional, image, lalu klik ke form.
Gambar 6.7 Menu Image
8. Rubah stretchnya ke true dan autosizenya true.
Gambar 6.8 Stretch True 9. Dengan cara yang sama tambahkan image2 di sebelah kanan image1 kemudian ubah stretchnya ke true dan autosizenya true.
114
Gambar 6.9 Penambahan Image 2
10. Tambahkan button ke form, dengan cara pilih menu standart, button, lalu klik ke form
Gambar 6.10 Menu Button
11. Pada oject inspector rubah properti captionnya dengan nama Open, kemudian namenya dengan nama btOpen.
Gambar 6.11 Button Open 12. Tambahkan OpenPictureDialog ke form, dengan cara pilih menu dialog, OpenPictureDialog, lalu klik ke form.
115
Gambar 6.12 Menu OpenPictureDialog
13. Hasilnya sebagai berikut.
Gambar 6.13 Hasil OpenPictureDialog
14. Doble klik button open kemudian ketik program yang di hurup tebal berikut. var FormMorpologi: TFormMorpologi; FileNameImg: string; implementation {$R *.dfm} procedure TFormMorpologi.btOpenClick(Sender: TObject); begin if OpenPictureDialog1.Execute then begin FileNameImg := OpenPictureDialog1.FileName; Caption := 'Morpologi : '+ OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile (OpenPictureDialog1.FileName); Image2.Visible := False; end; end;
116 15. Tambahkan button pada form, pada object inspector rubah properties captionnya dengan nama Morpologi dan Namenya dengan nama btMorpologi.
Gambar 6.14 Button Morpologi 16. Tambahkan ProgressBar ke ProgressBar. Lalu klik ke form.
form
dengan
cara,
Gambar 6.15 Menu ProgresBar
17. Hasilnya sebagai berikut.
Gambar 6.16 Hasil ProgresBar 18. Tambahkan unit baru, dengan cara file, new unit.
pilih
menu
Win32,
117
Gambar 6.17 New Unit
19. Simpan unitnya dengan cara save as.
Gambar 6.18 Save As
20. Berinama unitnya dengan nama UnitImageProses.
Gambar 6.19 Save UnitImageProses 21. Hasilnya sebagai berikut.
118
Gambar 6.20 Hasil Unit Image proses
22. 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 ImgFilterMorphology (var Image:TImage; nCol,nRow,MaxMin:byte; var ProgressBar1: TProgressBar); implementation const PercentR = 0.299; PercentG = 0.587; PercentB = 0.114; function ByteRange (r:double) : byte; begin if r<0 then ByteRange:=0 else if r>255 then ByteRange:=255
Mtrx:TMatrixFilter;
119 else ByteRange:=Round(r); end; function RgbToGray (Clr:TColor) : byte; var r,g,b:byte; begin r := GetRValue(Clr); g := GetGValue(Clr); b := GetBValue(Clr); RgbToGray := ByteRange (r*PercentR + g*PercentG + b*PercentB); 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; // MaxMin=1 : dilasi(+) MaxMin=2 : erosi(-) procedure ImgFilterMorphology (var Image:TImage; nCol,nRow,MaxMin:byte; var ProgressBar1: TProgressBar); var dx,dy:byte; ImgTemp:TImage; procedure CalculatePixel (x,y:integer; var clrGray:byte); var row,col:integer; c,m:real; begin if MaxMin=1 then m:=0 else m:=255; for col:=1 to nCol do for row:=1 to nRow do begin
Mtrx:TMatrixFilter;
120 clrGray := ImgGetGray (ImgTemp, x+col-dx-1, y+row-dy-1); if MaxMin=1 then // dilasi begin c := clrGray + Mtrx[col,row]; if c>m then m:=c; end else begin // erosi c := clrGray - Mtrx[col,row]; if c<m then m:=c; end end; clrGray := ByteRange (m); end; var x,y: integer; clrGray: byte; begin dx := nCol div 2; dy := nRow div 2; ProgressBar1.Max := Image.Width; ProgressBar1.Position := 0; ImgTemp := TImage.Create (Image.Parent); ImgTemp.Picture.Graphic := Image.Picture.Graphic;; { filtering process } for x:=dx to Image.Width-1-dx do begin for y:=dy to Image.Height-1-dy do begin CalculatePixel (x,y, clrGray); Image.Canvas.Pixels[x,y] := RGB (clrGray,clrGray,clrGray); end; { for y } ProgressBar1.Position := x; end; { for x } ProgressBar1.Position := ProgressBar1.Max; Image.Repaint; end; end.
23. Kembali ke FormMorpologi, caranya klik unitMoepologi
121
Gambar 6.21 Kembali ke FormMorpologi 24. Lalu klik toggle form.
Gambar 6.22 Menu Toggle 25. Doble klik button morpologi.
Gambar 6.23 Klik Button Morpologi
26. Lalu ketik program berikut.
122 procedure TFormMorpologi.btMorpologiClick(Sender: TObject); var Mtrx:TMatrixFilter; nRow,nCol,r,c:integer; begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; begin //nRow:=16; nCol:=16; nRow:=8; nCol:=8; // coba coba for c:=1 to nCol do for r:=1 to nRow do Mtrx[r,c]:=1; ImgFilterMorphology (Image2,Mtrx,nCol,nRow,2,ProgressBar1); ImgFilterMorphology (Image2,Mtrx,nCol,nRow,1,ProgressBar1); end; end; 27. Dibawah implementasi ketik program yang tertulis huruf tebal berikut. implementation {$R *.dfm} uses UnitImageProses; 28. Tambahkan button ke form, lalu pada object inspector rubah properties captionnya dengan nama Exit dan namenya dengan nama btExit.
Gambar 6.24 Button Exit 29. Doble klik button Exit, lalu ketik program berikut. procedure TFormMorpologi.btExitClick(Sender: TObject); begin FormMorpologi.Close; end;
30. Compiler progran dengan cara pilih menu Project, Compile ProjectMorpologi.
123
Gambar 6.25 Compiler ProjectMorpologi
31. Lalu jalankan progran dengan cara pilih menu Run, Run.
Gambar 6.26 Menu Run 32. Hasil sebagai berikut.
Gambar 6.27 Hasil Program Morpologi 33. Keluar dari program klik button Exit.
6.3 PROGRAM MORPOLOGI SELENGKAPNYA ADALAH SEBAGAI BERIKUT
124
unit UnitMorpologi; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtDlgs, StdCtrls, ExtCtrls, ComCtrls; type TFormMorpologi = class(TForm) Image1: TImage; Image2: TImage; btOpen: TButton; OpenPictureDialog1: TOpenPictureDialog; btMorpologi: TButton; ProgressBar1: TProgressBar; btExit: TButton; procedure btOpenClick(Sender: TObject); procedure btMorpologiClick(Sender: TObject); procedure btExitClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var FormMorpologi: TFormMorpologi; FileNameImg: string; implementation {$R *.dfm} uses UnitImageProses; procedure TFormMorpologi.btOpenClick(Sender: TObject); begin if OpenPictureDialog1.Execute then begin FileNameImg := OpenPictureDialog1.FileName; Caption := 'Morpologi : '+ OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile (OpenPictureDialog1.FileName); Image2.Visible := False; end; end;
125 procedure TFormMorpologi.btMorpologiClick(Sender: TObject); var Mtrx:TMatrixFilter; nRow,nCol,r,c:integer; begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; begin nRow:=16; nCol:=16; // nRow:=8; nCol:=8; for c:=1 to nCol do for r:=1 to nRow do Mtrx[r,c]:=1;
// coba coba
ImgFilterMorphology (Image2,Mtrx,nCol,nRow,2,ProgressBar1); ImgFilterMorphology (Image2,Mtrx,nCol,nRow,1,ProgressBar1); end; end; procedure TFormMorpologi.btExitClick(Sender: TObject); begin FormMorpologi.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 TProgressBar);
(var
Image1:TImage;
procedure ImgFilterMorphology (var Image:TImage; nCol,nRow,MaxMin:byte; var ProgressBar1: TProgressBar); implementation const
var
ProgressBar1:
Mtrx:TMatrixFilter;
126 PercentR = 0.299; PercentG = 0.587; PercentB = 0.114; function ByteRange (r:double) : byte; begin if r<0 then ByteRange:=0 else if r>255 then ByteRange:=255 else ByteRange:=Round(r); end; function RgbToGray (Clr:TColor) : byte; var r,g,b:byte; begin r := GetRValue(Clr); g := GetGValue(Clr); b := GetBValue(Clr); RgbToGray := ByteRange (r*PercentR + g*PercentG + b*PercentB); 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 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; // MaxMin=1 : dilasi(+) MaxMin=2 : erosi(-) procedure ImgFilterMorphology (var Image:TImage; nCol,nRow,MaxMin:byte; var ProgressBar1: TProgressBar); var dx,dy:byte; ImgTemp:TImage;
ProgressBar1:
Mtrx:TMatrixFilter;
127 procedure CalculatePixel (x,y:integer; var clrGray:byte); var row,col:integer; c,m:real; begin if MaxMin=1 then m:=0 else m:=255; for col:=1 to nCol do for row:=1 to nRow do begin clrGray := ImgGetGray (ImgTemp, x+col-dx-1, y+row-dy-1); if MaxMin=1 then // dilasi begin c := clrGray + Mtrx[col,row]; if c>m then m:=c; end else begin // erosi c := clrGray - Mtrx[col,row]; if c<m then m:=c; end end; clrGray := ByteRange (m); end; var x,y: integer; clrGray: byte; begin dx := nCol div 2; dy := nRow div 2; ProgressBar1.Max := Image.Width; ProgressBar1.Position := 0; ImgTemp := TImage.Create (Image.Parent); ImgTemp.Picture.Graphic := Image.Picture.Graphic;; { filtering process } for x:=dx to Image.Width-1-dx do begin for y:=dy to Image.Height-1-dy do begin CalculatePixel (x,y, clrGray); Image.Canvas.Pixels[x,y] := RGB (clrGray,clrGray,clrGray); end; { for y } ProgressBar1.Position := x; end; { for x } ProgressBar1.Position := ProgressBar1.Max; Image.Repaint; end;
128
end.
129
130
BAB 7 SUBTRAK 7.1 DASAR TEORI SUBTRAK Pengurangan citra digunakan untuk memisahkan objek dengan latar belakang. Perbedaan dua citra u1(x,y) dan u2(x,y) yang dinyatakan sebagai: O(x,y) = u1(x,y) – u2(x,y)………………..........................……………...(7.1) Diperoleh dengan menghitung perbedaan antara semua pasangan pixel pada koordinat yang bersesuaian dari u1 dam u2 (Darma Putra,2010).
7.2 CARA MEMBUAT PROGRAM SUBTRAK LAKUKAN LANGKAH BERIKUT: 1. Buka program delphi, dengan cara pilih menu start, program borland delphi 7, delphi 7.
Gambar 7.1 Start Program
131 2. Kemudian pilih menu file, new, application.
Gambar 7.2 New Application 3. Pada object inspector, ubah properti captionnya dengan nama Subtrak, dan namenya dengan nama FormSubtrak.
Gambar 7.3 Form Substrak 4. Simpan unit dan projectnya dengan cara save all.
Gambar 7.4 Save All
132 5. Beri nama unitnya dengan nama UnitSubtrak.
Gambar 7.5 Save UnitSubtrak 6. Beri nama projectnya dengan nama ProjectSubtrak.
Gambar 7.6 Save ProjectSubstrak 7. Tambahkan image ke form dengan cara pilih menu Additional, image, lalu klik ke form.
Gambar 7.7 Menu Image
133 8. Rubah stretchnya ke true dan autosizenya true.
Gambar 7.8 Strect True 9. Dengan cara yang sama tambahkan image2 di sebelah kanan image1 kemudian ubah stretchnya true dan autosizenya true.
Gambar 7.9 Penambahan Image 2 10. Tambahkan button ke form, dengan cara pilih menu standart, button, lalu klik ke form
Gambar 7.10 Menu Button
134 11. Pada oject inspector rubah properti captionnya dengan nama Open, kemudian namenya dengan nama btOpen.
Gambar 7.11 Button Open 12. Tambahkan OpenPictureDialog ke form, dengan cara pilih menu dialog, OpenPictureDialog, lalu klik ke form.
Gambar 7.12 Menu OpenPictureDialog 13. Hasilnya sebagai berikut.
Gambar 7.13 Hasil OpenPictureDialog 14. Doble klik button open kemudian ketik program yang di hurup tebal berikut. var FormSubstak: TFormSubstak; FileNameImg: string; implementation
135 {$R *.dfm} procedure TFormSubstak.btOpenClick(Sender: TObject); begin if OpenPictureDialog1.Execute then begin FileNameImg := OpenPictureDialog1.FileName; Caption := 'Subtrak : '+ OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile (OpenPictureDialog1.FileName); Image2.Visible := False; end; end;
15. Tambahkan button pada form, pada object inspector rubah properties captionnya dengan nama Subtrak dan Namenya dengan nama btSubtrak.
Gambar 7.14 Button Subtrak
16. Tambahkan ProgressBar ke form dengan cara, ProgressBar. Lalu klik ke form, lalu geser kekanan.
Gambar 7.15 Menu ProgressBar
17. Hasilnya sebagai berikut.
pilih
menu
Win32,
136
Gambar 7.16 Hasil ProgresBar
18. Tambahkan unit baru, dengan cara file, new unit.
Gambar 7.17 New Unit 19. Simpan unitnya dengan cara save as.
Gambar 7.18 Save As
20. Berinama unitnya dengan nama UnitImageProses.
137
Gambar 7.19 Save UnitImageProses
21. Hasilnya sebagai berikut.
Gambar 7.20 Hasil Save UnitImageProses 22. Ketik program berikut ke dalam 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 TProgressBar); procedure ImgSubtraction (var Image1,Image2:TImage; TProgressBar);
ProgressBar1:
var ProgressBar1:
138 implementation const PercentR = 0.299; PercentG = 0.587; PercentB = 0.114; function ByteRange (r:double) : byte; begin if r<0 then ByteRange:=0 else if r>255 then ByteRange:=255 else ByteRange:=Round(r); end; function RgbToGray (Clr:TColor) : byte; var r,g,b:byte; begin r := GetRValue(Clr); g := GetGValue(Clr); b := GetBValue(Clr); RgbToGray := ByteRange (r*PercentR + g*PercentG + b*PercentB); 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 ImgSubtraction (var Image1,Image2:TImage; TProgressBar);
var ProgressBar1:
139 var x,y:integer; clrGray1,clrGray2:byte; begin Randomize; 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 clrGray1 := ImgGetGray (Image1, x,y); clrGray2 := ImgGetGray (Image2, x,y); clrGray2 := ByteRange (clrGray1-clrGray2); Image2.Canvas.Pixels[x,y] := RGB (clrGray2,clrGray2,clrGray2); end; ProgressBar1.Position := x; end; Image2.Repaint; end; end.
23. Kembali ke FormSubtrak, caranya klik unitMoepologi
Gambar 7.21 Kembali ke FormSubstrak
24. Lalu klik toggle form.
140
Gambar 7.22 Menu Toggle 25. Doble klik button subtrak.
Gambar 7.23 Klik Button Substrak 26. Lalu ketik program berikut. procedure TFormSubstak.btSubtrakClick(Sender: TObject); begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; ImgSubtraction (Image1,Image2, ProgressBar1); end; 27. Dibawah implementasi ketik program yang tertulis huruf tebal berikut. implementation {$R *.dfm} uses UnitImageProses;
28. Tambahkan button ke form, lalu pada object inspector rubah properties captionnya dengan nama Exit dan namenya dengan nama btExit.
141
Gambar 7.24 Button Exit 29. Doble klik button Exit, lalu ketik program berikut. procedure TFormSubtrak.btExitClick(Sender: TObject); begin FormSubtrak.Close; end; 30. Compiler progran dengan cara pilih menu Project, Compile ProjectSubtrak.
Gambar 7.25 Compiler ProjectSubtrak 31. Lalu jalankan progran dengan cara pilih menu Run, Run.
Gambar 7.26 Menu Run 32. Hasil
sebagai berikut.
142
Gambar 7.27 Hasil program Substrak 33. Keluar dari program klik button Exit.
7.3 PROGRAM SUBTRAK SELENGKAPNYA ADALAH SEBAGAI BERIKUT: unit UnitSubtrak; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtDlgs, StdCtrls, ExtCtrls, ComCtrls; type TFormSubtrak = class(TForm) Image1: TImage; Image2: TImage; btOpen: TButton; OpenPictureDialog1: TOpenPictureDialog; btSubtrak: TButton; ProgressBar1: TProgressBar; btExit: TButton; procedure btOpenClick(Sender: TObject); procedure btSubtrakClick(Sender: TObject); procedure btExitClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var FormSubtrak: TFormSubtrak; FileNameImg: string;
143 implementation {$R *.dfm} uses UnitImageProses; procedure TFormSubtrak.btOpenClick(Sender: TObject); begin if OpenPictureDialog1.Execute then begin FileNameImg := OpenPictureDialog1.FileName; Caption := 'Subtrak : '+ OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile (OpenPictureDialog1.FileName); Image2.Visible := False; end; end; procedure TFormSubtrak.btSubtrakClick(Sender: TObject); begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; ImgSubtraction (Image1,Image2, ProgressBar1); end; procedure TFormSubtrak.btExitClick(Sender: TObject); begin FormSubtrak.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);
144 procedure ImgSubtraction (var Image1,Image2:TImage; var ProgressBar1: TProgressBar); implementation const PercentR = 0.299; PercentG = 0.587; PercentB = 0.114; function ByteRange (r:double) : byte; begin if r<0 then ByteRange:=0 else if r>255 then ByteRange:=255 else ByteRange:=Round(r); end; function RgbToGray (Clr:TColor) : byte; var r,g,b:byte; begin r := GetRValue(Clr); g := GetGValue(Clr); b := GetBValue(Clr); RgbToGray := ByteRange (r*PercentR + g*PercentG + b*PercentB); 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;
145
procedure ImgSubtraction (var Image1,Image2:TImage; var ProgressBar1: TProgressBar); var x,y:integer; clrGray1,clrGray2:byte; begin Randomize; 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 clrGray1 := ImgGetGray (Image1, x,y); clrGray2 := ImgGetGray (Image2, x,y); clrGray2 := ByteRange (clrGray1-clrGray2); Image2.Canvas.Pixels[x,y] := RGB (clrGray2,clrGray2,clrGray2); end; ProgressBar1.Position := x; end; Image2.Repaint; end; end.
146
BAB 8 DETEKSI TEPI SOBEL 8.1 DASAR TEORI DETEKSI TEPI SOBEL Operator sobel adalah salah satu operator yang menghindari adanya perhitungan gradient di titik interpolasi. Operator ini menggunakan kernel ukuran 3 x 3 piksel untuk perhitungan gradient sehingga perkiraan gradien berada tepat di tengah jendela. Misalnya susunan piksel-piksel di sekitar piksel (x,y) adalah: a0 a7 a6
a1 (x,y) a5
a2 a3 a4
Berdasarkan susunan piksel tetangga tersebut, besaran gradient yang dihitung menggunakan operator Sobel adalah: % = &'(2 + ')2 Dengan M adalah besar gradient di titik tengah kernel dan turunan parsial dihitung menggunakan persamaan berikut. Sx = (a2 + ca3 + a4) – (a0 + ca7 + a6) Sy = (a0 + ca1 + a2) – (a6 + ca5 + a4) Dengan c adalah konstanta yang bernilai 2, Sx dan Sy diimplementasikan menjadi kernel berikut.
Sx =
-1 -2 -1
0 0 0
1 2 1
Sy=
1 0 -1
2 0 -2
1 0 -1
8.2 CARA MEMBUAT PROGRAM SOBEL LAKUKAN LANGKAH BERIKUT:
147
1. Buka program delphi, dengan cara pilih menu start, program borland delphi 7, delphi 7.
Gambar 8.1 Start Program 2. Kemudian pilih menu file, new, application.
Gambar 8.2 New Application
3. Pada object inspector, ubah properti captionnya dengan nama Deteksi Tepi Sobel, dan namenya dengan nama FormSobel.
148
Gambar 8.3 Form Sobel 4. Simpan unit dan projectnya dengan cara save all.
Gambar 8.4 Save All 5. Beri nama unitnya dengan nama UnitSobel.
Gambar 8.5 Save UnitSobel 6. Beri nama projectnya dengan nama ProjectSobel.
149
Gambar 8.6 Save ProjectSobel 7. Tambahkan image ke form dengan cara pilih menu Additional, image, lalu klik ke form.
Gambar 8.7 Menu Image 8. Pada Properties rubah stretchnya ke true dan autosizenya true.
Gambar 8.8 Stretch True
9. Dengan cara yang sama tambahkan image2 di sebelah kanan image1 kemudian ubah stretchnya ke true dan autosizenya true.
Gambar 8.9 Penambahan Image 2
150 10. Tambahkan button ke form, dengan cara pilih menu standart, button, lalu klik ke form
Gambar 8.10 Menu Button 11. Pada oject inspector rubah properti captionnya dengan nama Open, kemudian namenya dengan nama btOpen.
Gambar 8.11 Button Open
12. Tambahkan OpenPictureDialog ke form, dengan cara pilih menu dialog, OpenPictureDialog, lalu klik ke form.
Gambar 8.12 Menu OpenPictureDialog 13. Hasilnya sebagai berikut.
151
Gambar 8.13 Hasil OpenPictureDialog 14. Doble klik button open kemudian ketik program yang di hurup tebal berikut. var FormSobel: TFormSobel; FileNameImg: string; implementation {$R *.dfm} procedure TFormSobel.btOpenClick(Sender: TObject); begin if OpenPictureDialog1.Execute then begin FileNameImg := OpenPictureDialog1.FileName; Caption := 'Deteksi Tepi Sobel : '+ OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile (OpenPictureDialog1.FileName); Image2.Visible := False; end; end; end. 15. Tambahkan button pada form, pada object inspector rubah properties captionnya dengan nama Sobel dan Namenya dengan nama btSobel.
Gambar 8.14 Button Sobel 16. Tambahkan unit baru, dengan cara file, new unit.
152
Gambar 8.15 New Unit 17. Simpan unitnya dengan cara save as.
Gambar 8.16 Save As
18. Berinama unitnya dengan nama UnitImageProses.
Gambar 8.17 Save UnitImageProses 19. Hasilnya sebagai berikut.
153
Gambar 8.18 Hasil UnitImageProses 20. 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); implementation const PercentR = 0.299; PercentG = 0.587; PercentB = 0.114; function ByteRange (r:double) : byte; begin if r<0 then ByteRange:=0 else if r>255 then ByteRange:=255 else ByteRange:=Round(r); end; function RgbToGray (Clr:TColor) : byte; var r,g,b:byte;
154 begin r := GetRValue(Clr); g := GetGValue(Clr); b := GetBValue(Clr); RgbToGray := ByteRange (r*PercentR + g*PercentG + b*PercentB); 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; end. 21. Kembali ke FormSobel, caranya klik unitSobel
Gambar 8.19 Kembali ke FormSobel 22. Lalu klik toggle form.
155
Gambar 8.20 Menu Toggle 23. Doble klik button Sobel.
Gambar 8.21 Button Sobel
24. Lalu ketik program berikut procedure TFormSobel.btSobelClick(Sender: TObject); begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; Sobel; end;
25. Di bawah private tulis program tertulis huruf tebal berikut: private procedure Sobel;
26. Dibawah procedure TformaSobel.btSobelClick(Sender. Tobject) ketik program tertulis hurup tebal berikut:
procedure TFormSobel.btSobelClick(Sender: TObject); begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; Sobel; end;
156 procedure TFormSobel.Sobel; const sobel : array[0..1,0..2,0..2] of smallint= (((-1,0,1),(-2,0,2),(-1,0,1)), ((-1,-2,-1),(0,0,0),(1,2,1))); var row:array[0..8] of pbytearray; col:pbytearray; x,y:smallint; i,j,k,p:smallint; image:tbitmap; sum,jum:longint; begin p:=-120; image:=Tbitmap.Create; image.Assign(Image1.Picture.Bitmap); for y:=1 to Image1.Height-2 do begin for i:=-1 to 1 do row[i+1]:=image.ScanLine[y+i]; col:=Image1.Picture.Bitmap.ScanLine[y]; x:=3; repeat sum:=0; for i:=-1 to 1 do for j:=-1 to 1 do sum:=sum+(sobel[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+(sobel[1,i+1,j+1]*row[i+1,x+j*3]); sum:=(sum+jum)+p; if sum>255 then sum:=255; if sum<0 then sum:=0; for k:=0 to 2 do col[x+k]:=sum; inc(x,3); until x>=3*(Image1.Width-4); end; Image2.picture.bitmap:=Image1.Picture.Bitmap; image.free; end; 27. Di bawah implementasi ketik program yang tertulis huruf tebal berikut. implementation {$R *.dfm} uses UnitImageProses;
157 28. Tambahkan button ke form, lalu pada object inspector rubah properties captionnya dengan nama Exit dan namenya dengan nama btExit.
Gambar 8.22 Button Exit 29. Doble klik button Exit, lalu ketik program berikut. procedure TFormSobel.btExitClick(Sender: TObject); begin FormSobel.Close; end; 30. Simpan program dengan cara save all.
31. Compiler progran dengan cara pilih menu Project, Compile ProjectSobel.
Gambar
8.23 Compiler ProjectSobel
32. Lalu jalankan progran dengan cara pilih menu Run, Run.
158
Gambar 8.24 Menu Run
33. Hasil sebagai berikut.
159 Gambar 8.25 Hasil Mammografi
Gambar 8.26 Hasil Photo 34. Keluar dari program klik button Exit.
8.3 PROGRAM SELENGKAPNYA ADALAH SEBAGAI BERIKUT unit UnitSobel; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtDlgs, StdCtrls, ExtCtrls, ComCtrls; type TFormSobel = class(TForm) Image1: TImage; Image2: TImage; btOpen: TButton; OpenPictureDialog1: TOpenPictureDialog; btSobel: TButton; btExit: TButton; procedure btOpenClick(Sender: TObject); procedure btSobelClick(Sender: TObject); procedure btExitClick(Sender: TObject);
160 private procedure Sobel; public { Public declarations } end; var FormSobel: TFormSobel; FileNameImg: string; implementation {$R *.dfm} uses UnitImageProses; procedure TFormSobel.btOpenClick(Sender: TObject); begin if OpenPictureDialog1.Execute then begin FileNameImg := OpenPictureDialog1.FileName; Caption := 'Deteksi Tepi Sobel : '+ OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile (OpenPictureDialog1.FileName); Image2.Visible := False; end; end; procedure TFormSobel.btSobelClick(Sender: TObject); begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; Sobel; end; procedure TFormSobel.Sobel; const sobel : array[0..1,0..2,0..2] of smallint= { sobel modifikasi (((-1,0,1),(-2,0,2),(-1,0,1)), ((-1,-1,-1),(0,0,0),(1,2,1))); } (((-1,0,1),(-2,0,2),(-1,0,1)), ((-1,-2,-1),(0,0,0),(1,2,1)));
var
161 row:array[0..8] of pbytearray; col:pbytearray; x,y:smallint; i,j,k,p:smallint; image:tbitmap; sum,jum:longint; begin p:=-120; image:=Tbitmap.Create; image.Assign(Image1.Picture.Bitmap); for y:=1 to Image1.Height-2 do begin for i:=-1 to 1 do row[i+1]:=image.ScanLine[y+i]; col:=Image1.Picture.Bitmap.ScanLine[y]; x:=3; repeat sum:=0; for i:=-1 to 1 do for j:=-1 to 1 do sum:=sum+(sobel[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+(sobel[1,i+1,j+1]*row[i+1,x+j*3]); sum:=(sum+jum)+p; if sum>255 then sum:=255; if sum<0 then sum:=0; for k:=0 to 2 do col[x+k]:=sum; inc(x,3); until x>=3*(Image1.Width-4); end; Image2.picture.bitmap:=Image1.Picture.Bitmap; image.free; end; procedure TFormSobel.btExitClick(Sender: TObject); begin FormSobel.Close; end; end. unit UnitImageProses; interface
162 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);
implementation const PercentR = 0.299; PercentG = 0.587; PercentB = 0.114; function ByteRange (r:double) : byte; begin if r<0 then ByteRange:=0 else if r>255 then ByteRange:=255 else ByteRange:=Round(r); end; function RgbToGray (Clr:TColor) : byte; var r,g,b:byte; begin r := GetRValue(Clr); g := GetGValue(Clr); b := GetBValue(Clr); RgbToGray := ByteRange (r*PercentR + g*PercentG + b*PercentB); 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;
163 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; end.
164
BAB 9 DETEKSI TEPI PREWITT 9.1 DASAR TEORI DETEKSI TEPI PREWITT Operator Prewitt adalah salah satu operator yang menghindari adanya perhitungan gradien di titik interpolasi. Operator ini menggunakan kernel ukuran 3 x 3 piksel untuk perhitungan gradien sehingga perkiraan gradien berada tepat di tengah jendela. Misalnya susunan piksel-piksel di sekitar piksel (x,y) adalah: a0 a7 a6
a1 (x,y) a5
a2 a3 a4
Berdasarkan susunan piksel tetangga tersebut, besaran gradien yang dihitung menggunakan operator Prewitt adalah: % = &'(2 + ')2 ……………………………………………………………………………..(9.1) Dengan M adalah besar gradien di titik tengah kernel dan turunan parsial dihitung menggunakan persamaan berikut. Sx = (a2 + ca3 + a4) – (a0 + ca7 + a6)………………………………(9.2) Sy = (a0 + ca1 + a2) – (a6 + ca5 + a4)………………………………(9.3) Dengan c adalah konstanta yang bernilai 1, Sx dan Sy diimplementasikan menjadi kernel berikut.
Sx =
-1 -1 -1
0 0 0
1 1 1
Sy=
1 0 -1
1 0 -1
1 0 -1
165
9.2
CARA MEMBUAT PROGRAM LAKUKAN LANGKAH BERIKUT:
PREWITT
1. Buka program delphi, dengan cara pilih menu start, program borland delphi 7, delphi 7.
Gambar 9.1 Start Program 2. Kemudian pilih menu file, new, application.
Gambar 9.2 New Application
3. Pada object inspector, ubah properti captionnya dengan nama
166 Deteksi Tepi Prewitt, dan namenya dengan nama FormPrewitt.
Gambar 9.3 Form Prewitt 4. Simpan unit dan projectnya dengan cara save all.
Gambar 9.4 Save All 5. Beri nama unitnya dengan nama UnitPrewitt.
Gambar 9.5 Save UnitPrewitt
167 6. Beri nama projectnya dengan nama ProjectPrewitt.
Gambar 9.6 Save ProjectPrewitt 7. Tambahkan image ke form dengan cara pilih menu Additional, image, lalu klik ke form.
Gambar 9.7 Menu Image 8. Pada Properties rubah stretchnya ke true dan autosizenya true.
Gambar 9.8 Stretch True
168 9. Dengan cara yang sama tambahkan image2 di sebelah kanan image1 kemudian ubah stretchnya ke true dan autosizenya true.
Gambar 9.9 Penambahan Image 2 10. Tambahkan button ke form, dengan cara pilih menu standart, button, lalu klik ke form
Gambar 9.10 Menu Button 11. Pada oject inspector rubah properti captionnya dengan nama Open, kemudian namenya dengan nama btOpen.
Gambar 9.11 Button Open
169 12. Tambahkan OpenPictureDialog ke form, dengan cara pilih menu dialog, OpenPictureDialog, lalu klik ke form.
Gambar 9.12 Menu OpenPictureDialog 13. Hasilnya sebagai berikut.
Gambar 9.13 Hasil Open Picture Dialog 14. Doble klik button open kemudian ketik program yang di hurup tebal berikut. var FormPrewitt: TFormPrewitt; FileNameImg: string; implementation {$R *.dfm} procedure TFormPrewitt.btOpenClick(Sender: TObject); begin if OpenPictureDialog1.Execute then begin FileNameImg := OpenPictureDialog1.FileName; Caption := 'Deteksi Tepi Prewitt : '+ OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile (OpenPictureDialog1.FileName); Image2.Visible := False; end; end; end.
170 15. Tambahkan button pada form, pada object inspector rubah properties captionnya dengan nama Prewitt dan Namenya dengan nama btPrewitt.
Gambar 9.14 Button Prewitt 16. Tambahkan unit baru, dengan cara file, new unit.
Gambar 9.15 New Unit 17. Simpan unitnya dengan cara save as.
Gambar 9.16 Save As
171 18. Berinama unitnya dengan nama UnitImageProses.
Gambar 9.17 Save UnitImageProses 19. Hasilnya sebagai berikut.
Gambar 9.18 Hasil UnitImageProses 20. 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;
172
procedure ImgConvertToGrayscale (var Image1:TImage; var ProgressBar1: TProgressBar);
implementation const PercentR = 0.299; PercentG = 0.587; PercentB = 0.114; function ByteRange (r:double) : byte; begin if r<0 then ByteRange:=0 else if r>255 then ByteRange:=255 else ByteRange:=Round(r); end; function RgbToGray (Clr:TColor) : byte; var r,g,b:byte; begin r := GetRValue(Clr); g := GetGValue(Clr); b := GetBValue(Clr); RgbToGray := ByteRange (r*PercentR + g*PercentG + b*PercentB); 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;
173 end; end; end. 21. Kembali ke FormPrewitt, caranya klik unitPrewitt
Gambar 9.19 Kembali ke FormPrewitt 22. Lalu klik toggle form.
Gambar 9.20 Menu Toggle 23. Doble klik button Prewitt.
Gambar 9.21 Button Prewitt
174 24. Lalu ketik program berikut procedure TFormPrewitt.btPrewittClick(Sender: TObject); begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; Prewitt; end; 25. Di bawah private tulis program tertulis huruf tebal berikut: private procedure Prewitt;
26. Dibawah procedure TformaPrewitt.btPrewittClick(Sender. Tobject) ketik program tertulis hurup tebal berikut: procedure TFormPrewitt.btPrewittClick(Sender: TObject); begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; Prewitt; end; procedure TFormPrewitt.Prewitt; const prewitt : array[0..1,0..2,0..2] of smallint= (((-1,0,1),(-1,0,1),(-1,0,1)), ((-1,-1,-1),(0,0,0),(1,1,1)));
var row:array[0..8] of pbytearray; col:pbytearray; x,y:smallint; i,j,k,p:smallint; image:tbitmap; sum,jum:longint; begin p:=-120; image:=Tbitmap.Create; image.Assign(Image1.Picture.Bitmap); for y:=1 to Image1.Height-2 do begin for i:=-1 to 1 do row[i+1]:=image.ScanLine[y+i]; col:=Image1.Picture.Bitmap.ScanLine[y]; x:=3;
175 repeat sum:=0; for i:=-1 to 1 do for j:=-1 to 1 do sum:=sum+(prewitt[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+(prewitt[1,i+1,j+1]*row[i+1,x+j*3]); sum:=(sum+jum)+p; if sum>255 then sum:=255; if sum<0 then sum:=0; for k:=0 to 2 do col[x+k]:=sum; inc(x,3); until x>=3*(Image1.Width-4); end; Image2.picture.bitmap:=Image1.Picture.Bitmap; image.free; end; 27. Di bawah implementasi ketik program yang tertulis huruf tebal berikut. implementation {$R *.dfm} uses UnitImageProses; 28. Tambahkan button ke form, lalu pada object inspector rubah properties captionnya dengan nama Exit dan namenya dengan nama btExit.
Gambar 9.22 Button Exit
29. Doble klik button Exit, lalu ketik program berikut. procedure TFormPrewitt.btExitClick(Sender: TObject);
176 begin FormPrewitt.Close; end; 30. Simpan program dengan cara save all. 31. Compiler progran dengan cara pilih menu Project, Compile ProjectPrewitt.
Gambar 9.23 Compiler ProjectPrewitt 32. Lalu jalankan progran dengan cara pilih menu Run, Run.
Gambar 9.24 Menu Run
33. Hasil sebagai berikut.
177
Gambar 9.25 Hasil Mammografi
Gambar 9.26 Hasil Photo
34. Keluar dari program klik button Exit.
178
9.3 PROGRAM DETEKSI TEPI PREWITT SELENGKAPNYA ADALAH SEBAGAI BERIKUT: unit UnitPrewitt; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtDlgs, StdCtrls, ExtCtrls; type TFormPrewitt = class(TForm) Image1: TImage; Image2: TImage; btOpen: TButton; OpenPictureDialog1: TOpenPictureDialog; btPrewitt: TButton; btExit: TButton; procedure btOpenClick(Sender: TObject); procedure btPrewittClick(Sender: TObject); procedure btExitClick(Sender: TObject); private procedure Prewitt; public { Public declarations } end; var FormPrewitt: TFormPrewitt; FileNameImg: string; implementation {$R *.dfm} uses UnitImageProses; procedure TFormPrewitt.btOpenClick(Sender: TObject); begin if OpenPictureDialog1.Execute then begin FileNameImg := OpenPictureDialog1.FileName; Caption := 'Deteksi Tepi Prewitt : '+ OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile (OpenPictureDialog1.FileName); Image2.Visible := False;
179 end; end; procedure TFormPrewitt.btPrewittClick(Sender: TObject); begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; Prewitt; end; procedure TFormPrewitt.Prewitt; const prewitt : array[0..1,0..2,0..2] of smallint= (((-1,0,1),(-1,0,1),(-1,0,1)), ((-1,-1,-1),(0,0,0),(1,1,1)));
var row:array[0..8] of pbytearray; col:pbytearray; x,y:smallint; i,j,k,p:smallint; image:tbitmap; sum,jum:longint; begin p:=-120; image:=Tbitmap.Create; image.Assign(Image1.Picture.Bitmap); for y:=1 to Image1.Height-2 do begin for i:=-1 to 1 do row[i+1]:=image.ScanLine[y+i]; col:=Image1.Picture.Bitmap.ScanLine[y]; x:=3; repeat sum:=0; for i:=-1 to 1 do for j:=-1 to 1 do sum:=sum+(prewitt[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+(prewitt[1,i+1,j+1]*row[i+1,x+j*3]); sum:=(sum+jum)+p; if sum>255 then sum:=255; if sum<0 then sum:=0; for k:=0 to 2 do col[x+k]:=sum; inc(x,3);
180 until x>=3*(Image1.Width-4); end; Image2.picture.bitmap:=Image1.Picture.Bitmap; image.free; end; procedure TFormPrewitt.btExitClick(Sender: TObject); begin FormPrewitt.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);
implementation const PercentR = 0.299; PercentG = 0.587; PercentB = 0.114; function ByteRange (r:double) : byte; begin if r<0 then ByteRange:=0 else if r>255 then ByteRange:=255 else ByteRange:=Round(r); end; function RgbToGray (Clr:TColor) : byte; var r,g,b:byte; begin r := GetRValue(Clr);
181 g := GetGValue(Clr); b := GetBValue(Clr); RgbToGray := ByteRange (r*PercentR + g*PercentG + b*PercentB); 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; end.
182
BAB 10 DETEKSI TEPI ROBERT 10.1 DASAR TEORI DETEKSI TEPI ROBERT Operetor Robert adalah operator yang berbasis gradien yang menggunakan kernel ukuran 2x2 piksel. Operator ini mengambil arah diagonal untuk penentuan arah dalam perhitungan nilai gradien. Perhitungan gradien dalam operator robert adalah: G = |f(x,y) – f(x+1, y+1)| + |f(x+1, y) – f(x, y+1)|………………………(10.1) Bila ditulis dalam komponen gradien menjadi: G = |Gx| + |Gy|……………………………………………………………….(10.2) Dengan Gx dan Gy dihitung menggunakan kernel konvolusi sebagai berikut. Gx =
1 0
0 -1
Gy =
0 1
-1 0
Titik ini terletak di antara 4 piksel dalam ukuran 2x2 piksel yang berdekatan atau di pusat kernel, yaitu koordinat hasil interpolarisasi *
(+1 ++1 2
,
2
,………………………………………………………………………………….(10.3)
Sebenarnya operator robert merupakan perkiraan nilai gradien kontinu di titik tersebut, jadi bukan merupakan nilai gradien yang sebenarnya di titik tersebut.
10.2 CARA MEMBUAT PROGRAM DETEKSI TEPI ROBERT LAKUKAN LANGKAH BERIKUT:
183 1. Buka program delphi, dengan cara pilih menu start, program borland delphi 7, delphi 7.
Gambar 10.1 Start Program 2. Kemudian pilih menu file, new, application.
Gambar 10.2 New Application
184 3. Pada object inspector, ubah properti captionnya dengan nama Deteksi Tepi Robert, dan namenya dengan nama FormRobert.
Gambar 10.3 Form Robert 4. Simpan unit dan projectnya dengan cara save all.
Gambar 10.4 Save All 5. Beri nama unitnya dengan nama UnitRobert.
Gambar 10.5 Save UnitRobert
185 6. Beri nama projectnya dengan nama ProjectRobert.
Gambar 10.6 Save ProjectRobert 7. Tambahkan image ke form dengan cara pilih menu Additional, image, lalu klik ke form.
Gambar 10.7 Menu Image 8. Pada Properties rubah stretchnya ke true dan autosizenya true.
Gambar 10.8 Stretch True
186 9. Dengan cara yang sama tambahkan image2 di sebelah kanan image1 kemudian ubah stretchnya ke true dan autosizenya true.
Gambar 10.9 Penambahan Image 2 10. Tambahkan button ke form, dengan cara pilih menu standart, button, lalu klik ke form
Gambar 10.10 Menu Button 11. Pada oject inspector rubah properti captionnya dengan nama Open, kemudian namenya dengan nama btOpen.
Gambar 10.11 Button Open
187 12. Tambahkan OpenPictureDialog ke form, dengan cara pilih menu dialog, OpenPictureDialog, lalu klik ke form.
Gambar 10.12 Menu OpenPictureDialog 13. Hasilnya sebagai berikut.
Gambar 10.13 Hasil OpenPictureDialog 14. Doble klik button open kemudian ketik program yang di hurup tebal berikut. var FormRobert: TFormRobert; FileNameImg: string; implementation {$R *.dfm} procedure TFormRobert.btOpenClick(Sender: TObject); begin if OpenPictureDialog1.Execute then begin FileNameImg := OpenPictureDialog1.FileName; Caption := 'Deteksi Tepi Robert : '+ OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile (OpenPictureDialog1.FileName); Image2.Visible := False; end; end;
188 end. 15. Tambahkan button pada form, pada object inspector rubah properties captionnya dengan nama Robert dan Namenya dengan nama btRobert.
Gambar 10.14 Button Robert 16. Tambahkan unit baru, dengan cara file, new unit.
Gambar 10.15 New Unit 17. Simpan unitnya dengan cara save as.
Gambar 10.16 Save as 18. Berinama unitnya dengan nama UnitImageProses.
189
Gambar 10.17 Save UnitImageProses 19. Hasilnya sebagai berikut.
Gambar 10.18 Hasil UnitImageProses 20. 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);
implementation
190 const PercentR = 0.299; PercentG = 0.587; PercentB = 0.114; function ByteRange (r:double) : byte; begin if r<0 then ByteRange:=0 else if r>255 then ByteRange:=255 else ByteRange:=Round(r); end; function RgbToGray (Clr:TColor) : byte; var r,g,b:byte; begin r := GetRValue(Clr); g := GetGValue(Clr); b := GetBValue(Clr); RgbToGray := ByteRange (r*PercentR + g*PercentG + b*PercentB); 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; end.
21. Kembali ke FormRobert, caranya klik unitRobert
191
Gambar 10.19 Kembali Ke FormRobert 22. Lalu klik toggle form.
Gambar 10.20 Menu Toggle 23. Doble klik button Robert.
Gambar 10.21 Button Robert
24. Lalu ketik program berikut yang tercetak tebal. procedure TFormRobert.btRobertClick(Sender: TObject); begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; Robert; end;
192 25. Di bawah private tulis program tertulis huruf tebal berikut: private procedure Robert; 26. Dibawah procedure TformaRobert.btRobertClick(Sender. Tobject) ketik program tertulis hurup tebal berikut:
procedure TFormRobert.btRobertClick(Sender: TObject); begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; Robert; end; procedure TFormRobert.Robert; const robert : array[0..1,0..1,0..1] of smallint= (((1,0),(0,-1)), ((-1,0),(0,1))); var row:array[0..8] of pbytearray; col:pbytearray; x,y:smallint; i,j,k,p:smallint; image:tbitmap; sum,jum:longint; begin p:=-120; image:=Tbitmap.Create; image.Assign(Image1.Picture.Bitmap); for y:=1 to Image1.Height-2 do begin for i:=-1 to 1 do row[i+1]:=image.ScanLine[y+i]; col:=Image1.Picture.Bitmap.ScanLine[y]; x:=3; repeat sum:=0; for i:=-1 to 1 do for j:=-1 to 1 do sum:=sum+(Robert[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+(Robert[1,i+1,j+1]*row[i+1,x+j*3]); sum:=(sum+jum)+p; if sum>255 then sum:=255; if sum<0 then sum:=0;
193 for k:=0 to 2 do col[x+k]:=sum; inc(x,3); until x>=3*(Image1.Width-4); end; Image2.picture.bitmap:=Image1.Picture.Bitmap; image.free; end; 27. Di bawah implementasi ketik program yang tertulis huruf tebal berikut. implementation {$R *.dfm} uses UnitImageProses; 28. Tambahkan button ke form, lalu pada object inspector rubah properties captionnya dengan nama Exit dan namenya dengan nama btExit.
Gambar 10.22 Button Exit 29. Doble klik button Exit, lalu ketik program berikut. procedure TFormRobert.btExitClick(Sender: TObject); begin FormRobert.Close; end; 30. Simpan program dengan cara save all.
31. Compiler progran dengan cara pilih menu Project, Compile ProjectRobert.
194
Gambar 10.23 Compiler ProjectRobert 32. Lalu jalankan progran dengan cara pilih menu Run, Run.
Gambar 10.24 Menu Run 33. Hasil sebagai berikut.
Gambar 10.25 Hasil Program Robert
34. Keluar dari program klik button Exit.
195
10.3 PROGRAM DETEKSI TEPI ROBERT SELENGKAPNYA ADALAH SEBAGAI BERIKUT: unit UnitRobert; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtDlgs, StdCtrls, ExtCtrls; type TFormRobert = class(TForm) Image1: TImage; Image2: TImage; btOpen: TButton; OpenPictureDialog1: TOpenPictureDialog; btRobert: TButton; btExit: TButton; procedure btOpenClick(Sender: TObject); procedure btRobertClick(Sender: TObject); procedure btExitClick(Sender: TObject); private procedure Robert; public { Public declarations } end; var FormRobert: TFormRobert; FileNameImg: string; implementation {$R *.dfm} uses UnitImageProses; procedure TFormRobert.btOpenClick(Sender: TObject); begin if OpenPictureDialog1.Execute then begin FileNameImg := OpenPictureDialog1.FileName; Caption := 'Deteksi Tepi Robert : '+ OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile (OpenPictureDialog1.FileName);
196 Image2.Visible := False; end; end; procedure TFormRobert.btRobertClick(Sender: TObject); begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; Robert; end; procedure TFormRobert.Robert; const robert : array[0..1,0..1,0..1] of smallint= (((1,0),(0,-1)), ((-1,0),(0,1))); var row:array[0..8] of pbytearray; col:pbytearray; x,y:smallint; i,j,k,p:smallint; image:tbitmap; sum,jum:longint; begin p:=-120; image:=Tbitmap.Create; image.Assign(Image1.Picture.Bitmap); for y:=1 to Image1.Height-2 do begin for i:=-1 to 1 do row[i+1]:=image.ScanLine[y+i]; col:=Image1.Picture.Bitmap.ScanLine[y]; x:=3; repeat sum:=0; for i:=-1 to 1 do for j:=-1 to 1 do sum:=sum+(Robert[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+(Robert[1,i+1,j+1]*row[i+1,x+j*3]); sum:=(sum+jum)+p; if sum>255 then sum:=255; if sum<0 then sum:=0; for k:=0 to 2 do col[x+k]:=sum; inc(x,3); until x>=3*(Image1.Width-4); end;
197 Image2.picture.bitmap:=Image1.Picture.Bitmap; image.free; end; procedure TFormRobert.btExitClick(Sender: TObject); begin FormRobert.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);
implementation const PercentR = 0.299; PercentG = 0.587; PercentB = 0.114; function ByteRange (r:double) : byte; begin if r<0 then ByteRange:=0 else if r>255 then ByteRange:=255 else ByteRange:=Round(r); end; function RgbToGray (Clr:TColor) : byte; var r,g,b:byte; begin r := GetRValue(Clr); g := GetGValue(Clr);
198 b := GetBValue(Clr); RgbToGray := ByteRange (r*PercentR + g*PercentG + b*PercentB); 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; end.
199
200
BAB 11 LOW PASS FILTER 11.1 DASAR TEORI LOW PASS FILTER Low pass filter gunanya untuk menghilangkan noise, dengan cara meloloskan komponen yang berfrekuensi rendah dan menekan komponen yang berfrekuensi tinggi. Rumus yang dipakai adalah: G(x,y) = f(x,y) * h(x,y)…………….………………………………………….(11.1) Dengan : G(x,y) adalah hasil low pass. f(x,y) adalah citra awal.. h(x,y) adalah template low pass filter. Aturan low pass filter adalah semua koefisien harus positif. Templete yang dipakai sebagai low pass filter adalah: 1 1 1
1 1 1
1 1 1
11.2 CARA MEMBUAT PROGRAM LOW PASS FILTER ADALAH SEBAGAI BERIKUT: 1. Buka program delphi, dengan cara pilih menu start, program borland delphi 7, delphi 7.
Gambar 11.1 Start Program
201 2. Kemudian pilih menu file, new, application.
Gambar 11.2 New Application 3. Pada object inspector, ubah properti captionnya dengan nama Low Pass Filter, dan namenya dengan nama FormLowPassFilter.
Gambar 11.3 Form LowPassFilter 4. Simpan unit dan projectnya dengan cara save all.
Gambar 11.4 Save All
202 5. Beri nama unitnya dengan nama UnitLowPassFilter.
Gambar 11.5 Save UnitLowPassFilter 6. Beri nama projectnya dengan nama ProjectLowPassFilter
Gambar 11.6 Save ProjectLowPassFilter 7. Tambahkan image ke form dengan cara pilih menu Additional, image, lalu klik ke form.
Gambar 11.7 Menu Image
203 8. Rubah stretchnya ke true dan Autosizenya true.
Gambar 11.8 Stretch True 9. Dengan cara yang sama tambahkan image2 di sebelah kanan image1 kemudian ubah stretchnya ke true dan autosizenya true
Gambar 11.9 Penambahan Image 2 10. Tambahkan button ke form, dengan cara pilih menu standart, button, lalu klik ke form
Gambar 11.10 Menu Button
204
11. Pada oject inspector rubah properti captionnya dengan nama Open, kemudian namenya dengan nama btOpen.
Gambar 11.11 Button Open
12. Tambahkan OpenPictureDialog ke form, dengan cara pilih menu dialog, OpenPictureDialog, lalu klik ke form.
Gambar 11.12 Menu OpenPictureDialog 13. Hasilnya sebagai berikut.
Gambar 11.13 Hasil OpenPictureDialog
205 14. Doble klik button open kemudian ketik program yang di hurup tebal berikut. var FormLowPassFilter: TFormLowPassFilter; FileNameImg: string; implementation {$R *.dfm} procedure TFormLowPassFilter.btOpenClick(Sender: TObject); begin if OpenPictureDialog1.Execute then begin FileNameImg := OpenPictureDialog1.FileName; Caption := 'LowPassFilter : '+ OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile (OpenPictureDialog1.FileName); Image2.Visible := False; end; end; 15. Tambahkan button pada form, pada object inspector rubah properties captionnya dengan nama Low Pass Filter dan Namenya dengan nama btLowPassFilter.
Gambar 11.14 Button Low Pass Filter
16. Tambahkan unit baru, dengan cara file, new unit.
206
Gambar 11.15 New Unit 17. Simpan unitnya dengan cara save as.
Gambar 11.16 Save As 18. Beri nama unitnya dengan nama UnitImageProses.
Gambar 11.17 Save UnitImageProses
207
19. Hasilnya sebagai berikut.
Gabar 11.18 Hasil UnitImageProses 20. 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); implementation const PercentR = 0.299; PercentG = 0.587; PercentB = 0.114; function ByteRange (r:double) : byte; begin if r<0 then ByteRange:=0 else if r>255 then ByteRange:=255 else ByteRange:=Round(r); end; function RgbToGray (Clr:TColor) : byte;
208 var r,g,b:byte; begin r := GetRValue(Clr); g := GetGValue(Clr); b := GetBValue(Clr); RgbToGray := ByteRange (r*PercentR + g*PercentG + b*PercentB); 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; end; end; end.
209 21. Kembali ke FormLowPassFilter, caranya klik UnitLowPassFilter
Gambar 11.19 Kembali ke FormLowPassFilter 22. Lalu klik toggle form.
Gambar 11.20 Menu Toggle 23. Doble klik button Low Pass Filter
Gambar 11.21 Klik Button Low Pass Filter
210 24. Lalu ketik program yang huruf tebal berikut procedure TFormLowPassFilter.btLowPassFilterClick(Sender: TObject); begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; LowPassFilter; end; 25. Di bawah private tulis program tertulis huruf tebal berikut: private procedure LowPassFilter;
26. Dibawah procedure TFormLowPassFilter.btLowPassFilterClick (Sender. Tobject) ketik program tertulis hurup tebal berikut:
procedure TFormLowPassFilter.btLowPassFilterClick(Sender: TObject); begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; LowPassFilter; end; procedure TFormLowPassFilter.LowPassFilter; const LowPassFilter : array[0..1,0..2,0..2] of smallint= (((1,1,1),(1,1,1),(1,1,1)), ((0,0,0),(0,0,0),(0,0,0))); var row:array[0..8] of pbytearray; col:pbytearray; x,y:smallint; i,j,k,p:smallint; image:tbitmap; sum,jum:longint; begin p:=-120; image:=Tbitmap.Create; image.Assign(Image1.Picture.Bitmap); for y:=1 to Image1.Height-2 do begin for i:=-1 to 1 do row[i+1]:=image.ScanLine[y+i]; col:=Image1.Picture.Bitmap.ScanLine[y]; x:=3; repeat sum:=0;
211 for i:=-1 to 1 do for j:=-1 to 1 do sum:=sum+(LowPassFilter[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+(LowPassFilter[1,i+1,j+1]*row[i+1,x+j*3]); sum:=(sum+jum)+p; if sum>255 then sum:=255; if sum<0 then sum:=0; for k:=0 to 2 do col[x+k]:=sum; inc(x,3); until x>=3*(Image1.Width-4); end; Image2.picture.bitmap:=Image1.Picture.Bitmap; image.free; end;
27. Di bawah implementasi ketik program yang tertulis huruf tebal berikut. implementation {$R *.dfm} uses UnitImageProses; 28. Tambahkan button ke form, lalu pada object inspector rubah properties captionnya dengan nama Exit dan namenya dengan nama btExit.
Gambar 11.22 Button Exit
29. Doble klik button Exit, lalu ketik program berikut.
212 procedure TFormLowPassFilter.btExitClick(Sender: TObject); begin FormLowPassFilter.Close; end; 30. Simpan program dengan cara save all. 31. Compiler progran ProjectLowPassFilter.
dengan
cara
pilih
menu
Gambar 11.23 Compiler ProjectLowPassFilter 32. Lalu jalankan progran dengan cara pilih menu Run, Run.
Gambar 11.24 Menu Run
33. Hasil sebagai berikut.
Project,
Compile
213
Gambar 11.25 Hasil Mammografi
Gambar 11.26 Hasil Photo 34. Keluar dari program klik button Exit.
11.3 PROGRAM LOW PASS FILTER SELENGKAPNYA ADALAH SEBAGAI BERIKUT: unit UnitLowPassFilter; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, ComCtrls, ExtDlgs, StdCtrls;
214
type TFormLowPassFilter = class(TForm) Image1: TImage; Image2: TImage; btOpen: TButton; OpenPictureDialog1: TOpenPictureDialog; btLowPassFilter: TButton; btExit: TButton; procedure btOpenClick(Sender: TObject); procedure btLowPassFilterClick(Sender: TObject); procedure btExitClick(Sender: TObject); private procedure LowPassFilter; public { Public declarations } end; var FormLowPassFilter: TFormLowPassFilter; FileNameImg: string; implementation {$R *.dfm} uses UnitImageProses; procedure TFormLowPassFilter.btOpenClick(Sender: TObject); begin if OpenPictureDialog1.Execute then begin FileNameImg := OpenPictureDialog1.FileName; Caption := 'LowPassFilter : '+ OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile (OpenPictureDialog1.FileName); Image2.Visible := False; end; end; procedure TFormLowPassFilter.btLowPassFilterClick(Sender: TObject); begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; LowPassFilter; end; procedure TFormLowPassFilter.LowPassFilter; const LowPassFilter : array[0..1,0..2,0..2] of smallint=
215
(((1,1,1),(1,1,1),(1,1,1)), ((0,0,0),(0,0,0),(0,0,0))); var row:array[0..8] of pbytearray; col:pbytearray; x,y:smallint; i,j,k,p:smallint; image:tbitmap; sum,jum:longint; begin p:=-120; image:=Tbitmap.Create; image.Assign(Image1.Picture.Bitmap); for y:=1 to Image1.Height-2 do begin for i:=-1 to 1 do row[i+1]:=image.ScanLine[y+i]; col:=Image1.Picture.Bitmap.ScanLine[y]; x:=3; repeat sum:=0; for i:=-1 to 1 do for j:=-1 to 1 do sum:=sum+(LowPassFilter[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+(LowPassFilter[1,i+1,j+1]*row[i+1,x+j*3]); sum:=(sum+jum)+p; if sum>255 then sum:=255; if sum<0 then sum:=0; for k:=0 to 2 do col[x+k]:=sum; inc(x,3); until x>=3*(Image1.Width-4); end; Image2.picture.bitmap:=Image1.Picture.Bitmap; image.free; end;
procedure TFormLowPassFilter.btExitClick(Sender: TObject); begin FormLowPassFilter.Close; end; end.
216 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);
implementation const PercentR = 0.299; PercentG = 0.587; PercentB = 0.114; function ByteRange (r:double) : byte; begin if r<0 then ByteRange:=0 else if r>255 then ByteRange:=255 else ByteRange:=Round(r); end; function RgbToGray (Clr:TColor) : byte; var r,g,b:byte; begin r := GetRValue(Clr); g := GetGValue(Clr); b := GetBValue(Clr); RgbToGray := ByteRange (r*PercentR + g*PercentG + b*PercentB); 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);
217 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; end.
218
BAB 12 HIGH PASS FILTER 12.1 DASAR TEORI HIGH PASS FILTER High pass filter gunanya untuk menghilangkan noise, dengan cara meloloskan komponen yang berfrekuensi tinggi dan menekan komponen yang berfrekuensi rendah. Rumus yang dipakai adalah: G(x,y) = f(x,y) * h(x,y)………………….…………………………………….(12.1) Dengan : G(x,y) adalah hasil High pass. f(x,y) adalah citra awal.. h(x,y) adalah template high pass filter. Aturan high pass filter adalah: · Koefisien filter boleh positif, negative dan nol. · Jumlah semua koefisien adalah 1 atau 0. Frekuensi rendah akan turun nilainya bila jumlah koefisien sama dengan 0, frekuensi rendah akan tetap sama nilainya dengan nilai semula bila jumlah koefisien sama dengan 1. Templete yang dipakai sebagai high pass filter dengan jumlah koefisien sama dengan 0 adalah: -1 -1 -1
-1 8 -1
-1 -1 -1
Templete yang dipakai sebagai high pass filter dengan jumlah koefisien sama dengan 1 adalah: -1 -1 -1
-1 9 -1
-1 -1 -1
219
12.2 CARA MEMBUAT PROGRAM HIGH PASS FILTER ADALAH SEBAGAI BERIKUT: 1. Buka program delphi, dengan cara pilih menu start, program borland delphi 7, delphi 7.
Gambar 12.1 Start Program 2. Kemudian pilih menu file, new, application.
Gambar 12.2 New application
3. Pada object inspector, ubah properti captionnya dengan nama High Pass Filter, dan namenya dengan nama FormHighPassFilter.
220
Gambar 12.3 FormHighPassFilter 4. Simpan unit dan projectnya dengan cara save all.
Gambar 12.4 Save All
5. Beri nama unitnya dengan nama UnitHighPassFilter.
221
Gambar 12.5 Save UnitHighPassFilter 6. Beri nama projectnya dengan nama ProjectHighPassFilter
Gambar 12.6 Save ProjectHighPassFilter 7. Tambahkan image ke form dengan cara pilih menu Additional, image, lalu klik ke form.
Gambar 12.7 Menu Image
222 8. Rubah stretchnya ke true dan Autosizenya true.
Gambar 12.8 Stretch True 9. Dengan cara yang sama tambahkan image2 di sebelah kanan image1 kemudian ubah stretchnya ke true dan autosizenya true
Gambar 12.9 Penambahan Image 2
223 10. Tambahkan button ke form, dengan cara pilih menu standart, button, lalu klik ke form
Gambar 12.10 Menu Button 11. Pada oject inspector rubah properti captionnya dengan nama Open, kemudian namenya dengan nama btOpen.
Gambar 12.11 Button Open 12. Tambahkan OpenPictureDialog ke form, dengan cara pilih menu dialog, OpenPictureDialog, lalu klik ke form.
Gambar 12.12 Menu OpenPictureDialog
224 13. Hasilnya sebagai berikut.
Gambar 12.13 Hasil OpenPictureDialog 14. Doble klik button open kemudian ketik program yang di hurup tebal berikut. var FormHighPassFilter: TFormHighPassFilter; FileNameImg: string; implementation {$R *.dfm} procedure TFormHighPassFilter.btOpenClick(Sender: TObject); begin if OpenPictureDialog1.Execute then begin FileNameImg := OpenPictureDialog1.FileName; Caption := 'HighPassFilter : '+ OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile (OpenPictureDialog1.FileName); Image2.Visible := False; end; end;
15. Tambahkan button pada form, pada object inspector rubah properties captionnya dengan nama High Pass Filter dan Namenya dengan nama btHighPassFilter.
225
Gambar 12.14 Button High Pass filter
16. Tambahkan unit baru, dengan cara file, new unit.
Gambar 12.15 New Unit
17. Simpan unitnya dengan cara save as.
Gambar 12.16 Save As 18. Beri nama unitnya dengan nama UnitImageProses.
226
Gambar 12.17 Save UnitImageProses 19. Hasilnya sebagai berikut.
Gambar 12.18 Hasil UnitImageProses 20. 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); implementation
227
const PercentR = 0.299; PercentG = 0.587; PercentB = 0.114; function ByteRange (r:double) : byte; begin if r<0 then ByteRange:=0 else if r>255 then ByteRange:=255 else ByteRange:=Round(r); end; function RgbToGray (Clr:TColor) : byte; var r,g,b:byte; begin r := GetRValue(Clr); g := GetGValue(Clr); b := GetBValue(Clr); RgbToGray := ByteRange (r*PercentR + g*PercentG + b*PercentB); 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; end; end; end.
228 21. Kembali ke FormHighPassFilter, caranya klik UnitHighPassFilter
Gambar 12.19 Kembali ke FormHighPassFilter 22. Lalu klik toggle form.
Gambar 12.20 Toggle 23. Doble klik button High Pass Filter
Gambar 12.21 Klik Button High Pass Filter 24. Lalu ketik program yang huruf tebal berikut procedure TFormHighPassFilter.btHigPassFilterClick(Sender: TObject); begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; HighPassFilter; end;
229 25. Di bawah private tulis program tertulis huruf tebal berikut: private procedure HighPassFilter; 26. Dibawah procedure TFormHighPassFilter.btHighPassFilterClick (Sender. Tobject) ketik program tertulis hurup tebal berikut:
procedure TFormHighPassFilter.btHighPassFilterClick(Sender: TObject); begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; HighPassFilter; end; procedure TFormHighPassFilter.HighPassFilter; const HighPassFilter : array[0..1,0..2,0..2] of smallint= (((-1,-1,-1),(-1,8,-1),(-1,-1,-1)), ((0,0,0),(0,0,0),(0,0,0))); var row:array[0..8] of pbytearray; col:pbytearray; x,y:smallint; i,j,k,p:smallint; image:tbitmap; sum,jum:longint; begin p:=-120; image:=Tbitmap.Create; image.Assign(Image1.Picture.Bitmap); for y:=1 to Image1.Height-2 do begin for i:=-1 to 1 do row[i+1]:=image.ScanLine[y+i]; col:=Image1.Picture.Bitmap.ScanLine[y]; x:=3; repeat sum:=0; for i:=-1 to 1 do for j:=-1 to 1 do sum:=sum+(HighPassFilter[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+(HighPassFilter[1,i+1,j+1]*row[i+1,x+j*3]); sum:=(sum+jum)+p; if sum>255 then sum:=255;
230 if sum<0 then sum:=0; for k:=0 to 2 do col[x+k]:=sum; inc(x,3); until x>=3*(Image1.Width-4); end; Image2.picture.bitmap:=Image1.Picture.Bitmap; image.free; end;
27. Di bawah implementasi ketik program yang tertulis huruf tebal berikut. implementation {$R *.dfm} uses UnitImageProses;
28. Tambahkan button ke form, lalu pada object inspector rubah properties captionnya dengan nama Exit dan namenya dengan nama btExit.
Gambar 12.22 Button Exit 29. Doble klik button Exit, lalu ketik program berikut. procedure TFormHighPassFilter.btExitClick(Sender: TObject); begin FormHighPassFilter.Close; end; 30. Simpan program dengan cara save all.
31. Compiler progran dengan cara pilih menu Project, Compile ProjectHighPassFilter.
231
Gambar 12.23 Compiler ProjectHighPassFilter
32. Lalu jalankan progran dengan cara pilih menu Run, Run.
Gambar 12.24 Menu Run
33. Hasil sebagai berikut.
232
Gambar 12.25 Hasil Mammografi
Gambar 12.26 Hasil Photo 34. Keluar dari program klik button Exit.
233
12.3 PROGRAM HIGHT PASS FILTER SELENGKAPNYA ADALAH SEBAGAI BERIKUT: unit UnitHighPassFilter; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtDlgs, StdCtrls, ExtCtrls; type TFormHighPassFilter = class(TForm) Image1: TImage; Image2: TImage; btOpen: TButton; OpenPictureDialog1: TOpenPictureDialog; btHigPassFilter: TButton; btExit: TButton; procedure btOpenClick(Sender: TObject); procedure btHigPassFilterClick(Sender: TObject); procedure btExitClick(Sender: TObject); private procedure HighPassFilter; public { Public declarations } end; var FormHighPassFilter: TFormHighPassFilter; FileNameImg: string; implementation {$R *.dfm} uses UnitImageProses;
procedure TFormHighPassFilter.btOpenClick(Sender: TObject); begin if OpenPictureDialog1.Execute then begin FileNameImg := OpenPictureDialog1.FileName; Caption := 'HighPassFilter : '+ OpenPictureDialog1.FileName;
234 Image1.Picture.LoadFromFile (OpenPictureDialog1.FileName); Image2.Visible := False; end; end; procedure TFormHighPassFilter.btHigPassFilterClick(Sender: TObject); begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; HighPassFilter; end; procedure TFormHighPassFilter.HighPassFilter; const HighPassFilter : array[0..1,0..2,0..2] of smallint= (((-1,-1,-1),(-1,8,-1),(-1,-1,-1)), ((0,0,0),(0,0,0),(0,0,0))); var row:array[0..8] of pbytearray; col:pbytearray; x,y:smallint; i,j,k,p:smallint; image:tbitmap; sum,jum:longint; begin p:=-120; image:=Tbitmap.Create; image.Assign(Image1.Picture.Bitmap); for y:=1 to Image1.Height-2 do begin for i:=-1 to 1 do row[i+1]:=image.ScanLine[y+i]; col:=Image1.Picture.Bitmap.ScanLine[y]; x:=3; repeat sum:=0; for i:=-1 to 1 do for j:=-1 to 1 do sum:=sum+(HighPassFilter[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+(HighPassFilter[1,i+1,j+1]*row[i+1,x+j*3]); sum:=(sum+jum)+p; if sum>255 then sum:=255; if sum<0 then sum:=0; for k:=0 to 2 do col[x+k]:=sum; inc(x,3);
235 until x>=3*(Image1.Width-4); end; Image2.picture.bitmap:=Image1.Picture.Bitmap; image.free; end;
procedure TFormHighPassFilter.btExitClick(Sender: TObject); begin FormHighPassFilter.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); implementation const PercentR = 0.299; PercentG = 0.587; PercentB = 0.114; function ByteRange (r:double) : byte; begin if r<0 then ByteRange:=0 else if r>255 then ByteRange:=255 else ByteRange:=Round(r); end; function RgbToGray (Clr:TColor) : byte; var r,g,b:byte; begin r := GetRValue(Clr); g := GetGValue(Clr);
236 b := GetBValue(Clr); RgbToGray := ByteRange (r*PercentR + g*PercentG + b*PercentB); 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; end; end; end.
237
238
BAB 13 K-MEANS 13.1 Algoritma K-Means K-Means merupakan metode klasterisasi yang paling terkenal dan banyak digunakan di berbagai bidang karena sederhana, mudah diimplementasikan, memiliki kemampuan untuk mengklaster data yang besar, mampu menangani data outlier, dan kompleksitas waktunya linear O(nKT) dengan n adalah jumlah dokumen, K adalah jumlah kluster, dan T adalah jumlah iterasi. K-means merupakan metode pengklasteran secara partitioning yang memisahkan data ke dalam kelompok yang berbeda. Dengan partitioning secara iteratif, K-Means mampu meminimalkan ratarata jarak setiap data ke klasternya. Metode ini dikembangkan oleh Mac Queen pada tahun 1967. Dasar algoritma K-means adalah sebagai berikut : 1. Tentukan nilai k sebagai jumlah klaster yang ingin dibentuk. 2. Bangkitkan k centroid (titik pusat klaster) awal secara random. 3. Hitung jarak setiap data ke masing-masing centroid menggunakan rumus korelasi antar dua objek yaitu Euclidean Distance dan kesamaan Cosine. 4. Kelompokkan setiap data berdasarkan jarak terdekat antara data dengan centroidnya. 5. Tentukan posisi centroid baru ( k C ) dengan cara menghitung nilai rata-rata dari data-data yang ada pada centroid yang sama.
………………………..………………………………………………….(13.1) Dimana k n adalah jumlah dokumen dalam cluster k dan i d adalah dokumen dalam cluster k. 6. Kembali ke langkah 3 jika posisi centroid baru dengan centroid lama tidak sama. Adapun karakteristik dari algoritma K-Means salah satunya adalah sangat sensitif dalam penentuan titik pusat awal klaster karena K-Means membangkitkan titik pusat klaster awal secara random. Pada saat pembangkitan awal titik pusat yang random tersebut mendekati solusi akhir pusat klaster, K-Means mempunyai posibilitas yang tinggi untuk menemukan titik pusat klaster yang tepat. Sebaliknya, jika awal titik
239 pusat tersebut jauh dari solusi akhir pusat klaster, maka besar kemungkinan ini menyebabkan hasil pengklasteran yang tidak tepat. Akibatnya K-Means tidak menjamin hasil pengklasteran yang unik. Inilah yang menyebabkan metode K-Means sulit untuk mencapai optimum global, akan tetapi hanya minimum lokal. Selain itu, algoritma K-Means hanya bisa digunakan untuk data yang atributnya bernilai numeric. Cara kerja K- Mean. Masukan jumlah kluster : K = 2. Tentukan pusat kluster awal secara acak. Contoh : C1 (x1, y1, nilai piksel) , C2 (x2, y2, nilai piksel) C1 = (1,1,2) dan C2 = (2,3,5)
1 2 3 4 5
1 2 3 2 4 1
2 0 1 5 6 3
Lebar citra Nilai gray level
Tinggi citra Langkah 1: hitung jarak Rumus jarak d = Ѵ {(x2-x1)2 + (y2-y1)2 + (p2-p1)2
}
Contoh d = V { (3-1)2 + (2-1)2 +(5-2)2 } = 3,74
(1,1,2) (1,2,0) (2,1,3) (2,2,1) (3,1,2) (3,2,5) (4,1,2) (4,2,6) (5,1,1) (5,2,3)
C1 (1,1,2) 0 2,24=2 1,41=1 1,73=1 2 3,74=3 3 5,09=5 4,12=4 4,24=4
C2(3,2,5)
keterangan
3,74=3 5,38=5 2,45=2 4,12=4 3,16=3 0 3,32=3 1,41=1 4,58=4 2,83=2
Karena 0 < 3 maka masuk ke kluster 1 5,38 dibulatkan kedepan jadi 5
Karena 1 < 5 maka masuk ke klaster 2
Langkah 2 : warnai vektornya (x,y,p)
240
(1,1,2) (1,2,0) (2,1,3) (2,2,1) (3,1,2) (3,2,5) (4,1,2) (4,2,6) (5,1,1) (5,2,3)
C1 (1,1,2) 0 2,24=2 1,41=1 1,73=1 2 3,74=3 3 5,09=5 4,12=4 4,24=4
C2(3,2,5)
Bandingkan mana yang lebih kecil maka warna mengikuti yg lebih kecil
3,74=3 5,38=5 2,45=2 4,12=4 3,16=3 0 3,32=3 1,41=1 4,58=4 2,83=2
Langkah 3 : cari pusat klucter yg baru dengan rumus C 1= {(x1 + x2 + x3 + …+xn)/n , (y1 +y2+y3+…+yn)/n , (p1+p2+p3+…+Pn)/n } C1= {(1+1+2+2+3+4+5)/7 , (1+2+1+2+1+1+1)/7 , (2+0+3+1+2+2+1)/7}=(2,57 , 1,57)=(2,1,1) C 2= {(x1 + x2 + x3 + …+xn)/n , (y1 +y2+y3+…+yn)/n , (p1+p2+p3+…+Pn)/n } C2 = {(3+4+5)/3 ), (2+2+2)/3, (5+6+3)/3} = (4 , 2 , 4,67)=(4,2,4)
1,29 ,
Langkah 4 : sama dengan langkah satu mencari jarak d dengan pusat kluster yg baru
(1,1,2) (1,2,0) (2,1,3) (2,2,1) (3,1,2) (3,2,5) (4,1,2) (4,2,6) (5,1,1) (5,2,3)
C1 (2 , 1 , 1)
C2(4 , 2 , 4)
1,4 = 1 1,7=1 2 1 1,4=1 4,24=4 2,23=2 5,47 3 3,74=3
3,74=3 5 2,44=2 3,6=3 2,44=2 1,4=1 2,23=2 2 3,31=3 1,4=1
Bandingkan mana yang lebih kecil maka warna mengikuti yg lebih kecil
Langkah 5 ulangi terus langkah 1 – 3 selama pusat kluster berubah terus. Bila nilai c sekarang sama dengan sebelumnya maka berhenti. C1= {(1+1+2+2+3+4+5)/7 , (1+2+1+2+1+1+1)/7, (2+0+3+1+2+2+1)/7}=(2,57 , 1,28, 1,57) = (2,1,1) C2={(3+4+5)/3 , (2+2+2)/3, (5+6+3)/3} = (4,3, 4,66)= (4,3,4)
C1 (2 , 1 , 1)
C2(4 , 3, 4)
Bandingkan mana yang lebih kecil maka warna mengikuti yg lebih kecil
241 (1,1,2) (1,2,0) (2,1,3) (2,2,1) (3,1,2) (3,2,5) (4,1,2) (4,2,6) (5,1,1) (5,2,3) Setelah pusat kluster tidak berubah , kemudian munculkan citranya sesuai warna clusternya.
13.2 Cara membuat program K-Mean lakukan langkah berikut: 1. Buka program delphi, dengan cara pilih menu start, program borland delphi 7, delphi 7.
Gambar 13.1 Start Program
2. Kemudian pilih menu file, new, application.
242
Gambar 13.2 New Application
3. Pada object inspector, ubah properti captionnya dengan nama KMean, dan namenya dengan nama FormKMean.
Gambar 13.3 FormKMean 4. Simpan unit dan projectnya dengan cara save all.
Gambar 13.4 Save All
5. Beri nama unitnya dengan nama UnitKMean.
243
Gambar 13.5 Save UnitKMean 6. Beri nama projectnya dengan nama ProjectKMean.
Gambar 13.6 Save ProjectKMean 7. Tambahkan image ke form dengan cara pilih menu Additional, image, lalu klik ke form.
Gambar 13.7 Menu Image
8. Pada properties rubah stretchnya ke true dan auto sizenya true.
244
Gambar 13.8 Stret True 9. Dengan cara yang sama tambahkan image2 di sebelah kanan image1 kemudian ubah stretchnya ke true dan auto sizenya true.
Gambar 13.9 Penambahan Image 2 10. Tambahkan button ke form, dengan cara pilih menu standart, button, lalu klik ke form.
Gambar 13.10 Menu Button
245 11. Pada oject inspector rubah properti captionnya dengan nama Open, kemudian namenya dengan nama btOpen.
Gambar 13.11 Button Open 12. Tambahkan OpenPictureDialog ke form, dengan cara pilih menu dialog, OpenPictureDialog, lalu klik ke form.
Gambar 13.12 Menu OpenPictureDialog 13. Hasilnya sebagai berikut.
Gambar 13.13 Hasil OpenPictureDialog
246 14. Doble klik button open kemudian ketik program yang di hurup tebal berikut. var FormKMean: TFormKMean; FileNameImg: string; implementation {$R *.dfm} procedure TFormKMean.btOpenClick(Sender: TObject); begin if OpenPictureDialog1.Execute then begin FileNameImg := OpenPictureDialog1.FileName; Caption := 'K-Mean : '+ OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile (OpenPictureDialog1.FileName); Image2.Visible := False; end; end;
15. Tambahkan button pada form, pada object inspector rubah properties captionnya dengan nama KMean dan Namenya dengan nama btKMean.
Gambar 13.14 Button K-Mean
16. Tambahkan Label pada form.
247
Gambar 13.15 Menu Label 17. Tulis captionnya dengan K =
Gambar 13.16 Label K
18. Tambahkan Edit pada form.
Gambar 13.17 Menu Edit
19. Ubah namenya dengan nama EditCluster dan tulis textnya dengan angka 10.
248
Gambar 3.18 EditCluster
20. Tambahkan label ke form, ganti captionnya dengan tulisan Clr Weight.
Gambar 13.19 Label Weight
21. Tambahkan edit ke form, ganti namenya dengan nama EditClrWeight dan textnya tulis angka 40.
249
Gambar 13.20 Clr Wight 40 22. Tambahkan ProgressBar ke ProgressBar. Lalu klik ke form.
form
dengan
cara,
pilih
menu
Win32,
Gambar 13.21 Menu ProgressBar 23. Hasilnya sebagai berikut.
Gambar
24.
13.22 Hasil ProgressBar
Tambahkan unit baru,
250 dengan cara file, new unit.
Gambar 13.23 Menu New Unit
25. Simpan unitnya dengan cara save as.
Gambar 13.24 Menu Save As
251 26. Berinama unitnya dengan nama UnitImageProses.
Gambar 13.25 Save UnitImageProses 27. Hasilnya sebagai berikut.
Gambar 13.26 Hasil UnitImageProses 28. 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);
252 procedure ImgGetHistogramFreq (var Image:TImage; var Freq: TFreqHist; var MaxFreq:longint);
procedure ImgClusteringKMeanROI (var Image:TImage; clrWeight:real; var ProgressBar1: TProgressBar);
k:integer;
implementation const PercentR = 0.299; PercentG = 0.587; PercentB = 0.114; function ByteRange (r:double) : byte; begin if r<0 then ByteRange:=0 else if r>255 then ByteRange:=255 else ByteRange:=Round(r); end; function RgbToGray (Clr:TColor) : byte; var r,g,b:byte; begin r := GetRValue(Clr); g := GetGValue(Clr); b := GetBValue(Clr); RgbToGray := ByteRange (r*PercentR + g*PercentG + b*PercentB); 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;
253 Image1.Repaint; ProgressBar1.Position := x; end; end; procedure ImgGetHistogramFreq (var Image:TImage; var Freq: TFreqHist; var MaxFreq:longint); var x,y,i:integer; ClrGray:byte; begin { set Frek[i]=0 } for i:=0 to 255 do Freq[i]:=0; { hitung frekuensi tiap warna } 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]); end; MaxFreq := 0; for i:=0 to 255 do if Freq[i]>MaxFreq then MaxFreq:=Freq[i]; end; procedure ImgClusteringKMeanROI (var Image:TImage; clrWeight:real; var ProgressBar1: TProgressBar); const BLACK_THRESHOLD=20; MAX_K = 50; MAX_counter=40; type TRecPoint = record x,y,clrGray:real; n:integer; end; var means: array [1..MAX_K] of TRecPoint; function GetGroup (x,y,clrGray:real) : byte; var distMin,dist:real; i:integer; g:byte; begin distMin := 1e8; g := 1; for i:=1 to k do begin dist := Sqr(means[i].x-x) + Sqr(means[i].y-y) + Sqr(means[i].clrGray-clrGray)*clrWeight; if dist
k:integer;
254 distMin := dist; g := i; end; end; Result := g; end; procedure SetMeansZero; var i:integer; begin for i:=1 to k do begin means[i].x := 0; means[i].y := 0; means[i].clrGray := 0; means[i].n := 0; end; end; var x,y,i,counter: integer; clrGray,clrGrayMax,clrGrayMin,clrR,clrG,clrB: byte; pixelGroup: Variant; begin Randomize; ProgressBar1.Max := MAX_counter; ProgressBar1.Position := 0; pixelGroup := VarArrayCreate([0,Image.Width-1, varByte); for i:=1 to k do begin means[i].x := Random(Image.Width); means[i].y := Random(Image.Height); means[i].clrGray := Random(256); end; counter := 0; repeat for x:=0 to Image.Width-1 do for y:=0 to Image.Height-1 do begin clrGray := ImgGetGray(Image, x,y); if clrGray>BLACK_THRESHOLD then pixelGroup[x,y] := GetGroup (x,y,clrGray) else pixelGroup[x,y] := 0; end; SetMeansZero;
0,Image.Height-1],
255 for x:=0 to Image.Width-1 do for y:=0 to Image.Height-1 do begin i := pixelGroup[x,y]; if i>0 then begin clrGray := ImgGetGray (Image, x,y); means[i].x := means[i].x + x; means[i].y := means[i].y + y; means[i].clrGray := means[i].clrGray + clrGray; Inc (means[i].n); end; end; for i:=1 to k do if means[i].n>0 then begin means[i].x := means[i].x/means[i].n; means[i].y := means[i].y/means[i].n; means[i].clrGray := means[i].clrGray/means[i].n; end; Inc (counter); ProgressBar1.Position := counter; until counter=MAX_counter; clrGrayMax:=0; clrGrayMin:=255; for i:=1 to k do if means[i].n>0 then begin if means[i].clrGray>clrGrayMax then clrGrayMax:=ByteRange(means[i].clrGray); if means[i].clrGray
0 then begin i := pixelGroup[x,y]; clrR:=clrR+30; clrG:=clrG-20; clrB:=clrB+70; Image.Canvas.Pixels[x,y] := RGB (clrR,clrG,clrB); end; ProgressBar1.Position := MAX_counter; end; end.
256 29. Kembali ke FormKMean, caranya klik UnitKMean.
Gambar 13.27 Kembali ke FormKMean 30. Lalu klik toggle form.
Gambar 13.28 Toggle 31. Doble klik button KMean.
Gambar 13.29 Button K-Mean 32. Lalu ketik program berikut yang tercetak huruf tebal.
257 procedure TFormKMean.btKMeanClick(Sender: TObject); var k:integer; clrWeight:real; begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; k := StrToIntDef(EditCluster.Text,5); clrWeight := StrToFloatDef(EditClrWeight.Text,5); ImgClusteringKMeanROI (Image2, k,clrWeight,ProgressBar1); end; 33. Dibawah implementasi ketik program yang tertulis huruf tebal berikut. implementation {$R *.dfm} uses UnitImageProses;
34. Tambahkan button ke form, lalu pada object inspector rubah properties captionnya dengan nama Exit dan namenya dengan nama btExit.
Gambar 13.30 Button Exit 35. Doble klik button Exit lalu ketik program berikut. procedure TFormKMean.btExitClick(Sender: TObject); begin FormKMean.Close; end; 36. Simpan program dengan cara file save all. 37. Compiler menu Project,
progran dengan cara pilih Compile ProjectKMean.
258
Gambar 13.31 Compiler ProjectKMean
38. Lalu jalankan progran dengan cara pilih menu Run, Run.
Gambar 13.32 Menu Run
39. Hasil sebagai berikut.
Gambar 13.33 Hasil Program K-Mean 40. Keluar dari program klik button Exit.
13.3 PROGRAM K-MEANS SELENGKAPNYA ADALAH SEBAGAI BERIKUT
259
unit UnitKMean; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtDlgs, StdCtrls, ExtCtrls, ComCtrls; type TFormKMean = class(TForm) Image1: TImage; Image2: TImage; btOpen: TButton; OpenPictureDialog1: TOpenPictureDialog; btKMean: TButton; ProgressBar1: TProgressBar; Label1: TLabel; EditCluster: TEdit; Label2: TLabel; EditClrWeight: TEdit; btExit: TButton; procedure btOpenClick(Sender: TObject); procedure btKMeanClick(Sender: TObject); procedure btExitClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var FormKMean: TFormKMean; FileNameImg: string; implementation {$R *.dfm} uses UnitImageProses;
procedure TFormKMean.btOpenClick(Sender: TObject); begin if OpenPictureDialog1.Execute then begin
260 FileNameImg := OpenPictureDialog1.FileName; Caption := 'K-Mean : '+ OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile (OpenPictureDialog1.FileName); Image2.Visible := False; end; end; procedure TFormKMean.btKMeanClick(Sender: TObject); var k:integer; clrWeight:real; begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; k := StrToIntDef(EditCluster.Text,5); clrWeight := StrToFloatDef(EditClrWeight.Text,5); ImgClusteringKMeanROI (Image2, k,clrWeight,ProgressBar1); end;
procedure TFormKMean.btExitClick(Sender: TObject); begin FormKMean.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 ImgGetHistogramFreq (var Image:TImage; var Freq: TFreqHist; var MaxFreq:longint);
261 procedure ImgClusteringKMeanROI (var Image:TImage; k:integer; clrWeight:real; var ProgressBar1: TProgressBar); implementation const PercentR = 0.299; PercentG = 0.587; PercentB = 0.114; function ByteRange (r:double) : byte; begin if r<0 then ByteRange:=0 else if r>255 then ByteRange:=255 else ByteRange:=Round(r); end; function RgbToGray (Clr:TColor) : byte; var r,g,b:byte; begin r := GetRValue(Clr); g := GetGValue(Clr); b := GetBValue(Clr); RgbToGray := ByteRange (r*PercentR + g*PercentG + b*PercentB); 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;
262
procedure ImgGetHistogramFreq (var Image:TImage; var Freq: TFreqHist; var MaxFreq:longint); var x,y,i:integer; ClrGray:byte; begin { set Frek[i]=0 } for i:=0 to 255 do Freq[i]:=0; { hitung frekuensi tiap warna } 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]); end; MaxFreq := 0; for i:=0 to 255 do if Freq[i]>MaxFreq then MaxFreq:=Freq[i]; end;
procedure ImgClusteringKMeanROI (var Image:TImage; k:integer; clrWeight:real; var ProgressBar1: TProgressBar); const BLACK_THRESHOLD=20; MAX_K = 50; MAX_counter=40; type TRecPoint = record x,y,clrGray:real; n:integer; end; var means: array [1..MAX_K] of TRecPoint; function GetGroup (x,y,clrGray:real) : byte; var distMin,dist:real; i:integer; g:byte; begin distMin := 1e8; g := 1; for i:=1 to k do begin dist := Sqr(means[i].x-x) + Sqr(means[i].y-y) + Sqr(means[i].clrGray-clrGray)*clrWeight; if dist
263 end; end; Result := g; end; procedure SetMeansZero; var i:integer; begin for i:=1 to k do begin means[i].x := 0; means[i].y := 0; means[i].clrGray := 0; means[i].n := 0; end; end; var x,y,i,counter: integer; clrGray,clrGrayMax,clrGrayMin,clrR,clrG,clrB: byte; pixelGroup: Variant; begin Randomize; ProgressBar1.Max := MAX_counter; ProgressBar1.Position := 0; pixelGroup := VarArrayCreate([0,Image.Width-1, 0,Image.Height-1], varByte); for i:=1 to k do begin means[i].x := Random(Image.Width); means[i].y := Random(Image.Height); means[i].clrGray := Random(256); end; counter := 0; repeat for x:=0 to Image.Width-1 do for y:=0 to Image.Height-1 do begin clrGray := ImgGetGray(Image, x,y); if clrGray>BLACK_THRESHOLD then pixelGroup[x,y] := GetGroup (x,y,clrGray) else pixelGroup[x,y] := 0; end; SetMeansZero; for x:=0 to Image.Width-1 do for y:=0 to Image.Height-1 do
264 begin i := pixelGroup[x,y]; if i>0 then begin clrGray := ImgGetGray (Image, x,y); means[i].x := means[i].x + x; means[i].y := means[i].y + y; means[i].clrGray := means[i].clrGray + clrGray; Inc (means[i].n); end; end; for i:=1 to k do if means[i].n>0 then begin means[i].x := means[i].x/means[i].n; means[i].y := means[i].y/means[i].n; means[i].clrGray := means[i].clrGray/means[i].n; end; Inc (counter); ProgressBar1.Position := counter; until counter=MAX_counter; clrGrayMax:=0; clrGrayMin:=255; for i:=1 to k do if means[i].n>0 then begin if means[i].clrGray>clrGrayMax then clrGrayMax:=ByteRange(means[i].clrGray); if means[i].clrGray0 then begin i := pixelGroup[x,y]; clrR:=clrR+30; clrG:=clrG-20; clrB:=clrB+70; Image.Canvas.Pixels[x,y] := RGB (clrR,clrG,clrB); end; ProgressBar1.Position := MAX_counter; end; end.
265
BAB 14 MENAMPILKAN NILAI INTENSITAS PIXEL 14.1 PENDAHULUAN Menampilkan nilai intensitas pixel gunanya untuk mengetahui perubahan nilai intensitas pixel sebelum dan sesudah dilakukan analisis pengolahan citra digital.
14.2 CARA UNTUK MEMBUAT PROGRAM MENAMPILKAN NILAI INTENSITAS PIXEL ADALAH SEBAGAI BERIKUT: 1. Buka kembali projek histogram cut, dengan cara buka Delphi kemudian open projek histogram cut.
Gambar 14.1 Menu Open Project
266
Gambar 14.2 Open ProjectHistogramCut
Gambar 14.3 Hasil OpenProjectHistogramCut
267 2. Kemudian tambahkan 2 Memo pada Form, kemudian properties ScrollBars pilih ssBoth.
Gambar 14.4 Menu Memo
Gambar 14.5 Hasil Memo 3. Kemudian tambahkan MainMenu pada form
Gambar 14.6 MainMenu
268
Gambar 14.7 Hasil Main Menu Pada Form 4. Double MainMenu tersebut kemudian akan keluar tampilan berikut.
Gambar 14.8 Tampilan Main Menu
5. Tulis captionnya dengan tulisan File, kemudian tekan enter.
269
Gambar 14.9 Tulisan Caption File Pada Main Menu 6. Klik file pada mainmenu, kemudian akan tampil keluaran sebagai berikut.
Gambar 14.10 Hasil Tampilan Fle Main Menu 7. Klik kotak dibawah file kemudian Tulis Menampilkan Nilai Intensitas Pixel Awal.
captionnya
dengan
tulisan
Gambar 14.11 Menampilkan Tulisan Nilai Intensitas Pixel Awal 8. Klik kotak di bawah nilai intensitas pixel awal, lalu tulis captionnya dengan tulisan Menampilkan Nilai Intensitas Pixel Hasil, lalu tekan enter.
270
Gambar 14.12 Menampilkan Nilai Intensitas Pixel Hasil 9. Kembali ke form histogram cut, pilih menu file, menampilkan nilai intensitas pixel awal, lalu ketik program berikut.
Gambar 14.13 Kembali ke FormHistogramCut procedure TFormHistogramCut.MenampilkanNilaiIntensitasPixelAwal1Click( Sender: TObject); var F : TextFile; AgungFile: String; temp : PByteArray; i,j : integer; gambar :TBitmap; begin AgungFile:='nilai intensitas pixel awal.txt'; AssignFile(F,AgungFile); gambar:=TBitmap.Create; gambar:=image1.Picture.Bitmap; rewrite(F); writeln(F,'Matrik dirancang oleh Agung Gunawan');
271 memo1.Clear; for j:=0 to gambar.Height-1 do begin temp:=gambar.ScanLine[j]; i:=0; repeat write(F,inttostr(temp[i])+' '); i:=i+1; until i >=3*gambar.Width-1; end; closeFile(F); memo1.Lines.LoadFromFile(AgungFile); image1.Picture.Bitmap:=gambar;end; 10. Kemudian dengan cara yang sama pilih menu file, Menampilkan Nilai Intensitas Pixel Hasil, lalu ketik program berikut. procedure TFormHistogramCut.MenampilkanNilaiIntensitasPixelHasil1Click( Sender: TObject); var F2 : TextFile; AgungFile2: String; temp : PByteArray; i,j : integer; gambar2 :TBitmap; begin AgungFile2:='nilai intensitas pixel hasil.txt'; AssignFile(F2,AgungFile2); gambar2:=TBitmap.Create; gambar2:=image2.Picture.Bitmap; rewrite(F2); writeln(F2,'Matrik dirancang oleh Agung BALI'); memo2.Clear; for j:=0 to gambar2.Height-1 do begin temp:=gambar2.ScanLine[j]; i:=0; repeat write(F2,inttostr(temp[i])+' '); i:=i+1; until i >=3*gambar2.Width-1; end; closeFile(F2); memo2.Lines.LoadFromFile(AgungFile2); image2.Picture.Bitmap:=gambar2; end;
272
11. Simpan program dengan cara save all. 12. Compile program dengan cara project compiler. 13. Jalankan program dengan cara Run. 14. Lihat hasilnya seperti berikut.
Gambar 14.14 Hasil Program Menampilkan Nialai Intensitas Pixel
14.3 PROGRAM SELENGKAPNYA ADALAH SEBAGAI BERIKUT: unit UnitHistogramCut; interface
273 uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtDlgs, StdCtrls, ExtCtrls, ComCtrls, Menus; type TFormHistogramCut = class(TForm) Image1: TImage; Image2: TImage; btOpen: TButton; OpenPictureDialog1: TOpenPictureDialog; btHistogramCut: TButton; ProgressBar1: TProgressBar; btExit: TButton; EditHistogramCut: TEdit; Label1: TLabel; MainMenu1: TMainMenu; File1: TMenuItem; MenampilkanNilaiIntensitasPixelAwal1: TMenuItem; MenampilkanNilaiIntensitasPixelHasil1: TMenuItem; Memo1: TMemo; Memo2: TMemo; procedure btOpenClick(Sender: TObject); procedure btHistogramCutClick(Sender: TObject); procedure btExitClick(Sender: TObject); procedure MenampilkanNilaiIntensitasPixelAwal1Click(Sender: TObject); procedure MenampilkanNilaiIntensitasPixelHasil1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var FormHistogramCut: TFormHistogramCut; FileNameImg: string; implementation {$R *.dfm} uses UnitImageProses; procedure TFormHistogramCut.btOpenClick(Sender: 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.btHistogramCutClick(Sender: TObject);
274 var thres:real; n:integer; begin Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; n:= StrToIntDef(EditHistogramCut.Text,5); ImgHistogramCut (Image2, n, ProgressBar1); end; procedure TFormHistogramCut.btExitClick(Sender: TObject); begin FormHistogramCut.Close; end; procedure TFormHistogramCut.MenampilkanNilaiIntensitasPixelAwal1Click( Sender: TObject); var F : TextFile; AgungFile: String; temp : PByteArray; i,j : integer; gambar :TBitmap; begin AgungFile:='nilai intensitas pixel awal.txt'; AssignFile(F,AgungFile); gambar:=TBitmap.Create; gambar:=image1.Picture.Bitmap; rewrite(F); writeln(F,'Matrik dirancang oleh Agung Gunawan'); memo1.Clear; for j:=0 to gambar.Height-1 do begin temp:=gambar.ScanLine[j]; i:=0; repeat write(F,inttostr(temp[i])+' '); i:=i+1; until i >=3*gambar.Width-1; end; closeFile(F); memo1.Lines.LoadFromFile(AgungFile); image1.Picture.Bitmap:=gambar; end; procedure TFormHistogramCut.MenampilkanNilaiIntensitasPixelHasil1Click( Sender: TObject); var F2 : TextFile; AgungFile2: String; temp : PByteArray;
275 i,j : integer; gambar2 :TBitmap; begin AgungFile2:='nilai intensitas pixel hasil.txt'; AssignFile(F2,AgungFile2); gambar2:=TBitmap.Create; gambar2:=image2.Picture.Bitmap; rewrite(F2); writeln(F2,'Matrik dirancang oleh Agung BALI'); memo2.Clear; for j:=0 to gambar2.Height-1 do begin temp:=gambar2.ScanLine[j]; i:=0; repeat write(F2,inttostr(temp[i])+' '); i:=i+1; until i >=3*gambar2.Width-1; end; closeFile(F2); memo2.Lines.LoadFromFile(AgungFile2); image2.Picture.Bitmap:=gambar2; 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
276 const PercentR = 0.299; PercentG = 0.587; PercentB = 0.114; function ByteRange (r:double) : byte; begin if r<0 then ByteRange:=0 else if r>255 then ByteRange:=255 else ByteRange:=Round(r); end; function RgbToGray (Clr:TColor) : byte; var r,g,b:byte; begin r := GetRValue(Clr); g := GetGValue(Clr); b := GetBValue(Clr); RgbToGray := ByteRange (r*PercentR + g*PercentG + b*PercentB); 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;
277 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 clrGray>BLACK_THRES then begin Inc(ImgSize); if clrGray>clrGrayMax then clrGrayMax := clrGray; end; end; { tentukan threshold } TotFreq := 0; thres := 255; for i:=255 downto 0 do begin Inc (TotFreq, Freq[i]); if TotFreq>ImgSize/2 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);
278 if clrGray
279
BAB 15 LOG IN 15.1 PENDAHULUAN Untuk membuat program aplikasi sebaiknya menggunakan Log In. Tujuanya adalah program aplikasi tersebut hanya bisa dipakai oleh operator tertentu.
15.2
CARA MEMBUAT PROGRAM ADALAH SEBAGAI BERIKUT.
LOG
IN
1. Buka program delphi, dengan cara pilih menu start, program borland delphi 7, delphi 7.
Gambar 15.1 Start Program 2. Kemudian pilih menu file, new, application.
Gambar 15.2 New Application
280
3. Pada object inspector, ubah properti captionnya dengan nama Log In, dan namenya dengan nama FormLogIn.
Gambar 15.3 Form LogIn 4. Tambahkan label 1 pada form ubah properti captionnya dengan nama User Name, tambahkan label 2 pada form ubah properti captionnya dengan nama Pasword, tambahkan edit 1 pada form, kemudian hapus teksnya pada property Teks, tambahkan edit 2 pada form, kemudian hapus teksnya pada property Teks, dan pada properties PasswordCharnya ganti dengan bintang (*).
Gambar 15.4 Tambah Edit ke Form
281 5. Tambahkan button 1 pada form kemudian ubah captionya dengan nama Log In dan berinama Namenya dengan nama btLogIn, Tambahkan button 2 pada form kemudian ubah captionya dengan nama Exit dan berinama Namenya dengan nama btExit.
Gambar 15.5 Tambah Button ke Form 6. Tambahkan form lagi dengan cara klik menu file new form.
Gambar 15.6 New Form
282 7. Ubah captionya FormAplikasi.
dengan
nama
Aplikasi
dan
Gambar 15.7 Form Aplikasi
8. Simpan filenya dengan cara file save all.
Gambar 15.8 Menu Save All
namenya
dengan
nama
283 9. Berinama unit1 dengan nama UnitLogIn dan unit2nya dengan nama UnitAplikasi dan projectnya dengan nama ProjectLogIn.
Gambar 15.9 Save UnitLogIn
10. Pilih form Aplikasi kemudian Klik menu file kemudian Use Unit (Alt + F11).
Gambar 15.10 Use Unit
11. Tekan Ok. Pada form aplikasi use unitnya adalah UnitLogIn.
284
Gambar 15.11 Mengelingkan Form Aplikasi Dengan UnitLogIn 12. Pilih form Log In, kemudian klik menu file, Use Unit (Alt + F11) lalu tekan ok, pada form Log In use unitnya adalah Unit Aplikasi.
Gambar 15.12 Mengelingkan UnitLogIn Dengan Form Aplikasi 13. Pilih form Log In, lalu doble klik button Log In, kemudian ketik program berikut: procedure TFormLogIn.btLogInClick(Sender: TObject); begin if (Edit1.Text='username') and (Edit2.Text='pasword') then begin MessageBox(0,'Log In Sukses','information',MB_OK+MB_ICONINFORMATION); FormLogIn.Hide; FormAplikasi.Show; end else MessageBox(0,'Log In Gagal','error',MB_OK+MB_ICONERROR); end;
14. Doble klik button Exit lalu ketik program berikut:
285
procedure TFormLogIn.btExitClick(Sender: TObject); begin FormLogIn.Close; end; 15. Simpan programnya dengan cara save all. 16. Kemudian compile program dengan cara pilih menu project, compile projectLogIn.
Gambar 15.13 Compiler ProjectLogIn 17. Jalankan program dengan cara pilih menu Run, run atau tekan tanda panah hijau.
Gambar 15.14 Menu Run
18. Lalu masukan tulisan username dan password, Hasilnya adalah sebagai berikut:
286
Gambar 15.15 Hasil Program LogIn
15.3 PROGRAM SELENGKAPNYA ADALAH SEBAGAI BERIKUT: unit UnitLogIn; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TFormLogIn = class(TForm) Label1: TLabel; Label2: TLabel; Edit1: TEdit; Edit2: TEdit; btLogIn: TButton; btExit: TButton; procedure btLogInClick(Sender: TObject); procedure btExitClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var FormLogIn: TFormLogIn;
287
implementation uses UnitAplikasi; {$R *.dfm} procedure TFormLogIn.btLogInClick(Sender: TObject); begin if (Edit1.Text='username') and (Edit2.Text='pasword') then begin MessageBox(0,'Log In Sukses','information',MB_OK+MB_ICONINFORMATION); FormLogIn.Hide; FormAplikasi.Show; end else MessageBox(0,'Log In Gagal','error',MB_OK+MB_ICONERROR); end; procedure TFormLogIn.btExitClick(Sender: TObject); begin FormLogIn.Close; end; end.
unit UnitAplikasi; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TFormAplikasi = class(TForm) private { Private declarations } public { Public declarations } end; var FormAplikasi: TFormAplikasi;
288 implementation uses UnitLogIn; {$R *.dfm} end.
289
DAFTAR PUSTAKA 1. Anak Agung Ngurah Gunawan, Model Penentuan Kelainan Mamma Berdasarkan Besaran Fisis Film Hasil Mammografi, Desertasi, Program Studi S3 MIPA UNAIR, 2013. 2. Anak Agung Ngurah Gunawan, Suhariningsih, Triyono and Widodo, Determination of Physical Parameter Model for the Photo Film Mammografphic X-Ray Results on the Breast Cancer Histology Classification, International Journal of Contemporary Mathematical Sciences, Vol.7, n0. 45-48, ISSN 1312-7586, pp. 2236-2244, 2012. 3. Anak Agung Ngurah Gunawan, Suhariningsih, Triyono and Yasin, Conversion of Images Into Numerical Model to Determine the Condition of Breast Health on Contralateral, Applied Mathematical Sciences, Vol. 7, ISSN 1314-7552, 2013. 4. Antony Pranata, Pemrograman Borlan Delphi, Edisi 2, AndiYogyakarta, 1998. 5. Darma Putra, Sistem Biometrika, AndiYogyakarta, 2009. 6. Darma Putra, Pengolahan Citra Digital, AndiYogyakarta, 2010. 7. Djoko Pramono, Mudah Menguasai Delphi 3.0, Jilid 1, 2, Elex Media Komputindo, 1999. 8. Eko Prasetyo, Pengolahan Citra Digital Dan Aplikasinya Menggunakan Matlab, AndiYogyakarta,2011. 9. Fadlisyah dkk, Pengolahan Citr Menggunakan Delphi, Graha Ilmu, 2008 10. Jon Matcho dan David R. Faulkner, Panduan Penggunaan Delphi, AndiYogyakarta, 1999. 11. Marvin Ch. Wijaya dan Agus Prijono, Pengolahan Citra Dgital Menggunakan MatLab, Informatika Bandung,2007. 12. Mauridhi Hery Purnomo, dkk, Konsep Pengolahan Citra Digital dan Ekstraksi Fitur, Graha Ilmu, 2010. 13. Rafael C. Gonzalez and Richard E. Wo0ds, Digital Image Processing, 1993. 14. Rinaldi Munir, Pengolahan Citra Digital Dengan Pendekatan Algoritmik, Informatika Bandung, 2004. 15. Riyanto Sigit, dkk, Step By Step Pengolahan Citra Digital, AndiYogyakarta, 2005. 16. T.Sutoyo, dkk., Teori Pengolahan Citra Digital, AndiYogyakarta, 2009. 17. Usman Ahmad, Pengolahan Citra Digital Dan Teknik Pemrograman, Graha Ilmu, 2005. 18. Raman Maini & Dr. Himanshu Aggarwal, International Journal of Image Processing (IJIP), Volume (3) : Issue (1), pp. 1-12. 2013. 19. http://www.cse.unr.edu/~bebis/CS791E/Notes/EdgeDetection.pdf. 20. http://www.math.uci.edu/icamp/courses/math77c/demos/hist_eq.pdf 21. Robert Krutsch and David Tenorio, Histogram Equalization, Freescale Semiconductor, Document Number: AN4318, Rev. 0, pp 1- 8, June 2011 22. http://cronos.rutgers.edu/~lrr/dsp%20design%20course/lectures_2012_new/pdf_ 2012/Histogram%20Processing.pdf 23. http://www.cpe.eng.cmu.ac.th/wp-content/uploads/CPE752_08.pdf 24. http://www.math.tau.ac.il/~turkel/notes/threshold.pdf 25. Joshua Goodman, Global Thresholding and Multiple-Pass Parsing, Harvard University 40 Oxford St. Cambridge, MA 02138 [email protected], http://acl.ldc.upenn.edu/W/W97/W97-0302.pdf 26. Gleb V.Tcheslavsk, Morphological Image Processing: Basic Concepts, http://ee.lamar.edu/gleb/dip/10-1%20- %20 Morphological %20Image%20 Processing.pdf.
290 27. Harvey Rhody, Basic Morphological Image Processing, 2005. http://www.cis.rit.edu/class/simg782/lectures/lecture_03/lec782_05_03.pdf. 28. Shahbe Mat Desa, Qussay A. Salih, Image Subtraction for Real Time Moving Object Extraction, http://vc.cs.nthu.edu.tw/home/paper/codfiles/ycchu/ 200503161635/image_subtraction_for_real_time_moving_object_extraction.pdf
291 RIWAYAT HIDUP Anak Agung Ngurah Gunawan Lahir di Denpasar, 25 September 1962. Pendidikan : S1 di FMIPA Universitas Airlangga Surabaya, tahun 1982. S2 di Teknik Informatika, Institut Teknologi Sepuluh November (ITS) Surabaya, tahun 1997. S3 di Program Studi MIPA Universitas Airlangga Surabaya, tahun 2010. Pekerjaan : Sejak Tahun 1992 hingga kini mengabdi di Jurusan Fisika FMIPA Universitas Udayana Denpasar Bali. Konsentrasi penelitian pada pengolahan citra digital. Penulisan Journal International dan Paten : 1) Anak Agung Ngurah Gunawan, Suhariningsih, Triyono and Widodo, Determination of Physical Parameter Model for the Photo Film Mammografphic X-Ray Results on the Breast Cancer Histology Classification, International Journal of Contemporary Mathematical Sciences, Vol.7, n0. 45-48, ISSN 13127586, pp. 2236-2244, 2012. 2) Anak Agung Ngurah Gunawan, Suhariningsih, Triyono and Yasin, Conversion of Images Into Numerical Model to Determine the Condition of Breast Health on Contralateral, Applied Mathematical Sciences, Vol. 7, ISSN 1314-7552, 2013. 3) Penentuan Histopatologi Pada Ca Mamma Menggunakan Besaran Fisis Film Hasil Mammografi, P00201300327, tahun 2013. 4) Penentuan Stadium Ca Mamma Menggunakan Besaran Fisis Film Hasil Mammografi, P00201300328, tahun 2013.