sábado, 31 de diciembre de 2011

El código siguiente sirve para devolver la cota X e Y de un cuadrado en la foto de fondo negro. Es una especie de seguimiento de un objeto pero analizando una foto.  Si vamos editando la posición del caudrado, la X e Y cambiarán.



Teniendo una imagen con un cuadrado y fondo oscuro devuelve el centro en X,Y de dicho bloque
%Ejemplo que usa la "Image Processing Toolbox" de Matlab para buscar
%el centro de un objeto y devuelve las coordenadas X Y del mismo.

%Editar el fichero formas12.jpg moviendo el cuadrado y observar que las X e Y cambian

close all
image=imread('c:\formas12.jpg'); % Lee el fichero y lo carga en la variable image
img=im2bw(image);              
imshow(img);                   
[label num] = bwlabel(img,8);    %Etiqueta grupos de pixeles conectados en la imagen binaria encontrados en la variable ...
                                %...img con área > de 8 pixeles.
                                % [label num] = bwlabel(img, n)  Genera una matriz donde los valores a 0 son el fondo y
                                % los valores con mismo número son zonas de pixeles conectadas.
                                % El número num se cambia según qué grupo de píxeles conectados sea.
                               
                                % Si se observa la matriz resultante (quitar el ; de la línea bwlabel(img,8);), el valor de cada
                                % celda de dicha matriz indica, si es cero (fondo) y los otros valores zonas de píxeles vecinos.
                                % El número mayor será el mismo que el total de grupos depíxeles que se han encontrado.

pause (1) %pausa de n sgs.
imshow(label2rgb(label)); %Muestra la imagen coloreando las zonas de distinto color para identificar cada grupo u objeto

pause(1)
graindata=regionprops(label,'all');


for i=1:num   
    if  graindata(i).Eccentricity >0 %Excentricidad > 0 implica que la forma se aleja de ser redonda.
      
        found=i;
        area=graindata(found).Area;
        radius=sqrt(area/pi);
        radius=1.2*radius;
        centroid=graindata(found).Centroid;
       
        centro=num2str(centroid)
        text(centroid(1)-22,centroid(2), centro)
        text(centroid(1), centroid(2),'·')
       
        t=0:pi/20:2*pi;
        x=centroid(1)+radius*cos(t); 
        y=centroid(2)+radius*sin(t);
        
       
        hold on;
        plot(x,y);
end
end



Editar el jpg y mover el cuadrado y ejecutar el código

No hay comentarios:

Publicar un comentario