画像の切り出しとその方法

43 ビュー (過去 30 日間)
Takanori Aihara
Takanori Aihara 2020 年 12 月 10 日
コメント済み: NAOAKI MIYAMOTO 2022 年 5 月 12 日
画像の四角形トリミング範囲n×mを任意で決め,
且つ原画像の任意の範囲を画像を確認しながら決められる方法は何かありますか?
イメージとしては,原画像上にトリミング範囲の四角形が表示され,lそれをドラッグで動かす感じです.
よろしくお願いします.

採用された回答

Shunichi Kusano
Shunichi Kusano 2020 年 12 月 10 日
こんにちは。drawrectangle関数で、画像に四角形を描画できますが、その際に初期値を決めておけばそのサイズの四角形を描画させることができ、かつ描画したオブジェクトはマウスで動かすことができます。動かした後、オブジェクトのハンドルを見ると、動かした先のPositionを得ることができます。下記がサンプルコードとなります。
img = imread('peppers.png'); % 画像の読み込み
imshow(img) % 表示
h = drawrectangle('Position',[1 1 100 50]); % (1,1)を左上座標とした幅100,高さ50の領域生成
% この状態で、四角をマウスでぐりぐり動かして、切り抜きたい範囲にあわせてください
roi = h.Position;
imgCrop = imcrop(img,roi); % 切り抜き
注意点として、上の例ですと切り抜かれた画像サイズは51x101(x3)になっています。気持ち悪いですね。詳細はimcrop関数のdocumentをご覧いただきたいのですが、こういう仕様になっています。ですので、切り抜き後のサイズをかっちり決めたいのであれば、その値-1をdrawrectangleで指定してあげてください(上記の例なら[1 1 99 49])。
  8 件のコメント
Shunichi Kusano
Shunichi Kusano 2022 年 5 月 12 日
次のコマンドを適当なスクリプトファイルに保存して実行してみてください。枠の面積がリアルタイムには変わらないのですが、枠の右端をドラッグして幅を変えるとドロップ後に高さが、下端で高さを変えると幅が変わるはずです。枠の右下角をドラッグアンドドロップした場合は普通に面積が変わります。
仕組みとしてはイベントリスナーを使っています。ROIが変更された際にmyCallbk関数が実行されます。myCallbkの中では、イベント前後の変化から幅が変わったのか高さが変わったのかを検知して、変わってない方は面積一定になるように調整される仕組みです。
img = imread('pout.tif');
imshow(img)
h = drawrectangle('Position',[1 1 100 100]);
l = addlistener(h,'ROIMoved',@myCallbk);
function myCallbk(s,evtData)
h = evtData.Source;
pp = evtData.PreviousPosition;
area = pp(3) * pp(4);
cp = evtData.CurrentPosition;
if abs(pp(4) - cp(4))<1e-1 % 幅の変更
disp('width change')
width = cp(3);
height = area / width;
elseif abs(pp(3) - cp(3))<1e-1 % 高さの変更
disp('height change')
height = cp(4);
width = area / height;
else % 両方
disp('area change')
width = cp(3);
height = cp(4);
end
h.Position = [cp(1:2) width height];
end
NAOAKI MIYAMOTO
NAOAKI MIYAMOTO 2022 年 5 月 12 日
ご対応ありがとうございます。
やりたいことができるようになりました!

サインインしてコメントする。

その他の回答 (0 件)

製品


リリース

R2020a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!