MATLAB Answers

for分を使用して複​数の画像を処理する方​法について

30 views (last 30 days)
こんにちは。
画像を射影変換するところなのですが、1つのファイルから複数の画像を読み取り、処理しようと試みました。
以下のコードで実行したのですが、2枚しか処理されません。手動で一枚だけ読み取れば射影変換のところは動くのですが、、、
やりたいこととしては、下記コードのI=imread(b{i});で読み取った画像全てを射影変換し、ファイル(face)に全て格納したいです。
何かアドバイス等いただけると幸いです。よろしくお願いいたします。
clc;clear;
rootfolder = fullfile('C:\Users\*** Lab\Desktop\MATLAB\フリー素材');
%%
j = dir('*.jpg');
a=struct2table(j);
b=a.name;
%%
for i=1:size(b,1)
I=imread(b{i});
mkdir('face'); %新しいフォルダを作成する
oldFolder = cd('face');
for theta = -5:5%回転角11
for s=-2:2%水平奥行10
for c=-2:2%上下5
for size=7:8%圧縮2
o=0;o=o+1;
tm = projective2d([cosd(theta*2) -sind(theta*2) 0.0002*s; ...
sind(theta*2) cosd(theta*2) 0.0002*c; ...
0 0 1]);
outputImage = imwarp(I,tm);%44*10*5=2200
outputImage2 = imresize(outputImage,0.1*size);%2200*2=4400
imwrite(outputImage,(sprintf('Oimg%d.png',o)));%2200
imwrite(outputImage2,(sprintf('ORSimg%d.png',o)));%2200
end
end
end
end
cd(oldFolder);
end
  1 Comment
Yasutake Haramiishi
Yasutake Haramiishi on 23 Feb 2021
ご回答ありがとうございます。
おかげさまで上手くfor分が動きました。
助かりました、ありがとうございました。

Sign in to comment.

Accepted Answer

Atsushi Ohashi
Atsushi Ohashi on 22 Feb 2021
保存するファイル名をfor文の中で”o”をインクリメントされていますが、for文の中で毎回"o"をゼロで初期化しているため、同じファイル名に上書きしていると思います。ファイル名を一意にするよう修正をご検討ください。
for size=7:8%圧縮2
o=0;o=o+1; ← 毎回ゼロで初期化
また、気になった点として、for文の変数名にsizeを使わていますが、これは関数のsizeと同じになります。できれば関数名と重複しないような変数名を利用いただくことをお勧めするのと、mkdirがfor文内で利用されていますが、この場合、何度もフォルダを作成しようとし、警告が発生しますので、フォルダは最初に一回作成するのが良いと思います。
下記に簡単ですが、修正案を記載しました。実際の動作確認はしていただければと思います。
今回のご質問に関連して、imageDatastoreという関数が便利に使えると思いますので、下記をご参照ください。
mkdir('face'); %新しいフォルダを作成する
oldFolder = cd('face');
o = 0;
for i=1:size(b,1)
I = imread(b{i});
for theta = -5:5%回転角11
for s=-2:2%水平奥行10
for c=-2:2%上下5
for r=7:8%圧縮2
o=o+1;
tm = projective2d([cosd(theta*2) -sind(theta*2) 0.0002*s; ...
sind(theta*2) cosd(theta*2) 0.0002*c; ...
0 0 1]);
outputImage = imwarp(I,tm);%44*10*5=2200
outputImage2 = imresize(outputImage,0.1*r);%2200*2=4400
imwrite(outputImage,(sprintf('Oimg%d.png',o)));%2200
imwrite(outputImage2,(sprintf('ORSimg%d.png',o)));%2200
end
end
end
end
end
cd(oldFolder);

More Answers (0)

Community Treasure Hunt

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

Start Hunting!