for分を使用して複数の画像を処理する方法について
    9 次查看(过去 30 天)
  
       显示 更早的评论
    
こんにちは。
画像を射影変換するところなのですが、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
采纳的回答
  Atsushi Ohashi
    
 2021-2-22
        保存するファイル名を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);
0 个评论
更多回答(0 个)
另请参阅
类别
				在 Help Center 和 File Exchange 中查找有关 大規模なイメージ ファイル 的更多信息
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!