В этом примере показано, как вращать изображение при помощи Прямоугольного ROI с функцией обратного вызова, которая вызывает imrotate
когда вы перемещаете ROI.
Поворот изображения является общим шагом предварительной обработки. В этом примере изображение должно вращаться неизвестной суммой, чтобы выровнять горизонт с осью X. Можно использовать imrotate
функция, чтобы вращать изображение, но вам нужны предварительные знания угла поворота. При помощи интерактивного поворотного 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
drawrectangle
| Rectangle
| imrotate
| addlistener