Blob Operation in Inner Object
Sinopsis
Sebuah blob operation tidak selamanya kita bertemu dengan sebuah objek yang ideal, misalkan terdapat sebuah inner object sehingga yang seharusnya object tersebut adalah satu kesatuan akan dikenali menjadi 2 objek yang berbeda. Perhatikan gambar dibawah ini yang terdapat 4 objek warna putih dengan objek no 3 merupakan inner object dari objek no 1
Mengapa no 3 disebut inner box? Dikarenakan letak nya ada didalam sebuah box no1, padahal penulis menginginkan sebuah object hanya 3, seperti dibawah ini
Bagaimana mengatasi hal diatas?
Didalam function di Matlab ada yang namanya function imfill() yang berguna untuk mengisi hole seperti 2 gambar berikut
Tapi terkadang ada kasus lain dimana menggunakan imfill tidak terlalu berguna! maka penulis menggunakan algoritma berikut
- Ada 2 objek
- Tentukan masing-masing area nya, untuk menentukan apakah objek tersebut box dan inner nya
- Kemudian tentukan letak centroid nya!
Jadi setiap objek akan dibandingkan dengan objek yang lainnya! Perhatikan berikut dengan x adalah sebuah centroid!
- no 1 dibanding no 2 yaitu no 1 adalah box dan no 2 adalah box dikarenakan x:2 dari no 2 tidak terletak diarea no 1
- no 1 dibanding no 2 yaitu no 1 adalah box dan no 3 adalah inner box karena x:3 terletak di area no 1
Berikut untuk kasus-kasus yang lain sebelum diterapkan algoritma diatas akan terdapat 5 objek
Setelah diterapkan algoritma diatas, maka hanya ada 2 objek saja
Algoritma diatas digunakan untuk memperbaiki sebuah scanner untuk mendapatkan image document alih-alih mendapatkan sebuah text/huruf seperti contoh berikut untuk memisahkan sebuah frame comic
setelah dilakukan penerapan algoritma diatas
Kode lengkapnya sebagai berikut
clc;clear all;close all; I = imread('comic2.jpg'); bw = im2bw(I); H = regionprops(bw,'Image','Centroid','BoundingBox'); %%operasi blob figure,imshow(bw) hold on for i = 1 : size(H,1) text(H(i).BoundingBox(1),H(i).BoundingBox(2),num2str(i),'FontSize',15,'Color','r') persegi = H(i).BoundingBox; rectangle('Position',[persegi], 'LineWidth',2, 'EdgeColor','b'); end hold off lock_no =[]; %untuk menampung no boundingbox kategori innerbox for i = 1 : size(H,1) for j = 1:size(H,1) if i~=j %function untuk mencari inner box nya! C = kompareboundingbox(H(i).BoundingBox,H(j).BoundingBox,H(i).Centroid,H(j).Centroid,i,j); if C~=0 C; lock_no = [lock_no C]; break; end end end end lock_no; %proses dibawah ini untuk memisahkan box dan innerbox nya %berdasarkan teori himpunan %A = [1,2,3,4,5,6] -> dianggap campuran box dan inner box (jika ada) %B = [3,5,6] -> dianggap anggota inner box %maka anggota A selain B yaitu C -> anggota box %C = [1,2,4] h1 = 1:size(H,1); if isempty(lock_no)==1 lock_no = [0]; end h2 = lock_no; h3 = h1; for i = 1:size(h1,2) for j=1:size(h2,2) if h1(i)==h2(j) h3(i) = 0; break; end end end h4 = []; %variabel untuk menampung no index box for i = 1:size(h3,2) if h3(i)>0 h4 = [h4 h3(i)]; end end h4; figure,imshow(I) hold on for i = 1 : size(h4,2) index = h4(i); text(H(index).BoundingBox(1),H(index).BoundingBox(2),num2str(i),'FontSize',20,'Color','r') persegi = H(index).BoundingBox; rectangle('Position',[persegi], 'LineWidth',2, 'EdgeColor','b'); end hold off function [C] = kompareboundingbox(box1,box2,centroid1,centroid2,A,B) %untuk menentukan sebuah box dan innerbox %yaitu dengan cara membandingkan sebuah area / luas nya %jika area A > area B maka artinya %A itu box dan B itu adalah innerbox nya %begitu juga sebalikanya! C = 0; %nilai default area1 = box1(3)*box1(4); %untuk hitung area A area2 = box2(3)*box2(4); %untuk hitung area B %setelah didapatkan box dan innerbox nya %langkah selanjutnya adalah %jika innerbox itu merupakan innerbox %mempunyai ketentuan bahwa: %centroid dari innerbox harus DIDALAM area suatu box! if area1>area2 %melakukan komparasi x = centroid2(1); y = centroid2(2); xmin = box1(1); xmax = box1(1) + box1(3); ymin = box1(2); ymax = box1(2) + box1(4); if (x>=xmin && x <=xmax) && (y>=ymin && y <= ymax) %cek apakah centroid nya didalam?? % disp([num2str(B) ' masuk ' num2str(A)]); C = B; end else x = centroid1(1); y = centroid1(2); xmin = box2(1); xmax = box2(1) + box2(3); ymin = box2(2); ymax = box2(2) + box2(4); if (x>=xmin && x <=xmax) && (y>=ymin && y <= ymax) %cek apakah centroid nya didalam?? % disp([num2str(A) ' masuk ' num2str(B)]); C = A; end end %jika C == 0 %artinya A dan B bukan sebuah inner box dan box atau dengan kata lain A itu box %dan B itu inner box %jika C == 1 %artinya A itu adalah inner box dan B itu adalah Box nya %jika C == 2 %artinya A itu adalah box dan B itu adalah innerbox nya end