Image Processing, Finding Circles

Kategori: MATLAB , 11 Ağustos 2019 , JanFranco


Bu yazımda çember, dikdörtgen gibi şekillere sahip ofis malzemelerini tespit edeceğiz. Bu malzemelerden yuvarlak olanları işaretleyeceğiz. Resmi alarak başlayalım:


image = imread('img1.png');

image processing
Resmi grayscale resme çevirelim ve imbinarize() fonksiyonu ile binary resim elde edelim:


grayImage = rgb2gray(image);
bwImage = im2bw(grayImage);

image processing
imbinarize() fonksiyonu ile threshold değeri belirledik ve bu threshold yani eşik değerin üstünde kalan değerler 1 altında kalan değerler 0 oldu. bwareaopen() fonksiyonu ile gürültüleri temizleyelim:


clear_bwImage = bwareaopen(bwImage, 40);

image processing
Boyutu 30 pikselin altındaki objeleri temizledik. Böylelikle gürültüler yok oldu. Şimdi objelerin içini dolduralım:


clearFilled_bwImage = imfill(clear_bwImage, 'holes');

image processing
bwboundaries() fonksiyonu ile objelerin sınırlarını ve etiketlerini alalım:


[Labels, Boundaries] =  bwboundaries(clearFilled_bwImage);
label2rgb() fonksiyonu ile farklı etiketlere sahip objeleri farklı renklere boyayabiliriz:


figure,imshow(label2rgb(Boundaries, @jet, [.5 .5 .5]));
Bir figür oluşturduk. Bu figürün üzerinden devam edeceğiz. Her bir objenin sınırlarını çizelim:


hold on
for i=1:length(Labels)
    boundary = Labels{i};
    plot(boundary(:,2), boundary(:,1), 'LineWidth', 2);
end
Şu an bulunduğumuz aşamaya kadar tüm objeleri tespit ettik. Burada bitirebiliriz ancak amacımız yuvarlak objeleri işaretlemek. Bunun için regionprops() fonksiyonu ile alan ve merkez bilgilerini alalım. Ayrıca alan için bir eşik değer belirleyelim:


stats = regionprops(Boundaries, 'Area', 'Centroid');
areaThreshhold = 0.89;
Bir for döngüsü ile her obje için ayrı ayrı çevre alan hesabı yapıp bir oran bulalım. Eğer oran eşik değerin üstünde ise çemberdir kabul edip işaretleyelim:


for k=1:length(Labels)
    boundary = Labels{k};
    delta_sq = diff(boundary).^2;
    cevre = sum(sqrt(sum(delta_sq, 2)));
    alan = stats(k).Area;
    yOran = 4*pi*alan / cevre^2;
    
    if yOran > areaThreshhold
        merkez = stats(k).Centroid;
        plot(merkez(1), merkez(2), 'ko');
    end
end

image processing


Sonraki Yazı: Image Processing, Finding Circles - 2
Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın