использование ползунка для поворота изображения в Matlab

У меня есть графический интерфейс (использующий GUIDE) в Matlab, вот как это выглядит:

введите здесь описание изображения

Я хочу повернуть изображение с помощью ползунка и показать изменение в реальном времени.

Я использую оси для отображения изображения.

как я могу это сделать?

EDIT: я создаю приложение OCR. вот так табличка выглядит, когда я ее поворачиваю, цифры полностью деформированы.

введите здесь описание изображения

благодаря.


person Ofir A.    schedule 01.07.2011    source источник


Ответы (1)


Вот пример графического интерфейса:

function rotationGUI()
    %# read image
    I = imread('cameraman.tif');

    %# setup GUI
    hFig = figure('menu','none');
    hAx = axes('Parent',hFig);
    uicontrol('Parent',hFig, 'Style','slider', 'Value',0, 'Min',0,...
        'Max',360, 'SliderStep',[1 10]./360, ...
        'Position',[150 5 300 20], 'Callback',@slider_callback) 
    hTxt = uicontrol('Style','text', 'Position',[290 28 20 15], 'String','0');

    %# show image
    imshow(I, 'Parent',hAx)

    %# Callback function
    function slider_callback(hObj, eventdata)
        angle = round(get(hObj,'Value'));        %# get rotation angle in degrees
        imshow(imrotate(I,angle), 'Parent',hAx)  %# rotate image
        set(hTxt, 'String',num2str(angle))       %# update text
    end
end

введите здесь описание изображения


Если вы предпочитаете создавать графический интерфейс в GUIDE, выполните следующие действия:

  • создать графический интерфейс и добавить необходимые компоненты: ось, ползунок, статический текст (перетаскивание)

  • Используя «Инспектор свойств», измените свойства ползунка по мере необходимости:: Min/Max/Value/SliderStep. Также поможет, если вы назначите Tag, чтобы иметь возможность находить компоненты в коде.

  • В функции xxxx_OpeningFcn на рисунке прочитайте и сохраните изображение в структуре handles, затем покажите его:

    handles.I = imread('cameraman.tif');
    imshow(I, 'Parent',findobj(hObject,'Tag','imgAxis'))  %# use tag you assigned
    guidata(hObject, handles);         %# Update handles structure
  • Создайте обработчик событий обратного вызова для вашего слайдера и добавьте код:
    angle = round( get(hObject,'Value') );
    imshow( imrotate(handles.I,angle) )

РЕДАКТИРОВАТЬ: поворот изображения — это аффинное преобразование, которое сопоставляет положение (x, y) пикселей входного изображения с новыми координатами (x2, y2) для выходного изображения. Проблема в том, что выходные координаты не всегда могут быть целыми числами. Поскольку цифровые изображения представлены в виде сетки дискретных пикселей, используется некоторая форма передискретизации/интерполяции (именно поэтому прямые линии могут выглядеть зубчатыми при повороте на определенные углы).

введите здесь описание изображения

(Иллюстрация взята из: Общие сведения об интерполяции цифровых изображений)

person Amro    schedule 02.07.2011
comment
спасибо за ваш ответ, но я создаю свой графический интерфейс, используя GUIDE. Можете ли вы дать мне объяснение, как это сделать в этом режиме. - person Ofir A.; 02.07.2011
comment
@Michael: я добавил объяснение, как воссоздать это в GUIDE. - person Amro; 02.07.2011
comment
еще раз спасибо. не могли бы вы объяснить мне, почему мое изображение искажается, когда я его поворачиваю? Я не могу его нормально повернуть? - person Ofir A.; 02.07.2011
comment
@Michael: я не уверен, что вы подразумеваете под искажением, но убедитесь, что вы прочитали документацию по функциям IMROTATE и IMSHOW и поняли, как работают пространственные преобразования ... - person Amro; 02.07.2011
comment
@Michael: отредактировал мой ответ, чтобы ответить на ваш вопрос. Еще раз напоминаю вам прочитать документацию IMROTATE, особенно опция «алгоритм», которая позволяет вам указать, какой метод интерполяции использовать (ближайший сосед, билинейная интерполяция, ...) - person Amro; 02.07.2011