Rabu, 16 Januari 2019

Deteksi Objek Berbentuk Lingkaran menggunakan Matlab

Sudah lama sekali rasanya dari semenjak saya update tahun lalu dan sekarang baru update lagi, pada postingan ini kita akan belajar bagaimana cara deteksi objek yang berbentuk lingkaran menggunakan Matlab. Deteksi objek lingkaran pada artikel ini menggunakan ciri dari properties Eccentricity setiap label area, yaitu properties yang bernilai dengan rentang 0-1 dimana jika nilai itu mendekati 0 maka objek tersebut lebih berbentuk lingkaran/bulat.

Deteksi Objek Berbentuk Lingkaran dengan Matlab

Deteksi Objek Berbentuk Lingkaran menggunakan Matlab

Disini saya menggunakan Matlab R2018a untuk melakukannya. Apabila teman-teman menggunakan versi lain, boleh mencobanya terlebih dahulu.

Disini saya menggunakan 2 gambar ini:

Deteksi Objek Berbentuk Lingkaran menggunakan Matlab

Deteksi Objek Berbentuk Lingkaran menggunakan Matlab

Pertama yang dilakukan adalah load gambar yang akan didetksi objeknya

img=imread('objek4.jpg');

lalu ubah ke grayscale

gray=rgb2gray(img);

Haluskan dengan filter gaussian

imgGauss=imgaussfilt(gray,4);

Ambil nilai ambang untuk menjadikannya gambar biner

level=graythresh(imgGauss);

Ubah ke gambar biner sesuai dengan nilai ambang

BW=imbinarize(gray,level);

Isi area yang mungkin terdapat bolongan2.

imgFill=imfill(BW,'holes');

Hilangkan objek yang kecil yang kurang dari 500px

imgOpen=bwareaopen(imgFill,500);

Beri label setiap wilayah dengan 8 connectivity

imgLabel = bwlabel(imgOpen,8);

Dapatkan properties centroid, major axis, minor axis, eccentricity, dan bounding box setiap label

stats = regionprops('table',imgLabel,'Centroid','MajorAxisLength','MinorAxisLength','Eccentricity','BoundingBox');

Tampilkan objek yang berbentuk lingkaran dengan lingkaran warna hijau dan yang bukan lingkaran dengan kotak warna merah

figure('name','deteksi objek lingkaran - Irfan Muhammad Ghani www.kangghani.com');imshow(img); hold on;
jumlahlingkaran=0;

posisi=[];
for x = 1 : numel(stats.Eccentricity)
    lingkarA = stats.Eccentricity(x);
    % Eccentricity bernilai 0-1
    % semakin dekat ke 0 maka objek tersebut adalah lingkaran
    % jika eccentricity kurang dari 0.5 maka itu lingkaran
    if lingkarA < 0.5
        %hitung jumlah lingkaran
        jumlahlingkaran=jumlahlingkaran+1;
        %ketahui posisi lingkaran
        posisi(jumlahlingkaran)=x;
        %cari titik tengah lingkaran x
        centers = stats.Centroid(x,:);
        %cari diameter lingkaran x
        diameters = mean([stats.MajorAxisLength(x) stats.MinorAxisLength(x)],2);
        %cari jari2 lingkaran x
        radii = diameters/2;
        %tandai objek yang termasuk lingkaran dengan warna hijau
        viscircles(centers,radii,'color','g'); 
    else
        %tandai objek yang bukan lingkaran dengan warna merah
        bb = stats.BoundingBox(x,:);
        rectangle('position',bb,'edgecolor','r','linewidth',2)
    end
end
hold off;

Hasil dari deteksi objek berbentuk lingkaran dengan Matlab:

Deteksi Objek Berbentuk Lingkaran menggunakan Matlab

Deteksi Objek Berbentuk Lingkaran menggunakan Matlab

Complete Code:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% dibuat oleh: Irfan Muhammad Ghani
% Deteksi Objek Lingkaran dengan
% melihat propertiesnya
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear all;clc;close all;

% load gambar asli
img=imread('objek4.jpg');

% ubah ke gray
gray=rgb2gray(img);

% haluskan gambar asli dengan gaussian
imgGauss=imgaussfilt(gray,4);

% ambil level threshold
level=graythresh(imgGauss);

% gambar biner dari thresold gambar gray
BW=imbinarize(gray,level);

% isi wilayah yang bolong
imgFill=imfill(BW,'holes');

% hilangkan objek yang kurang dari 500px
imgOpen=bwareaopen(imgFill,500);

% beri label setiap wilayah
imgLabel = bwlabel(imgOpen,8);

% ambil properties centroid, major axis, minor axis, eccentricity, dan
% bounding Box
stats = regionprops('table',imgLabel,'Centroid','MajorAxisLength','MinorAxisLength','Eccentricity','BoundingBox');
% tampilkan deteksi objek lingkaran
figure('name','deteksi objek lingkaran - Irfan Muhammad Ghani 15101052');imshow(img); hold on;
jumlahlingkaran=0;
posisi=[];
for x = 1 : numel(stats.Eccentricity)
    lingkarA = stats.Eccentricity(x);
    % Eccentricity bernilai 0-1
    % semakin dekat ke 0 maka objek tersebut adalah lingkaran
    % jika eccentricity kurang dari 0.5 maka itu lingkaran
    if lingkarA < 0.5
        %hitung jumlah lingkaran
        jumlahlingkaran=jumlahlingkaran+1;
        %ketahui posisi lingkaran
        posisi(jumlahlingkaran)=x;
        %cari titik tengah lingkaran x
        centers = stats.Centroid(x,:);
        %cari diameter lingkaran x
        diameters = mean([stats.MajorAxisLength(x) stats.MinorAxisLength(x)],2);
        %cari jari2 lingkaran x
        radii = diameters/2;
        %tandai objek yang termasuk lingkaran dengan warna hijau
        viscircles(centers,radii,'color','g'); 
    else
        %tandai objek yang bukan lingkaran dengan warna merah
        bb = stats.BoundingBox(x,:);
        rectangle('position',bb,'edgecolor','r','linewidth',2)
    end
end
hold off;

Sekian dari postingan ini, terimakasih telah mengunjungi blog saya, dan semoga bermanfaat.

Orang biasa yang senang belajar. Senang ngoprek dan menulis sesuatu yang berbau teknologi, desain grafis, dan hal random lainnya.

Give us your opinion

Silakan Berkomentar