Algoritma Region Growing 4


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.


Tinggalkan sebuah komentar

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *

4 pemikiran di “Algoritma Region Growing

  • Febryan

    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 🙂

    • pip Penulis

      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.