Anak Agung Ngurah Gunawan
PENGOLAHAN
CITRA DIGITAL
STEP BY STEP MENGGUNAKAN DELPHI 7
PENGOLAHAN CITRA DIGITAL
STEP BY STEP MENGGUNAKAN DELPHI 7
Anak Agung Ngurah Gunawan
Penerbit : ANDI
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:
Buku ini kupersembahkan kepada
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
DAFTAR ISI
KATA PENGANTAR v
DAFTAR ISI vii
DAFTAR GAMBAR x
DAFTAR TABEL xviii
BAB I OPEN IMAGE 1
1.1 Cara Membuat Program Open Image 1
1.2 Program Open Image Selengkapnya Adalah Sebagai Berikut 7
BAB II HISTOGRAM EQUALIZATION 9
2.1 Perataan Histogram 9
2.2 Cara Membuat Program Equalization 13
2.3 Program Histogram Equalization Selengkapnya Adalah sebagai
Berikut
25
BAB III WIENER FILTER 31
3.1 Teori Wiener Filter 31
3.2 Cara Membuat Program Wiener Filter 32
3.3 Program Wiener Filter Selengkapnya Adalah Sebagai Berikut 45
BAB IV GLOBAL TRESHOLDING 51
4.1 Dasar Teori Global Thresholding 51
4.2 Cara Membuat Program Global Thresholding 51
4.3 Program Global Thresholding Selengkapnya Adalah Sebagai
Berikut
61
BAB V HISTOGRAM CUT 65
5.1 Dasar Teori Histogram Cut 65
5.2 Cara Menbuat Program Histogram Cut 69
5.3 Program Histogram Cut Selengkapnya Adalah Sebagai Berikut 84
BAB VI MORPOLOGI 89
6.1 Dasar Teori Morpologi 89
6.1.1 Struktur elemen 89
6.1.2 Dilasi 89
6.1.3 Erosi 90
6.1.4 Opening 91
6.2 Cara Menbuat Program Morpologi 92
6.3 Program Morpologi Selengkapnya Adalah Sebagai Berikut 105
BAB VII SUBTRAK 111
7.1 Dasar Teori Subtrak 111
7.2 Cara Membuat Program Subtrak 111
7.3 Program Subtrak Selengkapnya Adalah Sebagai Berikut 123
BAB VIII DETEKSI TEPI SOBEL 127
8.1 Dasar Teori Deteksi Tepi Sobel 127
8.2 Cara Membuat Program Deteksi Tepi Sobel 128
8.3 Program Deteksi Tepi Sobel Selengkapnya Adalah Sebagai Berikut 140
BAB IX DETEKSI TEPI PREWITT 145
9.1 Dasar Teori Deteksi Tepi Prewitt 145
9.2 Cara Membuat Program Deteksi Tepi Prewitt 146
9.3 Program Deteksi Tepi Prewitt Selengkapnya Adalah Sebagai
Berikut
159
BAB X DETEKSI TEPI ROBERT 163
10.1 Dasar Teori Deteksi Tepi Robert 163
10.2 Cara Membuat Program Deteksi Tepi Robert 164
10.3 Program Deteksi Tepi Robert Selengkapnya Adalah Sebagai Berikut 176
BAB XI LOW PASS FILTER 181
11.1 Dasar Teori Low Pass Filter 181
11.2 Cara Membuat Program Low Pass Filter 181
11.3 Program Low Pass Filter Selengkapnya Adalah Sebagai Berikut 194
BAB XII HIGHT PASS FILTER 199
12.1 Dasar Teori Hight Pass Filter 199
12.2 Cara Membuat Program Hight Pass Filter 200
12.3 Program Hight Pass Filter Selengkapnya Adalah Sebagai Berikut 214
BAB XIII K-MEANS 219
13.1 Algoritma K-Means 219
13.2 Cara Membuat Program K-Means 222
13.3 Program K-Means Selengkapnya Adalah Sebagai Berikut 240
BAB XIV MENAMPILKAN NILAI INTENSITAS PIXEL 247
14.1 Pendahuluan 247
14.2 Cara Membuat Program Menampilkan Nilai Intensitas Pixel 247
14.3 Program Menampilkan Nilai Intensitas Pixel Selengkapnya Adalah
Sebagai Berikut
255
BAB XV LOG IN 261
15.1 Pendahuluan 261
15.2 Cara Membuat Program Log In 261
DAFTAR PUSTAKA 271
DAFTAR GAMBAR
Gambar 1.1 Start Program Delphi 1
Gambar 1.2 New Application 1
Gambar 1.3 Object Inspector 2
Gambar 1.4 Save All 2
Gambar 1.5 Save Unit 2
Gambar 1.6 Save Project 3
Gambar 1.7 Menu Image 3
Gambar 1.8 Stretch True 3
Gambar 1.9 Menu Button 4
Gambar 1.10 Button Open 4
Gambar 1.11 Menu OpenPictureDialog 4
Gambar 1.12 Hasil OpenPictureDialog 5
Gambar 1.13 Button Exit 5
Gambar 1.14 Menu Compiler 6
Gambar 1.15 Menu Run 6
Gambar 1.16 Hasil Program 7
Gambar 2.1 Fungsi Transformasi 10
Gambar 2.2 Histogram Citra Sebelum Perataan 11
Gambar 2.3 Histogram Citra Hasil Pemetaan. 12
Gambar 2.4 Start Program Delphi 13
Gambar 2.5 New Application 13
Gambar 2.6 Object Inspector 14
Gambar 2.7 Save All 14
Gambar 2.8 Save UnitEqualization 14
Gambar 2.9 Save ProjectEqualization 15
Gambar 2.10 Menu Image 15
Gambar 2.11 Stretch True 15
Gambar 2.12 Penambahan Image 2 16
Gambar 2.13 Menu Button 16
Gambar 2.14 Button Open 16
Gambar 2.15 Menu OpenPictureDialog 17
Gambar 2.16 Hasil OpenPictureDialog 17
Gambar 2.17 Button Equalization 18
Gambar 2.18 Menu ProgresBar 18
Gambar 2.19 Hasil ProgresBar 18
Gambar 2.20 New Unit 19
Gambar 2.21 Save All 19
Gambar 2.22 Save UnitImageProses 19
Gambar 2.23 Hasil Save UnitImageProses 20
Gambar 2.24 Kembali ke FormEqualization 22
Gambar 2.25 Menu Toggle Form 23
Gambar 2.26 Klik Button Equalization 23
Gambar 2.28 Compile ProjectEqualization 24
Gambar 2.29 Run ProjectEqualization 25
Gambar 2.30 Hasil Program Equalization 25
Gambar 3.1 Start Program 32
Gambar 3.2 New Application 33
Gambar 3.3 Form Wiener Filter 33
Gambar 3.4 Save All 33
Gambar 3.5 Unit Wiener Filter 34
Gambar 3.6 Project Wiener Filter 34
Gambar 3.7 Menu Image 34
Gambar 3.8 Stretch True 35
Gambar 3.9 Penambahan Image 2 35
Gambar 3.10 Menu Button 35
Gambar 3.11 Button Open 36
Gambar 3.12 Menu OpenPictureDialog 36
Gambar 3.13 Hasil OpenPictureDialog 36
Gambar 3.14 Button Wiener Filter 37
Gambar 3.15 Menu ProgresBar 37
Gambar 3.16 Hasil ProgresBar 38
Gambar 3.17 New Unit 38
Gambar 3.18 Save All 38
Gambar 3.19 Save UnitImageProses 39
Gambar 3.20 Hasil Save UnitImageProses 39
Gambar 3.21 Kembali ke FormWienerFilter 42
Gambar 3.22 Menu Toggle Form 43
Gambar 3.23 Klik Button Wiener Filter 43
Gambar 3.24 Button Exit 44
Gambar 3.25 Menu Compile 44
Gambar 3.26 Menu Run 45
Gambar 3.27 Hasil Wiener Filter 45
Gambar 4.1 Start Program 51
Gambar 4.2 Form Global Thresholding 52
Gambar 4.3 Button Open 52
Gambar 4.4 Save All 53
Gambar 4.5 Save Unit Global Thresolding 53
Gambar 4.6 Save Project Global Thresolding 54
Gambar 4.7 Button Thresolding 55
Gambar 4.8 New Unit 55
Gambar 4.9 Save Image Proses 56
Gambar 4.10 Edit Thresolding 59
Gambar 4.11 Button Exit 60
Gambar 4.12 Hasil Program Thresolding 60
Gambar 5.1 Start Program 69
Gambar 5.2 New Application 69
Gambar 5.3 Form Histogram Cut 70
Gambar 5.5 Save UnitHistogramCut 70
Gambar 5.6 Save ProjectHistogramCut 71
Gambar 5.7 Menu Image 71
Gambar 5.8 AutoSize True 71
Gambar 5.9 Penambahan Image 2 72
Gambar 5.10 Menu Button 72
Gambar 5.11 Button Open 72
Gambar 5.12 Menu OpenPictureDialog 73
Gambar 5.13 Hasil OpenPictureDialog 73
Gambar 5.14 Button HistogramCut 74
Gambar 5.15 Menu ProgresBar 74
Gambar 5.16 Hasil ProgresBar 74
Gambar 5.17 New Unit 75
Gambar 5.18 Save As 75
Gambar 5.19 Save UnitImageProses 75
Gambar 5.20 Hasil Save UnitImageProses 76
Gambar 5.21 Kembali ke Form HistogramCut 79
Gambar 5.22 Menu Toggle 79
Gambar 5.23 Klik Button HistogramCut 89
Gambar 5.24 Button Exit 81
Gambar 5.25 Menu Edit 81
Gambar 5.26 Object InspectorEdit 81
Gambar 5.27 Menu Label 82
Gambar 5.28 Object Inspector Cut 82
Gambar 5.29 Menu Compile 83
Gambar 5.30 Menu Run 83
Gambar 5.31 Hasil Program Histogram Cut 84
Gambar 6.1 Start Program 92
Gambar 6.2 New Application 92
Gambar 6.3 Form Morpologi 93
Gambar 6.4 Save All 93
Gambar 6.5 Save UnitMorpologi 93
Gambar 6.6 Save ProjectMorpologi 94
Gambar 6.7 Menu Image 94
Gambar 6.8 Stretch True 94
Gambar 6.9 Penambahan Image 2 95
Gambar 6.10 Menu Button 95
Gambar 6.11 Button Open 95
Gambar 6.12 Menu OpenPictureDialog 96
Gambar 6.13 Hasil OpenPictureDialog 96
Gambar 6.14 Button Morpologi 97
Gambar 6.15 Menu ProgresBar 97
Gambar 6.16 Hasil ProgresBar 97
Gambar 6.17 New Unit 98
Gambar 6.18 Save As 98
Gambar 6.19 Save UnitImageProses 98
Gambar 6.20 Hasil Save UnitImageProses 99
Gambar 6.21 Kembali ke FormMorpologi 102
Gambar 6.23 Klik Button Morpologi 102
Gambar 6.24 Button Exit 103
Gambar 6.25 Compiler ProjectMorpologi 104
Gambar 6.26 Menu Run 104
Gambar 6.27 Hasil Program Morpologi 104
Gambar 7.1 Start Program 111
Gambar 7.2 New Application 112
Gambar 7.3 Form Substrak 112
Gambar 7.4 Save All 112
Gambar 7.5 Save UnitSubtrak 113
Gambar 7.6 Save ProjectSubstrak 113
Gambar 7.7 Menu Image 113
Gambar 7.8 Stretch True 114
Gambar 7.9 Penambahan Image 2 114
Gambar 7.10 Menu Button 114
Gambar 7.11 Button Open 115
Gambar 7.12 Menu OpenPictureDialog 115
Gambar 7.13 Hasil OpenPictureDialog 115
Gambar 7.14 Button Subtrak 116
Gambar 7.15 Menu ProgresBar 116
Gambar 7.16 Hasil ProgresBar 117
Gambar 7.17 New Unit 117
Gambar 7.18 Save As 117
Gambar 7.19 Save UnitImageProses 118
Gambar 7.20 Hasil Save UnitImageProses 118
Gambar 7.21 Kembali ke FormSubstrak 120
Gambar 7.22 Menu Toggle 121
Gambar 7.23 Klik Button Substrak 121
Gambar 7.24 Button Exit 122
Gambar 7.25 Compiler ProjectSubtrak 122
Gambar 7.26 Menu Run 122
Gambar 7.27 Hasil Program Subtrak 123
Gambar 8.1 Start Program 128
Gambar 8.2 New Application 128
Gambar 8.3 Form Sobel 129
Gambar 8.4 Save All 129
Gambar 8.5 Save UnitSobel 129
Gambar 8.6 Save ProjectSobel 130
Gambar 8.7 Menu Image 130
Gambar 8.8 Stretch True 130
Gambar 8.9 Penambahan Image 2 131
Gambar 8.10 Menu Button 131
Gambar 8.11 Button Open 131
Gambar 8.12 Menu OpenPictureDialog 132
Gambar 8.13 Hasil OpenPictureDialog 132
Gambar 8.14 Button Sobel 133
Gambar 8.15 New Unit 133
Gambar 8.17 Save UnitImageProses 134
Gambar 8.18 Hasil Save UnitImageProses 134
Gambar 8.19 Kembali ke FormSobel 136
Gambar 8.20 Menu Toggle 136
Gambar 8.21 Button Sobel 136
Gambar 8.22 Button Exit 138
Gambar 8.23 Compiler ProjectSobel 139
Gambar 8.24 Menu Run 139
Gambar 8.25 Hasil Mammografi 140
Gambar 8.26 Hasil Photo 140
Gambar 9.1 Start Program 146
Gambar 9.2 New Application 146
Gambar 9.3 Form Prewitt 147
Gambar 9.4 Save All 147
Gambar 9.5 Save UnitPrewitt 147
Gambar 9.6 Save ProjectPrewitt 148
Gambar 9.7 Menu Image 148
Gambar 9.8 Stretch True 148
Gambar 9.9 Penambahan Image 2 149
Gambar 9.10 Menu Button 149
Gambar 9.11 Button Open 149
Gambar 9.12 Menu OpenPictureDialog 150
Gambar 9.13 Hasil OpenPictureDialog 150
Gambar 9.14 Button Prewitt 151
Gambar 9.15 New Unit 151
Gambar 9.16 Save As 151
Gambar 9.17 Save UnitImageProses 152
Gambar 9.18 Hasil Save UnitImageProses 152
Gambar 9.19 Kembali ke FormPrewitt 154
Gambar 9.20 Menu Toggle 154
Gambar 9.21 Button Sobel 154
Gambar 9.22 Button Exit 156
Gambar 9.23 Compiler ProjectPrewitt 157
Gambar 9.24 Menu Run 157
Gambar 9.25 Hasil Mammografi 158
Gambar 9.26 Hasil Photo 158
Gambar 10.1 Start Program 164
Gambar 10.2 New Application 164
Gambar 10.3 Form Robert 165
Gambar 10.4 Save All 165
Gambar 10.5 Save UnitRobert 165
Gambar 10.6 Save ProjectRobert 166
Gambar 10.7 Menu Image 166
Gambar 10.8 Stretch True 166
Gambar 10.9 Penambahan Image 2 167
Gambar 10.10 Menu Button 167
Gambar 10.11 Button Open 167
Gambar 10.13 Hasil OpenPictureDialog 168
Gambar 10.14 Button Robert 169
Gambar 10.15 New Unit 169
Gambar 10.16 Save As 169
Gambar 10.17 Save UnitImageProses 170
Gambar 10.18 Hasil Save UnitImageProses 170
Gambar 10.19 Kembali ke FormRobert 172
Gambar 10.20 Menu Toggle 172
Gambar 10.21 Button Robert 172
Gambar 10.22 Button Exit 174
Gambar 10.23 Compiler ProjectRobert 175
Gambar 10.24 Menu Run 175
Gambar 10.25 Hasil Program Robert 175
Gambar 11.1 Start Program 181
Gambar 11.2 New Application 182
Gambar 11.3 Form LowPassFilter 182
Gambar 11.4 Save All 182
Gambar 11.5 Save UnitLowPassFilter 183
Gambar 11.6 Save ProjectLowPassFilter 183
Gambar 11.7 Menu Image 183
Gambar 11.8 Stretch True 184
Gambar 11.9 Penambahan Image 2 184
Gambar 11.10 Menu Button 184
Gambar 11.11 Button Open 185
Gambar 11.12 Menu OpenPictureDialog 185
Gambar 11.13 Hasil OpenPictureDialog 185
Gambar 11.14 Button Low Pass Filter 186
Gambar 11.15 New Unit 187
Gambar 11.16 Save As 187
Gambar 11.17 Save UnitImageProses 187
Gambar 11.18 Hasil Save UnitImageProses 188
Gambar 11.19 Kembali ke FormLowPassFilter 190
Gambar 11.20 Menu Toggle 190
Gambar 11.21 Klik Button Low Pass Filter 190
Gambar 11.22 Button Exit 192
Gambar 11.23 Compiler ProjectLowPassFilter 193
Gambar 11.24 Menu Run 193
Gambar 11.25 Hasil Mammografi 194
Gambar 11.26 Hasil Photo 194
Gambar 12.1 Start Program 200
Gambar 12.2 New Application 200
Gambar 12.3 FormHighPassFilter 201
Gambar 12.4 Save All 201
Gambar 12.5 Save UnitHighPassFilter 202
Gambar 12.6 Save ProjectHighPassFilter 202
Gambar 12.7 Menu Image 202
Gambar 12.8 Stretch True 203
Gambar 12.10 Menu Button 204
Gambar 12.11 Button Open 204
Gambar 12.12 Menu OpenPictureDialog 204
Gambar 12.13 Hasil OpenPictureDialog 205
Gambar 12.14 Button High Pass filter ton Low Pass Filter 206
Gambar 12.15 New Unit 206
Gambar 12.16 Save As 206
Gambar 12.17 Save UnitImageProses 207
Gambar 12.18 Hasil Save UnitImageProses 207
Gambar 12.19 Kembali ke FormHighPassFilter 209
Gambar 12.20 Menu Toggle 209
Gambar 12.21 Klik Button High Pass Filter 209
Gambar 12.22 Button Exit 211
Gambar 12.23 Compiler ProjectHighPassFilter 212
Gambar 12.24 Menu Run 212
Gambar 12.25 Hasil Mammografi 213
Gambar 12.26 Hasil Photo 213
Gambar 13.1 Start Program 222
Gambar 13.2 New Application 223
Gambar 13.3 FormKMean 223
Gambar 13.4 Save All 223
Gambar 13.5 Save UnitKMean 224
Gambar 13.6 Save ProjectKMean 224
Gambar 13.7 Menu Image 224
Gambar 13.8 Stretch True 225
Gambar 13.9 Penambahan Image 2 225
Gambar 13.10 Menu Button 225
Gambar 13.11 Button Open 226
Gambar 13.12 Menu OpenPictureDialog 226
Gambar 13.13 Hasil OpenPictureDialog 226
Gambar 13.14 Button K-Mean 227
Gambar 13.15 Menu Label 228
Gambar 13.16 Label K 228
Gambar 13.17 Menu Edit 228
Gambar 13.18 EditCluster 229
Gambar 13.19 Label Weight 229
Gambar 13.20 Clr Wight 40Menu Toggle 230
Gambar 13.21 Menu ProgressBar 230
Gambar 13.22 Hasil ProgressBar 230
Gambar 13.23 Menu New Unit 231
Gambar 13.24 Menu Save As 231
Gambar 13.25 Save UnitImageProses 232
Gambar 13.26 Hasil UnitImageProses 232
Gambar 13.27 Kembali ke FormKMean 237
Gambar 13.28 Toggle 237
Gambar 13.29 Button K-Mean 237
Gambar 13.30 Button Exit 238
Gambar 13.31 Compiler ProjectKMean 239
Gambar 13.33 Hasil Program K-Mean 239
Gambar 14.1 Menu Open Project 247
Gambar 14.2 Open ProjectHistogramCut 248
Gambar 14.3 Hasil OpenProjectHistogramCut 248
Gambar 14.4 Menu Memo 249
Gambar 14.5 Hasil Memo 249
Gambar 14.6 MainMenu 249
Gambar 14.7 Hasil Main Menu Pada Form 250
Gambar 14.8 Tampilan Main Menu 250
Gambar 14.9 Tulisan Caption File Pada Main Menu 251
Gambar 14.10 Hasil Tampilan Fle Main Menu 251
Gambar 14.11 Menampilkan Tulisan Nilai Intensitas Pixel Awal 251
Gambar 14.12 Menampilkan Nilai Intensitas Pixel Hasil 252
Gambar 14.13 Kembali ke FormHistogramCut 252
Gambar 14.14 Hasil Program Menampilkan Nialai Intensitas Pixel 254
Gambar 15.1 Start Program 261
Gambar 15.2 New Application 261
Gambar 15.3 Form LogIn 262
Gambar 15.4 Tambah Edit ke Form 262
Gambar 15.5 Tambah Button ke Form 263
Gambar 15.6 New Form 263
Gambar 15.7 Form Aplikasi 264
Gambar 15.8 Menu Save All 264
Gambar 15.9 Save UnitLogIn 265
Gambar 15.10 Use Unit 265
Gambar 15.11 Mengelingkan Form Aplikasi Dengan UnitLogIn 266
Gambar 15.12 Mengelingkan UnitLogIn Dengan Form Aplikasi 266
Gambar 15.13 Compiler ProjectLogIn 267
Gambar 15.14 Menu Run 267
DAFTAR TABEL
TABEL 2.1 Nilai-nilai rk jika L=8 9
TABEL 2.2 Histogram Citra Semula Sebelum Perataan 10
TABEL 2.3 Hasil Transformasinya 11
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.
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.
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.
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.
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
procedure TFormOpenImage.btExitClick(Sender: TObject); begin
FormOpenImage.Close;
end;
16. Simpan program dengan cara File, save all.
17. Compiler progran dengan cara pilih menu Project, Compile
ProjectOpenImage.
Gambar 1.14 Menu Compiler
18.Lalu jalankan progran dengan cara pilih menu Run, Run.
Gambar 1.15 Menu Run
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
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
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, rk, 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
(L-1). 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 rk
0 0/7 = 0
1 1/7
2 2/7
3 3/7
4 4/7
5 5/7
6 6/7
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 rk nk Pr(rk) = nk/n
0 0/7 = 0.00 790 0.19
1 1/7 = 0.14 1023 0.25
2 2/7 = 0.29 850 0.21
3 3/7 = 0.43 656 0.16
4 4/7 = 0.57 329 0.08
5 5/7 = 0.71 245 0.06
6 6/7 = 0.86 122 0.03
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.
[image:30.612.102.401.537.664.2]s7 = 1.00 lebih dekat ke nilai 7/7 (=1.00), maka s7 = 7/7.
Table 2.3 Hasil Transformasinya :
k rk sk
0 0 1/7
1 1/7 3/7
2 2/7 5/7
3 3/7 6/7
4 4/7 6/7
5 5/7 1
6 6/7 1
7 1 1
Terlihat dari contoh di atas hanya lima nilai intensitas yang terisi yaitu 1/7, 3/7, 5/7, 6/7, dan 1.
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 nk Ps(sk) = nk/n
1/7 790 0.19
3/7 1023 0.25
5/7 850 0.21
6/7 656 + 329 = 958 0.23
7/7 245 + 122 + 81 =
448
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.
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
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.
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 autosizenyatrue.
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.
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;
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, pilih menu Win32, ProgressBar. Lalu klik ke form, lalu geser kekanan.
Gambar 2.18 Menu ProgresBar
17. Hasilnya sebagai berikut.
Gambar 2.19 Hasil ProgresBar
Gambar 2.20 New Unit
[image:38.612.151.348.258.423.2]19. Simpan unitnya dengan cara save as.
Gambar 2.21 Save All
20. Berinama unitnya dengan nama UnitImageProses.
Gambar 2.22 Save UnitImageProses
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 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
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 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]);
{ 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
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
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
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;
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;
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
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;
end; end;
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) = |&(*&∗(*,+),-(*,+)
Jika persamaan (3.7) dibagi dengan Sf(u,v),maka akan dihasilkan persamaan
W(u,v) = &∗(*,+)
|&(*,+)]2+.!(*,+)/,-(*,+)…………...…….….(3.8)
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(*,+)| &∗(*,+)|
|&(*,+)|2+.!(*,+)/,-(*,+) ……...………..(3.10)
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
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
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
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
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
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 form dengan cara, pilih menu Win32,
ProgressBar. Lalu klik ke form.
Gambar 3.15 Menu ProgressBar
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
[image:57.612.219.371.470.628.2]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;
[image:58.612.142.361.320.444.2]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;
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;
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) * (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;
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.
[image:61.612.118.432.519.643.2]23. Kembali ke FormWienerFilter, caranya klik UnitWienerFilter.
Gambar 3.21 Kembali ke FormWienerFilter
Gambar 3.22 Menu Toggle
[image:62.612.122.440.219.371.2]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
uses
UnitImageProses;
28. Tambahkan button ke form, lalu pada object inspector rubah properties
[image:63.612.112.505.153.325.2]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
[image:63.612.146.398.503.603.2]ProjectWienerFilter.
Gambar 3.25 Menu Compile
Gambar 3.26 Menu Run
[image:64.612.112.422.218.378.2]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;
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;
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);
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);
* (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 }
end;
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(2,3)= 41 "5#6-(2,3) ≥ 8
0 "5#6-(2,3)<89……….………..4.1
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
[image:70.612.75.535.337.768.2]gambar berikut:
Gambar 4.1 Start Program
2. P
a d a
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
[image:71.612.134.489.424.617.2]button diganti dengan Open, Namenya dengan btOpen.
Gambar 4.3
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.
[image:72.612.148.481.392.521.2]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;
8. Tambahkan button ke form, beri nama captionnya dengan Global Thresolding dan namenya dengan btGlobalThresholding dan tambahkan
[image:74.612.141.508.125.236.2]juga ProgresBar kedalam form.
Gambar 4.7 Button Thresolding
9. Tambahkan unit dengan cara file new unit.
Gambar 4.8 New Unit
[image:74.612.136.387.299.480.2]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
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;
for x:=0 to Image.Width-1 do for y:=0 to Image.Height-1 do begin
ClrGray := ImgGetGray (Image,x,y); if ClrGray<thres then
begin
m1 := m1 + ClrGray; n1 := n1 + 1;
end else begin
m2 := m2 + ClrGray; n2 := n2 + 1;
end; end;
if n1=0 then n1:=1; if n2=0 then n2:=1;
m1 := m1/n1; m2 := m2/n2;
thres := (m1+m2) / 2; Inc (counter);
ProgressBar1.Position := counter;
until (Abs(thresOld-thres)<=3)or(counter=5);
{ 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); if ClrGray<thres then
//Image.Canvas.Pixels[x,y] := RGB (0,0,0); Image.Canvas.Pixels[x,y] := clWhite;
end; end;
ProgressBar1.Position := ProgressBar1.Max; end;
end.
12. Tambahkan Label1, Label2, Label3 kemudian ganti captionnya dengan
Edit (ada pada Standard) ke form beri namenya dengan EditThreshold dan
[image:78.612.145.516.112.310.2]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,
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
[image:79.612.158.511.80.290.2]compile kemudian run. Hasilnya sebagai berikut.
Gambar 4.12 Hasil Program Thresolding
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
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);
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);