四角形 ROI を使用したイメージの対話的な回転
この例では、ROI の移動時に imrotate
を呼び出すコールバック関数を含む四角形 ROI を使用してイメージを回転する方法を説明します。
イメージの回転は一般的な前処理手順です。この例では、水平線と x 軸を合わせるためにイメージを未知の量だけ回転させる必要があります。関数 imrotate
を使用してイメージを回転できますが、事前に回転角度を知っておく必要があります。対話的に回転可能な ROI を使用することにより、ROI の回転と一致するようイメージをリアルタイムに回転させることができます。
回転可能な四角形 ROI の作成
座標軸にイメージを表示します。
im = imread('baby.jpg');
hIm = imshow(im);
イメージのサイズを取得します。
sz = size(im);
四角形 ROI の位置とサイズを [x y w h] 形式の 4 要素ベクトルとして指定します。イメージの半分の幅と高さの 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