Edge detection dengan trace boundary

By | January 15, 2021
1,493 Views

Sinopsis

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 seperti contoh berikut terjadi putus edge nya, hal ini tentu tidak menarik

 

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

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);

Cara menggunakannya

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')