2012-06-28 20 views
5

¿Cuál es la forma preferida de convertir las coordenadas del eje (por ejemplo, las tomadas por plot o las salidas en point1 y point2 de houghlines) en coordenadas de píxel en una imagen?MATLAB ¿Cómo convertir coordenadas de ejes a coordenadas de píxeles?

Veo la función axes2pix en la documentación de Mathworks, pero no está claro cómo funciona. Específicamente, ¿cuál es el tercer argumento? Los ejemplos simplemente pasan en 30, pero no está claro de dónde proviene este valor. Las explicaciones dependen del conocimiento de varias otras funciones, que no sé.

La pregunta relacionada: Axis coordinates to pixel coordinates? sugiere usar poly2mask, que funcionaría para un polígono, pero ¿cómo hago lo mismo para un solo punto o una lista de puntos?

Esa pregunta también enlaces a Scripts to Convert Image to and from Graph Coordinates, pero ese código inició una excepción:

Error using/
Matrix dimensions must agree. 

Respuesta

0

Puede haber una forma integrada de que no he oído hablar, pero esto no debería ser difícil de hacer desde cero ...

set(axes_handle,'units','pixels'); 
pos = get(axes_handle,'position'); 
xlim = get(axes_handle,'xlim'); 
ylim = get(axes_handle,'ylim'); 

Utilizando estos valores, puede convertir fácilmente las coordenadas de los ejes en píxeles.

x_in_pixels = pos(1) + pos(3) * (x_in_axes-xlim(1))/(xlim(2)-xlim(1)); 
%# etc... 

los usos anteriores pos(1) como el X-desplazamiento de los ejes dentro de la figura. Si no te importa esto, no lo uses. Del mismo modo, si lo desea en coordenadas de pantalla, agregue el desplazamiento x de la posición obtenida por get(figure_handle,'position')

+0

Esto parece prometedor. Sin embargo, ¿qué pasa si no tengo un mango de eje? Por ejemplo, 'houghlines' http://www.mathworks.com/help/toolbox/images/ref/houghlines.html toma una imagen binaria y devuelve estructuras que contienen líneas con (x, y). Este es el caso específico que trato de manejar. ¿Cómo lo hicieron? – dsg

+0

Dado que 'houghlines' opera de forma nativa en una imagen (matriz 2D), me imagino que el par' X, Y' probablemente ya esté en el espacio de píxel, ya que no hay objeto figura/eje (y por lo tanto no hay transformación en espacio de pantalla) para dar cuenta. – tmpearce

1

Tenga en cuenta el siguiente código. Muestra cómo convertir las coordenadas de los ejes a las coordenadas de píxeles de la imagen.

Esto es especialmente útil si traza la imagen usando ubicaciones personalizadas de XData/YData que no sean las predeterminadas 1:width y 1:height. Estoy cambiando de 100 a 200 píxeles en las direcciones x/y en el siguiente ejemplo.

function imageExample() 
    %# RGB image 
    img = imread('peppers.png'); 
    sz = size(img); 

    %# show image 
    hFig = figure(); 
    hAx = axes(); 
    image([1 sz(2)]+100, [1 sz(1)]+200, img) %# shifted XData/YData 

    %# hook-up mouse button-down event 
    set(hFig, 'WindowButtonDownFcn',@mouseDown) 

    function mouseDown(o,e) 
     %# get current point 
     p = get(hAx,'CurrentPoint'); 
     p = p(1,1:2); 

     %# convert axes coordinates to image pixel coordinates 
     %# I am also rounding to integers 
     x = round(axes2pix(sz(2), [1 sz(2)], p(1))); 
     y = round(axes2pix(sz(1), [1 sz(1)], p(2))); 

     %# show (x,y) pixel in title 
     title(sprintf('image pixel = (%d,%d)',x,y)) 
    end 
end 

screenshot

(tenga en cuenta cómo los límites de los ejes no se inician en (1,1), por tanto, la necesidad de axes2pix)

Cuestiones relacionadas