Bu uygulamamızda ağaçtaki kayısıları sayan bir uygulama geliştirdik. Bu uygulamanın kullanımı ülkemizde pek olmasa da diğer ülkelerde sıklıkla kullanılmaktadır. Özellikle meyve suyu üreticileri bu tarz uygulamaları çokça kullanılmaktadır. Bu uygulamanın kullanıcıya sunduğu meyveleri toplamadan önce ne kadar meyve olduğunu programın belirlemesi ve kullanıcıya sunar ve meyvelerin konumu da bu sayma işleminde belirlendiği için meyvelerin otomatik hasat toplama makineleri ile toplamasını sağlayacak verileri de sağlar.
1 of 9
Download to read offline
More Related Content
Kayısı Sayma Uygulaması
1. Kayısı Sayım Uygulaması
Bu uygulamamızda ağaçtaki kayısıları sayan bir uygulama geliştirdik. Bu
uygulamanın kullanımı ülkemizde pek olmasa da diğer ülkelerde sıklıkla
kullanılmaktadır. Özellikle meyve suyu üreticileri bu tarz uygulamaları çokça
kullanılmaktadır. Bu uygulamanın kullanıcıya sunduğu meyveleri toplamadan önce
ne kadar meyve olduğunu programın belirlemesi ve kullanıcıya sunar ve meyvelerin
konumu da bu sayma işleminde belirlendiği için meyvelerin otomatik hasat toplama
makineleri ile toplamasını sağlayacak verileri de sağlar.
Meyve sayma üzerine yapılan çeşitli çalışmalarda vardır. Bu çalışmaların
çoğunda resim işleme teknikleri kullanılmıştır. Görüntü işleme tekniklerinler inden
bazıları spektral veya şekil tabanlı analiz olarak ayrılmıştır. Spektral dayalı analiz
arka plan meyvenin renginden farklı olan meyveler için etkiliydi (Bulanon et al.,
2002a), şekil dayalı analiz meyve için belirlenen bir şekil ile karşılaştırılarak
yapılırdı bu yöntem diğerine göre daha etkilidir.(Ling et al., 2004) [9].
Bu uygulamada bizim kullanacağımız yöntem bu iki yöntemin biraz
harmanlanmasıdır. Uygulamamızda öncelikle renk tabanlı bölütlüme yapılarak
meyveler ile aynı renkteki nesneler seçiliyor ardından morfolojik işlemler ile belirli
büyüklükteki nesneleri seçiyoruz uygulamamızda karşılaştığımız problemlerde bir
tanesi de buydu güneşin geliş açısından dolayı ağacın dalı da kayısının rengine yakın
bir renkte oluyordu ve bölütlüme de burası da seçiliyordu ama aşmamız zor olmadı
çünkü meyvelerin boyutu ile yansıyan bölgeyi karşılaştırdığımız zaman meyvelerin
yanında gerçekten çok küçük kalıyordu bundan dolayı erozyon işlemi ile bu sorunu
çözdük.
Diğer bir karşılaştığımız soru ise ağaçtaki meyvelerin bu birbirlerine çok yakın
olması ve ikili resimde bunu tek bir obje gibi görünmesiydi bunu da wathershed
dönüşümü ile hallettim bu sorun genelde DNA,yıldız sayımı , kan hücrelerinin
sayımı gibi uygulamalarda karşılaşılıyor. [10]
Algoritma
4.4.2.Gauss Filtresi
Giriş görüntüsünde ilk gerçekleştirilen işlemdir. Bir Gauss alçak geçirgen filtresi
mümkün olduğu kadar gürültüyü azaltmak için kullanılır. Gürültüler görüntüdeki
Gauss Filtresi
Meyvenin El ile
Seçilmesi
Bölütlüme
İkili Resim'e
Dönüştürme
Morfolojik
İşlemler
Wathershed
Dönüşümü
Meyvelerin
Sayılması Ve
İşaretlenmesi
2. gölgeler ve parlak bölgeleridir . Gauss filtresi ile bölütlüme de bize sorun yaratacak
bölgeler alçak geçirgen filtreden geçirilir ve gürültüler daha yumuşak bir hal alır ve
bölütlüme de daha az gürültü seçilir[11]. Benim uygulamamda kullandığım filtre 5x5
lik gauss filtresidir.
he = imread('MEDIABEL 3.JPG');
he1 = he;
h = fspecial('gaussian',5,5);
he = imfilter(he,h,'replicate');
4.4.3.Meyvenin El İle Seçilmesi
Bunu yapmamın sebebi bu uygulamanın her meyve için çalışmasını istememdi
eğer sadece tek çeşit meyve seçilecekse belirlene bir eşik değeri ile bölütlüme den
çıkan sonuç dan istediğimiz meyveyi seçebilirdik. Bu işlem çok kolay bir işlemdir
meyveden ufak bir parça seçmek yeterlidir.
Şekil-50 Meyvenin elle seçilmesi
4.4.4.Bölütlüme Ve İkili Resme Dönüştürme
Bölütlüme işleminde bölütlenen bölgelerden seçtiğimiz bölge hangisine daha
çok uyuyor ise onu seçeriz kullandığımız bölütlüme tekniği [12].
cform = makecform('srgb2lab');
lab_he = applycform(he,cform);
ab = double(lab_he(:,:,2:3));
nrows = size(ab,1);
ncols = size(ab,2);
ab = reshape(ab,nrows*ncols,2);
nColors = 3;
% repeattheclustering 3 timestoavoidlocalminima
3. [cluster_idx, cluster_center] =
kmeans(ab,nColors,'distance','sqEuclidean', ...
'Replicates',3);
pixel_labels = reshape(cluster_idx,nrows,ncols);
imshow(pixel_labels,[]), title('image
labeledbyclusterindex');
segmented_images = cell(1,3);
rgb_label = repmat(pixel_labels,[1 1 3]);
for k = 1:nColors
color = he;
color(rgb_label ~= k) = 0;
segmented_images{k} = color;
end
excludeMask = im2double(excludeMask);
sonuc = [0 0];
for k=1:nColors
I_gray = rgb2gray(segmented_images{k});
I_gray = im2double(I_gray);
sonuc(k) = sum(sum(I_gray .* excludeMask));
end
k = find(sonuc == max(sonuc));
figure
imshow(segmented_images{k})
I_gray = rgb2gray(segmented_images{k});
4. Şekil-51 Bölütlüme Şekil-52 İkili resme dönüşüm
4.4.5.Morfolojik İşlem
Morfolojik işlemleri kullanırken önceden direk erozyon işlemi ile yukarıdaki
resimde görünen gürültüleri silemeye çalışıyordum ama meyvelerin içindeki
boşluklardan dolayı erozyon işleminden sonra wathershed dönüşümünü uyguladığım
zaman içindeki noktalardan dolayı dönüşüm bunları üst üste gelmiş gibi algılayıp bir
meyveyi 2 meyve gibi sayıyordu.
Şekil-53 Morfolojik işlem Şekil-54 Hatalı sayılmış
resim
Ama araştırdığım makalelerden öğrendiğim morfolojik işlemleri
gerçekleştirirken önce küçük boşlukları doldur küçük objeleri yok et.[13] Yeni
geliştirdiğim morfolojik işlem ise şu şekilde önce kapama işlemi ardından erozyon
ile gürültülerin silinmesi çıkan sonuçlar gerçekten mükemmel.
imshow(segmented_images{k})
I_gray = rgb2gray(segmented_images{k});
bw = im2bw(I_gray , graythresh(I_gray));
figure , imshow(bw)
se = strel('disk',8);
5. bw_e = imerode(imclose(bw,se),se);
%bw_e = imerode(bw,se);
%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
% imfiil kullanmak hatali!!
%bw_e = imfill(bw_e,'hole');
%vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
figure
imshow(bw_e)
Şekil-55 Yeni morfolojik
işlemler
Şekil-56 Doğru
sayılmış meyveler
bu uyguladığım metot ile kayısıları hatasız bir şekilde saydım.
4.4.5.Wathershed Dönüşümü
Yerel minimumlarından delinmiş bir yüzeyin suya batırıldığı hayal edilirse, en
düşük yükseklikli minimumdan başlayarak su adım adım farklı havzalara dolacaktır.
İki farklı havzadan gelen suların birleştiği noktalara barajlar inşa edilirse, bu batırma
işleminin sonunda her bir minimum, bu minimumla ilişkili havzayı sınırlayacak
şekilde tamamen barajlarla çevrilir. Su seviyesi yüzeyin en yüksek tepesine ulaştığı
zaman bu işleme son verilir. Sonuçolarak, yüzeyi farklı bölgelere ya da havzalara
ayıran barajlar wathershed çizgileri ya da sadece wathershedler olarak adlandırılır.
Watershed dönüşümünün suya batırma benzetimine dayalı algoritmik bir tanımı,
Vincent ve Soilletarafından geliştirilmiştir[14]
Bu dönüşümü yapmamın sebebi ikili resimde meyvelerin birbirleri ile bitişik bir
şekilde olması bu dönüşümün sonunda bitişik bütün nesneler birbirlerinden bağımsız
nesneler haline gelecek.
6. Bu dönüşü kullanmamız için öncelikle uzaklık hesaplaması yapmamız
gerekiyor. Bu işlemden elde edilen matris şu şekilde kullanılır iki nesneye de en
uzak noktalar bulunur ve burası 0 yapılır ve iki nesne birbirinden ayrılmış olur.
Bunu yapmak için Görüntü İşleme Toolboxbwdist i kullanacağız ,
mesafe dönüşümü . Bu örnekte de gösterildiği gibi mesafe ikili görüntünün
dönüşümü, her pikselin en yakın sıfırdan farklı değerli piksele mesafedir.
Şekil-57ikili görüntü (solda) ve mesafe (sağda) dönüşümü.
Şekil-58Wathershed dönüşümü
D = bwdist(~BW); % image B (above)
D = -bwdist(~BW); % image C (above)
watershed(D);
Bu sekildewathershed dönüşümünü uyguladık.
D = -bwdist(~bw_e);
figure, imshow(D,[]), title('Distancetransform of ~bw')
Ld = watershed(D);
bw2 = bw_e;
bw2(Ld == 0) = 0;
imshow(bw2)
mask = imextendedmin(D,2);
D2 = imimposemin(D,mask);
Ld2 = watershed(D2);
bw3 = bw_e;
bw3(Ld2 == 0) = 0;
bw3 = imfill(bw3,'hole');
imshow(bw3)
7. Şekil-59 Objeler arası
uzaklık
Şekil-60Wathershed
algoritması sonucu
4.4.6.MeyvelerinSaydırılması Ve İşaretlenmesi
Uyguladığımız işlemler sonucu bütün meyveler siyah bir bölge içerisinde
bundan dolayı birbirinden ayrık her bir bölge bir adet meyveyi ifade etmekte.
8. Şekil-61 Sayılmış meyveler
cc = bwconncomp(bw3)
obje = false(size(bw));
figure
imshow(he1)
hold
[B,L] = bwboundaries(bw3,'noholes');
stats = regionprops(L,'Area','Centroid');
%ang=0:0.01:2*pi;
%xp=5*cos(ang);
%yp=5*sin(ang);
for k=1:length(B);
area = stats(k).Area;
centroid = stats(k).Centroid;
%plot(centroid(1),centroid(2),'ko')
%plot(centroid(1)+xp,centroid(2)+yp,'LineWidth',1);
text(centroid(1),centroid(2),sprintf('%d',
k),'FontWeight','bold','EdgeColor',[0 0
0],'Color',[0 0 0]);
end
Uygulamanın Test grafiği
1 2 3 4 5 6 7 8 9 10
0
20
40
60
80
100
120
140
Test Numarasi
SayilanMiktar
GERCEK MEYVE SAYISI
PROGRAMIN SAYDIGI
9. Yaptığımız programın test sonuçları yukarıdadır. Bu test farklı resimlerde
denenmiştir.Başta da söylediğim gibi bu program ile bütün meyveleri sayabiliriz. Ama
programımız gayet güzel çalışıyor tabi ki başlangıç seviyesinde bir uygulama ama
geliştirilebilir.