for loopで計算処理を​連番のフォルダに対し​て適応したい.連番の​フォルダの変更方法

11 views (last 30 days)
Takumi Enomoto
Takumi Enomoto on 29 Dec 2022
Commented: Takumi Enomoto on 3 Jan 2023
1~100の連番のフォルダに格納された1~20のjpgの連番のファイルを結合させようとしています。
現在開いているフォルダに対しては連番の画像の連結をすることができたのですが、1のフォルダから次の連番のフォルダを開いて、for loopで上記の処理をする事ができません。ご教授いただけないでしょうか。
for i=1:100
%以下画像結合の計算処理
jpegFiles = dir('*.jpg');
numfiles = length(jpegFiles);
mydata = cell(1, 20);
for k = 1:20
mydata{k} = imread(jpegFiles(k).name,"jpg");
end
fig=imtile(mydata)
fig2=imresize(fig,[200 250])
imshow(fig2)
imwrite(fig2,['保存先のパス',num2str(k),'.jpg']);
end

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 30 Dec 2022
>1のフォルダから次の連番のフォルダを開いて、for loopで上記の処理をする
imageDatastore を用いて下記を実行しています。
  • 選択フォルダ以下の全画像を含めた imageDatastore を作成
  • (サブフォルダを含める。所定形式(JPEG)の画像のみ。画像を含むフォルダ名をラベルに設定)
  • for文でサブフォルダ数だけ下記の処理を繰り返す
  • 元の imageDatastore から現サブフォルダ内の画像だけを読み込む
  • 上記をタイル状に並べ・リサイズ・figure に表示、また画像ファイルに保存する
selPath = uigetdir(pwd);
imds = imageDatastore(selPath,"IncludeSubfolders",true,"FileExtensions",".jpg","LabelSource","foldernames");
for k = categories(imds.Labels)' % サブフォルダ数だけ繰り返す
indices = imds.Labels == k{:}; % imageDatastoreから現サブフォルダ分のindexを得る
subimds = subset(imds,indices); % imageDatastoreから現サブフォルダ分だけ抜き出す
fig = imtile(subimds.readall()); % 抜き出したSubimageDatastoreの全画像を読み込む
fig2 = imresize(fig,[200 250]);
imshow(fig2);
imwrite(fig2,[imds.Folders{1},filesep,k{1},'.jpg']);
end
  1 Comment
Takumi Enomoto
Takumi Enomoto on 3 Jan 2023
実行することができました!
面倒と仰っていた㏅でフォルダを開くことばかり考えておりました。
ありがとうございました!

Sign in to comment.

More Answers (1)

Atsushi Ueno
Atsushi Ueno on 29 Dec 2022
Edited: Atsushi Ueno on 29 Dec 2022
「現在開いているフォルダに対する処理」を複数のフォルダに対して実行していくには、 cd でフォルダを移動する必要が出てきて面倒です。その点、絶対パスを取り扱えばフォルダ移動が不要になります。
(追記):2000ファイルが100個のフォルダに20枚ずつ格納されている事と、各フォルダの画像20枚ずつをタイル状に並べた画像を保存する必要がある事に気付き、その点修正しました。
selPath = uigetdir(pwd); % フォルダを選択
allFiles = dir(fullfile(selPath,'*','*.jpg')); % 選択フォルダ内のフォルダに格納されたjpgファイルが対象
mygroups = groupsummary(struct2table(allFiles),'folder'); % フォルダ数とJPEGファイル数を得る
for i = 1:size(mygroups,1) % フォルダの数だけ繰り返す
%以下画像結合の計算処理
jpegFiles = dir(fullfile(mygroups.folder{i},'*.jpg')); % 各フォルダ内のJPEGファイル情報を取得し直す
numfiles = mygroups.GroupCount(i); % length(jpegFiles); どっちも同じ
mydata = cell(1,mygroups.GroupCount(i));
for k = 1:numfiles % ファイルの数だけ繰り返す
mydata{k} = imread(fullfile(jpegFiles(k).folder,jpegFiles(k).name));
end
fig = imtile(mydata); % タイル状にサムネイルを表示
fig2 = imresize(fig,[200 250]);
imshow(fig2);
imwrite(fig2,['保存先のパス',num2str(k),'.jpg']);
end
  1 Comment
Atsushi Ueno
Atsushi Ueno on 29 Dec 2022
パス上のフォルダーとサブフォルダーを再帰的に検索するには、パス名にワイルドカードを使用します。たとえば、dir */*.txt は現在のフォルダーの 1 つ下のフォルダーにある、拡張子が txt のファイルをすべてリストし、dir **/*.txt は現在のフォルダーまたはそれより下のフォルダーにある、拡張子が txt のファイルをすべてリストします。** ワイルドカードの次の文字は、ファイル区切りでなければなりません。

Sign in to comment.

Products

Community Treasure Hunt

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

Start Hunting!