В этом примере показано, как повернуть изображение с помощью Rectangle ROI с функцией обратного вызова, вызывающей imrotate при перемещении окупаемости инвестиций.
Поворот изображения является обычным этапом предварительной обработки. В этом примере изображение необходимо повернуть на неизвестную величину, чтобы выровнять горизонт по оси X. Вы можете использовать imrotate функция для поворота изображения, но необходимо предварительно знать угол поворота. Используя интерактивный вращаемый ROI, можно поворачивать изображение в реальном времени, чтобы соответствовать повороту ROI.
Отображение изображения в осях.
im = imread('baby.jpg');
hIm = imshow(im);

Получение размера изображения.
sz = size(im);
Определите положение и размер Rectangle ROI как 4-элементный вектор вида [x y w h]. ROI будет нарисован в центре изображения и будет иметь половину ширины и высоты изображения.
pos = [(sz(2)/4) + 0.5, (sz(1)/4) + 0.5, sz(2)/2, sz(1)/2];
Создайте Rectangle ROI с возможностью поворота в указанном положении и задайте для свойства Rectable значение 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 в функции обратного вызоваОпределите функцию обратного вызова, которая выполняется при перемещении Rectangle 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

addlistener | drawrectangle | imrotate | Rectangle