2012-06-28 15 views
5

Qual è il modo preferito di convertire le coordinate dell'asse (ad esempio quelle prese da plot o quelle emesse in point1 e point2 di houghlines) in coordinate di pixel in un'immagine?MATLAB Come convertire le coordinate dell'asse in coordinate pixel?

Vedo la funzione axes2pix nella documentazione di Mathworks, ma non è chiaro come funzioni. In particolare, qual è il terzo argomento? Gli esempi passano appena in 30, ma non è chiaro da dove proviene questo valore. Le spiegazioni dipendono dalla conoscenza di molte altre funzioni, che non conosco.

La domanda correlata: Axis coordinates to pixel coordinates? suggerisce di utilizzare poly2mask, che funzionerebbe per un poligono, ma come faccio a fare la stessa cosa per un singolo punto o un elenco di punti?

Tale questione link ad Scripts to Convert Image to and from Graph Coordinates, ma che il codice ha generato un'eccezione:

Error using/
Matrix dimensions must agree. 

risposta

0

Ci può essere un modo incorporato che non ho sentito parlare, ma questo non dovrebbe essere difficile da fare da zero ...

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

Utilizzando questi valori, è possibile convertire facilmente le coordinate degli assi in pixel.

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

Gli usi sopra pos(1) come x-offset degli assi all'interno della figura. Se non ti interessa di questo, non usarlo. Allo stesso modo, se lo si desidera nelle coordinate dello schermo, aggiungere l'offset x della posizione ottenuta da get(figure_handle,'position')

+0

Questo sembra essere molto promettente. Tuttavia, cosa succede se non ho un handle di asse? Ad esempio, 'houghlines' http://www.mathworks.com/help/toolbox/images/ref/houghlines.html acquisisce un'immagine binaria e restituisce strutture contenenti linee con (x, y). Questo è il caso specifico che sto cercando di gestire. Come lo fanno? – dsg

+0

Poiché 'houghlines' opera in modo nativo su un'immagine (matrice 2D) Immagino che la coppia' X, Y' sia probabilmente già nello spazio pixel, poiché non vi è alcun oggetto figure/assi (e quindi nessuna trasformazione nello spazio dello schermo) per rendere conto. – tmpearce

1

Considerare il seguente codice. Mostra come convertire dalle coordinate degli assi alle coordinate dei pixel dell'immagine.

Ciò è particolarmente utile se si stampa l'immagine utilizzando posizioni XData/YData personalizzate diverse dal valore predefinito 1:width e 1:height. Sto spostando di 100 e 200 pixel nelle direzioni x/y nell'esempio seguente.

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

(noti come i limiti degli assi non partono da (1,1), così la necessità di axes2pix)