использование слайдера для поворота изображения в Matlab - PullRequest
2 голосов
/ 01 июля 2011

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

enter image description here

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

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

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

РЕДАКТИРОВАТЬ: Я создаю приложение OCR. вот так выглядит табличка, когда я ее вращаю, цифры полностью искажены.

enter image description here

спасибо.

1 Ответ

7 голосов
/ 02 июля 2011

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

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

enter image description here


Если вы предпочитаете создавать GUI в 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) )

EDIT: Поворот изображения - это аффинное преобразование, которое отображает положение (x, y) пикселей входного изображения на новые координаты (x2, y2) для выходного изображения. Проблема в том, что выходные координаты не всегда могут быть целыми числами. Поскольку цифровые изображения представлены в виде сетки дискретных пикселей, поэтому используется некоторая форма передискретизации / интерполяции (именно поэтому прямые линии могут выглядеть неровными при повороте на определенные углы).

enter image description here

(Иллюстрация заимствована у: Понимание цифровой интерполяции изображений )

...