Sunday, March 1, 2015

Edge detection dengan trace boundary



Penulis banyak sekali melibatkan proses operasi salah satu dari sekian banyaknya yaitu deteksi tepi. Hanya saja kalau penulis menggunakan function edge di matlab menggunakan operasi convolution dengan beragam jenis filter seperi canny, prewit, roberts hanya saja, penulis dibuat KESAL lantaran ada yang terputus hasil edge nya! Padahal tidak boleh putus edge / perimeter nya! Karena akan digunakan untuk analisis chain code / freeman code



Sehingga penulis mendesain suatu algoritma untuk TAHAN terhadap putusnya suatu edge detection!

Bandingkan dengan edge canny bawaan matlab

Bila kalian menggunakan edge detection seperti canny atau lainnya, terkadang akan putus edge nya

Trace boundary

Coba kalian bandingkan dengan gambar dibawah ini yang tidak akan putus


Trace boundary ini akan menggunakan konsep looping untuk pengecekan nilai pixel tetangganya!
Lumayan cepat! Dari pada menggunakan convolution Penulis telah sukses menggunakan algoritma tersebut secara luas untuk diterapkan pada kasus-kasus recognition dan analisis contour

Code trace Boundary

function [boundary_pixel]=traceboundaryrevisi1(a)
%function yang bertugas untuk melakukan deteksi tepi
%menggunakan teknik traceboundary
%oleh       : mulkan.ms@gmail.com
%update     : 1 februari 2015
%web        : www.softscients.web.id

%tambah padding
%tambahkan margin 1 pixel
kiri_tepi = zeros(size(a,1),1);
a = [kiri_tepi,a,kiri_tepi];
atas_tepi = zeros(1,size(a,2));
a = [atas_tepi;a;atas_tepi];

inc = 1;
boundary_pixel = zeros(size(a,1),size(a,2));
for i=1:size(a,1)
    for j=1:size(a,2)
        %cek atas jika
        if (i-1)>=1
            if a(i,j)~=0 && a(i-1,j)==0
                a(i,j)=inc;
                boundary_pixel(i,j)=1;                
            end
        end
        %cek bagian bawah jika
        if (i+1)<=size(a,1)
            if a(i,j)~=0 && a(i+1,j)==0
                a(i,j)=inc;
                boundary_pixel(i,j)=1;
            end
        end
        %cek bagian kiri jika
        if (j-1)>=1
            if a(i,j)~=0 && a(i,j-1)==0
                a(i,j)=inc;
                boundary_pixel(i,j)=1;
            end
        end
        %cek bagian kanan jika
        if (j+1)<=size(a,2)
            if a(i,j)~=0 && a(i,j+1)==0
                a(i,j)=inc;
                boundary_pixel(i,j)=1;
            end
        end
        inc = inc+1;
         
    end
end
%hilangkan padding lagi
boundary_pixel = boundary_pixel(2:end-1,2:end-1); 

Implementasi

clc;clear all;close all;
I = imread('cog.jpg');
bw = im2bw(I);
figure,imshow(traceboundaryrevisi1(bw)),title('trace boundary')
figure,imshow(edge(bw,'canny')),title('edge canny') 

No comments:

Post a Comment