Soru sorFiltreleme ve tresholding sonrası görüntüde objeleri seçme
lifeisnotbeautiful tarafından 6 yıl önce soruldu

https://drive.google.com/file/d/1Oagxl2qh6rUlBocsKzmK5prL6qhHRHDx/view?usp=sharing adresinde vermiş olduğum resime filtre ve threshold sonrası elde ettim. Bu resimdeki objelerin bölgelerini belirlemek istiyorum. Fakat birleşik objelerde olduğu için kafam karıştı yardımcı olabilr msiniz

11 Cevap
lifeisnotbeautiful tarafından 6 yıl önce cevaplandı

Objelerin sayısını belirlemek ve tek tek ekrana çağırmak istiyorum

murkoc tarafından 6 yıl önce cevaplandı

Bunun için Watershed transform kullanılabilir. 
Aşağıdaki satırları kodunuza uyarlayarak sonuç elde edebilirsiniz:
Eroding=imerode(binary,strel('disk',integerValue));
D = bwdist(Eroding);
figure, imshow(D,[],'InitialMagnification','fit')
title('Distance transform of ~bw')
D = -D;
D(~erosion) = -Inf;
L = watershed(D);
Lrgb = label2rgb(L,'jet',[.5 .5 .5]);
figure
imshow(Lrgb,'InitialMagnification','fit')
title('Watershed transform of D')
figure,imshow(imfuse(Eroding,Lrgb))
axis([])
bw2 = ~bwareaopen(~Eroding, 12);
imshow(bw2)
D = -bwdist(~erosion);
figure,imshow(D,[])
Ld = watershed(~D);
figure,imshow(label2rgb(Ld))
bw2 = Eroding;
bw2(Ld == 0) = 0;
mask = imextendedmin(D,1);
D2 = imimposemin(D,mask);
Ld2 = watershed(D2);
bw3 = Eroding;
bw3(Ld2 == 0) = 0;
figure,
imshow(Eroding); 
title('Segmentation','FontSize',fontSize)
 

murkoc tarafından 6 yıl önce cevaplandı

Objelerin sayısını belirlemek için:
figure,imshow(image);
title('Labelling','FontSize',fontSize)
s=regionprops(logical(bw3),'Centroid','Area','MajorAxisLength','MinorAxisLength');
hold on
for k=1:numel(s)
c=s(k).Centroid;
text(c(1),c(2),sprintf('%d',k),…
'HorizontalAlignment','center',…
'VerticalAlignment','middle');
end
hold on

lifeisnotbeautiful tarafından 6 yıl önce cevaplandı

Merhaba yanıtınız için teşekkür ederim, 
D(~erosion) = -Inf; kısmında  Undefined function or variable 'erosion'.  şeklinde hata almaktayım erosion değerini nasıl tanımlamalıyım

murkoc tarafından 6 yıl önce cevaplandı

Merhaba,

D(~erosion) = -Inf; kısmında erosionu Eroding olacak. Bu düzeltmeden sonra çalışması lazım.

lifeisnotbeautiful tarafından 6 yıl önce cevaplandı

teşekkürler o kısmı düzelttikten sonra hata giderildi. Bir kaç soru daha sormak istiyorum aldığım çıktılarda https://drive.google.com/file/d/1DoB4W9eBaE1HXdxUqf9IupF-U1b_7w9_/view?usp=sharing adresine eklediğim boş bir görüntü alıyorum nerede hata yapılmış olabilir ?

lifeisnotbeautiful tarafından 6 yıl önce cevaplandı

objelerin sayısını belirlemek için verdiğiniz kodda  text(c(1),c(2),sprintf(‘%d’,k),…
‘HorizontalAlignment’,’center’,…
‘VerticalAlignment’,’middle’);
end
şu kısımda beklenmeyen parantez hatası alıyorum ama dikkatle incelediğimde nerede hata olduğunu ben farkedemedim

murkoc tarafından 6 yıl önce cevaplandı
S

Watershed transformda girilen threshold değeri (integerValue) yüksek gelmiş olabilir. Bu durumu 0-10 arası değerlerden başlayıp aşabilirsiniz.
figure,imshow(Image); title('Labelling','FontSize',fontSize) s=regionprops(logical(bw3),'Centroid','Area','MajorAxisLength','MinorAxisLength'); hold on for k=1:numel(s) c=s(k).Centroid; text(c(1),c(2),sprintf('%d',k),… 'HorizontalAlignment','center',… 'VerticalAlignment','middle'); end hold on
kısmında bir problem gözükmüyor. Bunun dışında bir parantez hatası olabilir mi?

lifeisnotbeautiful tarafından 6 yıl önce cevaplandı

Teşekkür ederim verdiğiniz yanıt için, halen 
Watershed transform of D çıktısından açık mavi boş bir grafik almaktayım. 
Bu kısım dışında ise şöyle bir problemim var halen gerçekten resimdeki obje sayısını elde edmiyorum çok daha fazla obje olduğunu buluyor program bunun sebebi ne olabilir

murkoc tarafından 6 yıl önce cevaplandı

Bu durumda resim binary ise orjinal resim denemenizi öneririm. rgb2binary işlemi segmentasyonla sağlanır. Ya da koddaki bu satırları kaldırmayı deneyin.

lifeisnotbeautiful tarafından 6 yıl önce cevaplandı

izin verirseniz mail adresinizi verseniz size aldığım çıktı görüntülerini ve nerede hata aldığımın görüntülerini paylaşsam uygun olur mu