Algoritma Region Growing adalah salah satu algoritma yang dapat digunakan untuk melakukan segmentasi citra. Contoh yang dibahas kali ini adalah mengenai segmentasi pembuluh darah pada citra retina.
Tentukan gambar yang akan digunakan dalam perhitungan
Diasumsikan gambar utama yang digunakan adalah
Langkah-langkah penggunaan algoritma ini adalah
1. Lakukan proses konversi menjadi grayscale apabila diperlukan
Simpan citra ini untuk ditampilkan saat akhir program
if length(size(img))>2 img = rgb2gray(img); end
2. Lakukan proses penambahan kontras agar citra terlihat lebih jelas
Kemudian lakukan konversi nilai pixel menjadi desimal sebagai input yang dibutuhkan oleh algoritma region growing
Simpan citra ini untuk ditampilkan saat akhir program
imgFilterContrast = adapthisteq(img);
3. Tentukan seed point, yaitu posisi koordinat awal dimana perhitungan akan dimulai
Diasumsikan dalam kasus ini, semua titik yang memiliki nilai pixel kurang dari 32 akan digunakan sebagai seed point
[x1,y1] = find(imgFilterContrast<=32);
* Jika tidak mengetahui posisi koordinat pada sebuah citra,
dapat digunakan cara berikut untuk memilih koordinat dari citra secara langsung
[y,x]=getpts; y=round(y(1)); x=round(x(1));
4. Lakukan perhitungan pada masing-masing seed point yang ditemukan
Lakukan proses perhitungan menggunakan region growing sesuai seed point yang tersedia
Kemudian ambil semua nilai terbaik yang ditemukan pada masing-masing hasil region growing
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini (poin 4a - 4c)
imgFilterContrast = im2double(imgFilterContrast); output = zeros(size(img)); for i=1:size(x1,1) tmp = regionGrowing(imgFilterContrast,x1(i),y1(i),0.05); output = max(output,tmp); end
Memasuki perhitungan pada fungsi regionGrowing
4a. Lakukan inisialisasi variabel yang diperlukan dalam perhitungan algoritma ini
Penjelasan masing-masing variabel dapat dilihat pada masing-masing komentar
rata2Region = img(x,y); % Rata-rata dari segmentasi region ukuranRegion = 1; % jumlah pixel dalam region % Variabel untuk menampung data pixel tetangga yang masuk ke dalam hasil segmentasi region jumlahBlokTetangga = 10000; daftarTetangga = zeros(jumlahBlokTetangga,3); idxTetangga = 0; jarakPixel=0; % jarak dari pixel terbaru region terhadap rata-rata region % Untuk melakukan pengecekan titik tetangga pada saat growing % Teknik yang digunakan adalah 4 arah tetangga, tetapi bisa juga dengan menggunakan 8 arah tetangga koordinatTetangga = [-1 0; 1 0; 0 -1; 0 1];
4b. Memulai proses growing sampai nilai jarak pixel terbaru dengan rata-rata region sudah melebihi jarak intensitas (poin 4b1 - 4b7)
while(jarakPixel < jarakIntensitasMaksimum && ukuranRegion < numel(img)) . . .
4b1. Lakukan perulangan sesuai 4 arah tetangga (poin 4b1a - 4b1c)
for arah=1:4, . . .
4b1a. Hitung koordinat pixel yang baru sesuai urutan arah tetangga
xn = x + koordinatTetangga(arah,1); yn = y + koordinatTetangga(arah,2);
4b1b. Lakukan pengecekan apakah tetangga ini masih berada dalam batas citra
ins = (xn >= 1) && ( yn >= 1) && (xn <= ukuranImg(1)) && (yn <= ukuranImg(2));
4b1c. Jika tetangga tersebut masih berada dalam batas citra dan belum pernah ditambahkan sebelumnya
maka tambahkan tetangga tersebut ke dalam daftar tetangga
if(ins && (output(xn,yn)==0)) idxTetangga = idxTetangga+1; daftarTetangga(idxTetangga,:) = [xn yn img(xn,yn)]; output(xn,yn)=1; end
4b2. Tambahkan blok tetangga apabila diperlukan agar mampu menampung titik tetangga berikutnya
if(idxTetangga + 10 > jumlahBlokTetangga), jumlahBlokTetangga = jumlahBlokTetangga + 10000; daftarTetangga((idxTetangga + 1):jumlahBlokTetangga,:)=0; end
4b3. Catat titik yang sedang dipilih sebagai jawaban pada gambar output
output(x,y) = 1; ukuranRegion = ukuranRegion + 1;
4b4. Cari titik tetangga yang memiliki intensitas paling mendekat rata-rata region
arah = abs(daftarTetangga(1:idxTetangga,3)-rata2Region); [~, idxMinJarak] = min(arah);
4b5. Hitung rata-rata region yang baru
rata2Region = (rata2Region * ukuranRegion + daftarTetangga(idxMinJarak,3)) / (ukuranRegion + 1);
4b6. Dapatkan koordinat x dan y yang baru menggunakan titik tetangga yang memiliki intensitas yang paling mendekati rata-rata region
x = daftarTetangga(idxMinJarak,1); y = daftarTetangga(idxMinJarak,2);
4b7. Hapus titik ini pada daftar tetangga agar tidak dipakai lagi
daftarTetangga(idxMinJarak,:) = daftarTetangga(idxTetangga,:); idxTetangga = idxTetangga - 1;
4c. Hasil jawaban output adalah dalam bentuk hitam putih
Dimana semua nilai pixel diatas 1 akan dianggap sebagai 1 dan selain itu akan dianggap sebagai 0
output=output>=1;
Hasil akhir adalah: (klik untuk perbesar gambar)
Contoh modul / source code menggunakan Matlab dapat didownload disini:
Jika membutuhkan jasa kami dalam pembuatan program, keterangan selanjutnya dapat dilihat di Fasilitas dan Harga
Jika ada yang kurang paham dengan langkah-langkah algoritma diatas, silahkan berikan komentar Anda.
Selamat mencoba.
maaf gan, mau bertanya
saya mendapatkan error ketika run file main.m, errornya adalah
Error using regionGrowing (line 107)
Initial position out of bounds, please try again!
Error in main (line 31)
tmp = regionGrowing(imgFilterContrast,x1(i),y1(i),0.05);
bagaimana ya gan kira kira solusinya? Terima kasih 🙂
Saya sudah memeriksa kembali file yang saya bagikan diatas, dan file tersebut masih berjalan dengan baik. Apakah anda sudah menjalankan skrip dengan benar? Karena pada skrip yang saya bagikan tidak ada file yang memiliki jumlah baris sampai dengan 107.
Sudah gan, salah file ternyata hehe
Makasih gann, sukses selaluuu 😀
Baik, semoga skrip yang saya bagikan bermanfaat dalam riset yang anda perlukan.