10

Mój przyjaciel biologa zapytał mnie, czy mógłbym mu pomóc zrobić program do policzyć squamę (czy to właściwe tłumaczenie?) Jaszczurek.Liczenie squamów jaszczurek

Wysłał mi kilka zdjęć, a ja wypróbowałem kilka rzeczy na Matlabie. W przypadku niektórych zdjęć jest znacznie trudniejsze niż inne, na przykład, gdy występują ciemniejsze (czarne) obszary. Przynajmniej z moją metodą. Jestem pewien, że mogę tu uzyskać pomoc. Jak mam to poprawić? Czy podjąłem właściwe podejście?

Oto niektóre z obrazów.

pic1

pic2

mam najlepsze wyniki wykonując Image Processing and Counting using MATLAB. Zasadniczo zmienia obraz na czarno-biały, a następnie go progu. Ale dodałem trochę erozji.

Oto kod:

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); 

A oto niektóre z wyników. W lewym górnym rogu widać, ile osób zostało policzonych.

Uważam także, że warto policzyć elementy zaznaczone na zielono, więc przynajmniej użytkownik może wiedzieć, które z nich muszą być policzone ręcznie.

enter image description here

+2

Chciałbym mieć więcej czasu na rozwiązanie tego problemu! Brzmi naprawdę interesująco! Zacznę od wyostrzenia obrazu, a następnie spróbuję wykryć linie (używając transformacji hough dla intanse), ponieważ wydaje się, że zazwyczaj są to proste linie oddzielające squamę. Być może warto też odwrócić obrazy w niektórych przypadkach, ponieważ są czarne mroczki –

+0

Nie myślałem o używaniu wykrywania linii!Spróbuję i zaktualizuję :) Dzięki @IvayloStrandjev – fersarr

+1

Możesz wypróbować zarówno lokalne filtry poprawiania kontrastu, jak i algorytm wykrywania krawędzi Canny. – MBo

Odpowiedz

6

Jest jedna droga należy rozważyć: watershed segmentation. Oto szybki i brudny przykład przy pierwszym obrazie (zakłada masz przybornik IP):

raw=rgb2gray(imread('lCeL8.jpg')); 

Icomp = imcomplement(raw); 
I3 = imhmin(Icomp,20); 
L = watershed(I3); 
%% 
imagesc(L); 
axis image 

Wynik pokazany z colormap:

watershed

Następnie można policzyć komórki jako następująco:

count = numel(unique(L)); 

Jedną z zalet jest to, że może on być podawany bezpośrednio do regionprops i daje wszystkie ładne szczegóły dotyczące osoby „Łuska”:

r=regionprops(L, 'All'); 
imshow(raw); 

for k=2:numel(r) 
    if r(k).Area>100 % I chose 100 to filter out the objects with a small are. 
     rectangle('Position',r(k).BoundingBox, 'LineWidth',1, 'EdgeColor','b', 'Curvature', [1 1]); 
    end 
end 

które można użyć do monitorowania powyżej/poniżej segmentacji: bounding boxes

Uwaga: specjalne podziękowania do @jucestain za pomoc z właściwego dostępu do pól w strukturze herer

+0

To działa o wiele lepiej, szczególnie w dolnej części! :) wielkie dzięki. Po prostu wypróbowałem to tutaj. – fersarr

+0

@fersarr nie ma za co. Nawiasem mówiąc, użyłem jednego ze zdjęć jako przykładu w innym poście: http://stackoverflow.com/a/22818561/2777181 Mam nadzieję, że wszystko jest w porządku. –

+1

Bez problemu! Spraw, aby jaszczurki były słynne! :) – fersarr