Image Processing, Broken Candy Project

Kategori: MATLAB , 10 Ağustos 2019 , JanFranco



Bu yazımda Image Processing yani görüntü işleme tekniklerini kullanarak MATLAB ortamında 8 şeker arasından kırık şekerleri tespit edeceğiz. Daha önce de söylediğim gibi burada kullanılan tekniklerin hepsi, arkasındaki algoritma ve matematik ile birlikte Image Processing bölümünde ayrıntılı olarak anlatılacaktır. Bu yazının amacı MATLAB ortamında görüntü işleme tekniklerini kullanmaktır. Başlayalım, resmi alalım:


candyImage = imread('seker.bmp');



8 adet şeker görüyoruz. Bu şekerlerin ikisi kırılmış. Amacımız bu şekerleri tespit edebilmek. Resmi grayscale resme çevirelim, strel() fonksiyonu ile bir kernel oluşturalım. imclose() fonksiyonu ile oluşturduğumuz kernel yardımıyla kapama işlemi yapalım. Kapama işlemi morfolojik bir işlemdir ve öncelikle dilation daha sonrasında erosion resme uygulanır.


grayImage = rgb2gray(candyImage);
se = strel('disk', 16);
bg = imclose(grayImage, se);


strel() fonksiyonu ile 16 birim çapında, disk şeklinde bir kernel oluşturduk. Daha doğrusu 16x16 birimlik bir matris oluşturduk. Bu matrisin içinde bir disk çizdiğimizi düşünelim. Bu diskin içinde kalan elementler 1, dışında kalan elementler 0 değerinde. Bu kernel ile resme closing tekniğini uyguladık. Şimdi elde ettiğimiz görüntüyü orijinal görüntüden çıkaralım:


candys = imsubtract(bg, grayImage);
imshow(candys);


Şekerleri hemen hemen elde ettik. Fakat bazı şekerlerin ortasında anlamsız bir boşluk var. Bunu düzeltmek adına öncelikle resmi binary resme çevirelim:


bwCandys = imbinarize(candys);
imshow(bwCandys);


imbinarize() fonksiyonu default olarak Otsu's Threshold yöntemini kullanır. Bu yöntemde threshold değeri histogramdaki ortalama değere göre bulunur. Bu yöntemi Image Processing bölümünde daha ayrıntılı anlatacağım. Bulunan threshold değerinin üstünde kalan pikseller 1 altında kalan pikseller 0 değerini alır. imfill() fonksiyonu ile boşlukları kapatalım:


whiteCandys = imfill(bwCandys, 'holes');
imshow(whiteCandys);


Şuan elde ettiğimiz resim kırık şekerleri tespit etmek için idealdir. bwlabel() fonksiyonu ile birbirine bitişik olmayan beyaz renkteki şekerleri etiketleyelim:


[labels, numItem] = bwlabel(whiteCandys, 4);
bwlabel fonksiyonu iki matris return eder. Burada labels ve numItem matrislerini return aldık. labels matrisi orijinal resmimiz ile aynı boyuttadır. numItem ise 1x1 boyutunda bir matristir. Burada yapılan işlem şudur, sırayla pikseller taranır. Örneğin (1, 1) pikseli ile başladık. Bu piksele 0 değeri verilir. Bu pikselin etrafındaki komşu pikseller taranır. Burada komşu sayısını 4 verdik. Yani yukarı, aşağı, sağ ve sol. 8 vererek çapraz piksellere de bakabilirdik. Eğer 0 değerini verdiğimiz piksel ile komşu pikseller aynı değerde ise komşu pikseller de 0 değerini alır. Eğer farklı değerde bir piksele denk gelirsek bu sefer bu piksel 1 değerini alır. Bu şekilde tüm şekerleri etiketlemiş olduk. Şimdi regionprops() fonksiyonu ile etiketlediğimiz şekerlerin bilgilerini alalım:


data = regionprops(labels, 'Eccentricity', 'Area', 'BoundingBox');
areas = [data.Area];
eccentricities = [data.Eccentricity];
Burada şekerlerin area ve eccentricity bilgilerini aldık. Area şekerlerin alanı, eccentricity ise şekerlerin elipse ne kadar benzediğinin oranıdır. Eccentiricity değeri 0-1 arasında olabilir. 0 değeri tam çemberi, 1 değeri düz çizgiyi temsil eder. Şimdi filtrelemek için area ve eccantricity değerleri için threshold belirleyelim:


minArea = mean(areas) - std(areas)*0.25;
faultyAreas = find(areas < minArea & eccentricities > 0.5);
faultyData = data(faultyAreas);
Değerleri belirledik. faultyData değişkeninde filtrelenmiş şekerlerin bilgilerini sakladık. Şimdi for döngüsü ile bu şekerlerin etrafına dikdörtgen çizelim:


figure,imshow(candyImage);
hold on
for i=1:length(faultyData)
    boundary = rectangle('Position', faultyData(i).BoundingBox, 'LineWidth', 2);
    set(boundary, 'EdgeColor', [0 0 1]);
end
hold off

broken candy


Sonraki Yazı: Image Processing, Coin Area Project
Yorumlar

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