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
Disini saya menggunakan Matlab R2018a untuk melakukannya. Apabila teman-teman menggunakan versi lain, boleh mencobanya terlebih dahulu.
Disini saya menggunakan 2 gambar ini:
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:
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.