画像の切り取りについて

現在、画像を切り出して輝度値を求めるプログラムの作成を行っています。 手法としては、ある一定の高さで横に1pixelずつ平行移動して、1枚の大きな画像から複数の画像を得ることを目標にしております。 この時どの関数を用いるのが最適でしょうか。 ご教示願います。

 Accepted Answer

Tohru Kikawada
Tohru Kikawada on 4 Oct 2018

3 votes

スライディングウィンドウで切り出すような処理と理解しました。
その場合にはImage Processing Toolboxの nlfilter 関数がお使いいただけるかもしれません。
切り出した画像に適用する関数を引数として渡してあげることができます。

5 Comments

Taiki Murakawa
Taiki Murakawa on 5 Oct 2018
回答ありがとうございます。 スライディングウィンドウ、nlfilter関数について調べてみましたが、いまいちよく分からないです。
質問の補足ですが、画像の切り取りは以下の形で行われます。 元の画像(960*1280)から一定の大きさ(30*30)を高さは一定で横に1pixelずつ移動させ、1250枚の画像を取得するといった形式です。 この場合でもnlfilter 関数は有効でしょうか。
Tohru Kikawada
Tohru Kikawada on 10 Oct 2018
Edited: Tohru Kikawada on 11 Oct 2018
nlfilter ですとファイル名の生成などに persistent を使う必要があるなど、ちょっと見通しが悪そうです。簡単なスクリプトで実装した例を紹介します。
ご参考になれば幸いです。
%%1280x960の画像準備
I = imread('peppers.png');
I = imresize(I,[960 1280]);
%%切り出す画像サイズと高さ
box_width = 30;
box_height = 30;
box_y = 480;
%%バウンディングボックスの生成
bboxes = zeros(1280-box_width,4);
bboxes(:,3) = box_width-1;
bboxes(:,4) = box_height-1;
bboxes(:,1) = (1:(1280-box_width));
bboxes(:,2) = box_y;
bboxes_cell = mat2cell(bboxes,ones(1250,1));
%%切り出しと保存
fun = @(x) imwrite(imcrop(I,x),['image_' num2str(x(1),'%04d') '.png']);
cellfun(fun,bboxes_cell);
Taiki Murakawa
Taiki Murakawa on 11 Oct 2018
例を提示していただきありがとうございます。 実際に試してみたのですが、バウンディングボックスの生成の最終行でエラーが発生します。以下に示します。
エラー: mat2cell (line 89) 入力引数 D1 から D2 は、合計するとそれぞれの入力行列のサイズの次元 [1251 4] にならなければなりません。
ドキュメントよりエラーの意味は分かったのですが、bboxes_cell = mat2cell(bboxes,ones(1250,1));で1250行1列の行列の切り出しを行っている理由がよくわかりません。 お時間がございましたら、教えていただけますでしょうか。
Tohru Kikawada
Tohru Kikawada on 11 Oct 2018
失礼しました。誤ったコード貼り付けていたので、修正させていただきました。 mat2cell の部分は行列を 1 x 4 づつセル配列に切り出している処理になります。 ご参考まで。
Taiki Murakawa
Taiki Murakawa on 15 Oct 2018
無事に切り取ることができました。 ご教示ありがとうございました。

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!