×

Blob Operation in Inner Object

Blob Operation in Inner Object

940 Views

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

  1. Ada 2 objek
  2. Tentukan masing-masing area nya, untuk menentukan apakah objek tersebut box dan inner nya
  3. Kemudian tentukan letak centroid nya!

Jadi setiap objek akan dibandingkan dengan objek yang lainnya! Perhatikan berikut dengan x adalah sebuah centroid!

  1. 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
  2. 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

 

You May Have Missed