Minggu, 01 Maret 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!

Akan putus edge nya

Trace boundary

Kamu bisa melihat! ANTI 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') 
Posting Komentar