tiene lagarto escamas con animales algorithm matlab image-processing image-segmentation mathematical-morphology

algorithm - escamas - Contando la escama de lagartos



animales con escamas (1)

Un biólogo amigo mío me preguntó si podía ayudarlo a hacer un programa para contar la escama (¿esta es la traducción correcta?) De lagartos.

Me envió algunas imágenes y probé algunas cosas en Matlab. Para algunas imágenes es mucho más difícil que otras, por ejemplo, cuando hay regiones más oscuras (negras). Al menos con mi método. Estoy seguro de que puedo obtener ayuda útil aquí. ¿Cómo debería mejorar esto? ¿He tomado el enfoque correcto?

Estas son algunas de las imágenes.

Obtuve los mejores resultados al seguir el procesamiento de imagen y conteo usando MATLAB . Básicamente se trata de convertir la imagen en blanco y negro y luego ponerla en el umbral. Pero agregué un poco de erosión.

Aquí está el código:

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

Y estos son algunos de los resultados. En la esquina superior izquierda puede ver cuántos se contaron.

Además, creo que es útil tener los elementos contados marcados en verde para que al menos el usuario pueda saber cuáles se deben contar manualmente.


Hay una ruta que debe considerar: segmentación de cuencas . Aquí hay un ejemplo rápido y sucio con su primera imagen (se supone que tiene la caja de herramientas de IP):

raw=rgb2gray(imread(''lCeL8.jpg'')); Icomp = imcomplement(raw); I3 = imhmin(Icomp,20); L = watershed(I3); %% imagesc(L); axis image

Resultado que se muestra con un mapa de color:

A continuación, puede contar las celdas de la siguiente manera:

count = numel(unique(L));

Una de las ventajas es que puede alimentarse directamente a regionprops y darle todos los detalles agradables sobre la ''escama'' individual:

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

Que podría usar para controlar la segmentación por encima / por debajo:

Nota: gracias especiales a @jucestain por ayudar con el acceso adecuado a los campos en la estructura r aquí