Soru sorPortakal Ağacından Portakal Tanıma
TufanYagiz tarafından 5 sene önce soruldu

Merhabalar kolay gelsin herkese; Ağacın üzerinde portakalı tanıyan kodu bulamadık, bunu renk olarak mı yapalım diyoruz örneğin RGB olarak turuncu rengini yeşil renkten ayırsak olur mu yardımcı olabilecek var mı acaba ?

4 Cevap
hakkans Yönetici tarafından 5 sene önce cevaplandı

Merhaba,
Dediğiniz gibi yaptığınız takdirde bir portakalın kaç piksellik alan kapladığını da bilmeniz gerekiyor. Yoksa aynı portakaldaki iki pikseli iki ayrı portakal olarak tanıyabilir kodunuz. Turuncu olan pikselleri seçtikten sonra yan yana olan pikselleri gruplarsanız bu şekilde çözülebilir diye düşünüyorum.

TufanYagiz tarafından 5 sene önce cevaplandı

Merhaba;
Cevabınız için çok teşekkür ediyorum. Portakalların hepsi aynı boyutta değil o yüzden belli bir boyut giremedim ve uzaklık farkı da var. O yüzden bazı portakalları dediğiniz gibi 3 tane buluyor ve bazılarını da hiç bulmuyor.. MatlabdaPortTespiti

TufanYagiz tarafından 5 sene önce cevaplandı

Kod Çıktısı

rgb = imread('port.png');
imshow(rgb);
hsv=rgb2hsv(rgb);
h=hsv(: , : ,1);
s=hsv(: , : ,2);
v=hsv( : , : ,3);
bw= (h>0.05 & h0.6) & (v> 0.51);
imagesc(bw)
colormap(gray)
se = strel('disk',2);
bw = imclose(bw,se);
bw = imfill(bw,'holes');

imshow(bw)
ball1 = bwareaopen(bw, 50);
imagesc(ball1);
lab = bwlabel(ball1);
s = regionprops(lab, 'Area', 'Perimeter');
sArea = [s.Area];
sPerim= [s.Perimeter];
metric= (sPerim.^2)./(4*pi.* sArea);
idx = find(metric > 0.7);
gr_fin = ismember(lab, idx);
imshow(gr_fin)

stat = regionprops(gr_fin,'centroid');
imshow(rgb); hold on;
for x = 1: numel(stat)
plot(stat(x).Centroid(1),stat(x).Centroid(2), 'wp','MarkerSize',20,'MarkerFaceColor','b');
end

hakkans Yönetici tarafından 5 sene önce cevaplandı

Çıktınızdan anladığım kadarıyla hsv koşullarınızı daha sıkı tutmanız lazım ki portakal olmayan noktalar seçilmesin. Öte yandan, sanırım aynı portakaldan fazla nokta seçilmemesi için şu kısım var:

s = regionprops(lab, ‘Area’, ‘Perimeter’);
 sArea = [s.Area];
[adinserter block="2"]
 sPerim= [s.Perimeter];
 metric= (sPerim.^2)./(4*pi.* sArea);
 idx = find(metric > 0.7);
 gr_fin = ismember(lab, idx);
 imshow(gr_fin)

Bu kısımda da metric değeriniz küçük kalmış olabilir zira arkadaki portakallarda çok nokta seçme durumu daha az rastlanır bir şey. Bir de ortalarda üç tane portakal var ama bu seçim yüzünden sadece 1 nokta seçiliyor. Eğer portakal sayısı önemli değilse sorun değil ama öbür türlü üç portakalı da tanıyabilmeniz için bu bölgenin içinde de bir analiz yapmanız gerekebilir (belki gradyan ayırmanıza yardımcı olabilir).