MATLAB Как преобразовать координаты оси в координаты пикселей?

Каков предпочтительный способ преобразования координат оси (например, полученных plot или выходных данных point1 и point2 из houghlines) в координаты пикселей изображения?

Я вижу функцию axes2pix в документации Mathworks, но она непонятно как работает. В частности, каков третий аргумент? В примерах просто передается 30, но неясно, откуда берется это значение. Объяснения зависят от знания нескольких других функций, которых я не знаю.

Связанный с этим вопрос: координаты оси в координатах пикселей? предлагает использовать poly2mask, который будет работать для многоугольника, но как мне сделать то же самое вещь для одной точки или список точек?

Этот вопрос также ссылается на скрипты для преобразования Изображение в графических координатах и ​​обратно, но этот код вызвал исключение:

Error using  / 
Matrix dimensions must agree.

person dsg    schedule 28.06.2012    source источник


Ответы (2)


Рассмотрим следующий код. Он показывает, как преобразовать координаты осей в координаты пикселей изображения.

Это особенно полезно, если вы рисуете изображение, используя пользовательские местоположения XData/YData, отличные от 1:width и 1:height по умолчанию. В приведенном ниже примере я смещаюсь на 100 и 200 пикселей по осям x/y.

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

скриншот

(обратите внимание, что пределы оси не начинаются с (1,1), поэтому необходимо axes2pix)

person Amro    schedule 29.06.2012

Может быть встроенный способ, о котором я не слышал, но это не должно быть сложно сделать с нуля...

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

Используя эти значения, вы можете легко преобразовать координаты осей в пиксели.

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

В приведенном выше примере используется pos(1) в качестве смещения x осей на рисунке. Если вас это не волнует, не используйте его. Точно так же, если вы хотите, чтобы это было в координатах экрана, добавьте смещение x позиции, полученной с помощью get(figure_handle,'position')

person tmpearce    schedule 28.06.2012
comment
Это выглядит многообещающе. Однако что, если у меня нет дескриптора оси? Например, houghlines mathworks.com/help/toolbox/images/ref/ houghlines.html принимает двоичное изображение и возвращает структуры, содержащие строки с (x, y). Это конкретный случай, который я пытаюсь обработать. Как они это делают? - person dsg; 28.06.2012
comment
Поскольку houghlines изначально работает с изображением (2D-матрицей), я полагаю, что пара X,Y, вероятно, уже находится в пространстве пикселей, поскольку нет объекта фигуры/осей (и, следовательно, нет преобразования в экранное пространство) для учета. - person tmpearce; 28.06.2012