Ich zähle die Echsenschuppen

Ein befreundeter Biologe fragte mich, ob ich ihm helfen könne, ein Programm zu machenZähle die Schuppe (Ist das die richtige Übersetzung?) von Echsen.

Er hat mir ein paar Bilder geschickt und ich habe ein paar Sachen auf Matlab ausprobiert. Für einige Bilder ist es viel schwieriger als für andere, zum Beispiel wenn es dunklere (schwarze) Bereiche gibt. Zumindest mit meiner Methode. Ich bin mir sicher, dass ich hier nützliche Hilfe bekommen kann. Wie soll ich das verbessern? Habe ich den richtigen Ansatz gewählt?

Dies sind einige der Bilder.

Ich habe die besten Ergebnisse erzielt, indem ich folgteBildverarbeitung und Zählung mit MATLAB. Im Grunde geht es darum, das Bild in Schwarzweiß umzuwandeln und dann eine Schwelle zu setzen. Aber ich habe ein bisschen Erosion hinzugefügt.

Hier ist der Code:

img0=imread('C:...\pic.png');

img1=rgb2gray(img0);

%The output image BW replaces all pixels in the input image with luminance greater than level with the value 1 (white) and replaces all other pixels with the value 0 (black). Specify level in the range [0,1]. 
img2=im2bw(img1,0.65);%(img1,graythresh(img1));

imshow(img2)
figure;

 %erode
 se = strel('line',6,0);     
 img2 = imerode(img2,se);
 se = strel('line',6,90);   
 img2 = imerode(img2,se);
 imshow(img2)
figure;

imshow(img1, 'InitialMag', 'fit')

% Make a truecolor all-green image. I use this later to overlay it on top of the original image to show which elements were counted (with green)
 green = cat(3, zeros(size(img1)),ones(size(img1)), zeros(size(img1)));
 hold on
 h = imshow(green); 
 hold off


%counts the elements now defined by black spots on the image
[B,L,N,A] = bwboundaries(img2);
%imshow(img2); hold on;
set(h, 'AlphaData', img2)
text(10,10,strcat('\color{green}Objects Found:',num2str(length(B))))
figure;



%this produces a new image showing each counted element and its count id on top of it.
imshow(img2); hold on;
colors=['b' 'g' 'r' 'c' 'm' 'y'];
for k=1:length(B),
     boundary = B{k};
     cidx = mod(k,length(colors))+1;
     plot(boundary(:,2), boundary(:,1), colors(cidx),'LineWidth',2);
     %randomize text position for better visibility
     rndRow = ceil(length(boundary)/(mod(rand*k,7)+1));
     col = boundary(rndRow,2); row = boundary(rndRow,1);
     h = text(col+1, row-1, num2str(L(row,col)));
     set(h,'Color',colors(cidx),'FontSize',14,'FontWeight','bold');
end
figure; 
spy(A);

Und dies sind einige der Ergebnisse. In der oberen linken Ecke können Sie sehen, wie viele gezählt wurden.

Ich halte es auch für nützlich, die gezählten Elemente grün zu markieren, damit der Benutzer zumindest weiß, welche manuell gezählt werden müssen.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage