Вращайте изображение в интерактивном режиме Используя прямоугольный ROI

В этом примере показано, как вращать изображение при помощи Прямоугольного ROI с функцией обратного вызова, которая вызывает imrotate когда вы перемещаете ROI.

Поворот изображения является общим шагом предварительной обработки. В этом примере изображение должно вращаться неизвестной суммой, чтобы выровнять горизонт с осью X. Можно использовать imrotate функция, чтобы вращать изображение, но вам нужны предварительные знания угла поворота. При помощи интерактивного поворотного ROI можно вращать изображение в режиме реального времени, чтобы совпадать с вращением ROI.

Создайте поворотный прямоугольный ROI

Отобразите изображение в Оси.

im = imread('baby.jpg');
hIm = imshow(im);

Получите размер изображения.

sz = size(im);

Определите положение и размер Прямоугольного ROI как вектор с 4 элементами из формы [x y w h]. ROI будет чертиться в центре изображения и иметь половину ширины изображения и высоты.

pos = [(sz(2)/4) + 0.5, (sz(1)/4) + 0.5, sz(2)/2, sz(1)/2];

Создайте поворотный Прямоугольный ROI в заданном положении и установите свойство Rotatable на true. Можно затем вращать прямоугольник путем перетаскивания около углов. Когда ROI перемещается, он широковещательно передает событие MovingROI. Путем добавления прослушивателя для того события и функции обратного вызова, которая выполняется, когда событие имеет место, можно вращать изображение в ответ на перемещения ROI.

h = drawrectangle('Rotatable',true,...
    'DrawingArea','unlimited',...
    'Position',pos,...
    'FaceAlpha',0);

Поместите подсказку в метку.

h.Label = 'Rotate rectangle to rotate image';

Добавьте прослушиватель, который прислушивается к любому перемещению ROI.

addlistener(h,'MovingROI',@(src,evt) rotateImage(src,evt,hIm,im));

Вызовите imrotate в функции обратного вызова

Задайте функцию обратного вызова, которая выполняется, когда Прямоугольный ROI перемещается. Эта функция получает текущий угол поворота ROI, imrotate вызовов на изображении с тем углом поворота и обновлениях отображение. Функция также обновляет метку, чтобы отобразить текущий угол поворота.

function rotateImage(src,evt,hIm,im)

% Only rotate the image when the ROI is rotated. Determine if the
% RotationAngle has changed
if evt.PreviousRotationAngle ~= evt.CurrentRotationAngle

    % Update the label to display current rotation
    src.Label = [num2str(evt.CurrentRotationAngle,'%30.1f') ' degrees'];

    % Rotate the image and update the display
    im = imrotate(im,evt.CurrentRotationAngle,'nearest','crop');
    hIm.CData = im;

end

end

Смотрите также

| | |

Похожие темы