- 選択フォルダ以下の全画像を含めた imageDatastore を作成
- (サブフォルダを含める。所定形式(JPEG)の画像のみ。画像を含むフォルダ名をラベルに設定)
- for文でサブフォルダ数だけ下記の処理を繰り返す
- 元の imageDatastore から現サブフォルダ内の画像だけを読み込む
- 上記をタイル状に並べ・リサイズ・figure に表示、また画像ファイルに保存する
for loopで計算処理を連番のフォルダに対して適応したい.連番のフォルダの変更方法
3 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
Takumi Enomoto
il 29 Dic 2022
Commentato: Takumi Enomoto
il 3 Gen 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
0 Commenti
Risposta accettata
Atsushi Ueno
il 30 Dic 2022
>1のフォルダから次の連番のフォルダを開いて、for loopで上記の処理をする
imageDatastore を用いて下記を実行しています。
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
Più risposte (1)
Atsushi Ueno
il 29 Dic 2022
Modificato: Atsushi Ueno
il 29 Dic 2022
(追記):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 Commento
Atsushi Ueno
il 29 Dic 2022
パス上のフォルダーとサブフォルダーを再帰的に検索するには、パス名にワイルドカードを使用します。たとえば、dir */*.txt は現在のフォルダーの 1 つ下のフォルダーにある、拡張子が txt のファイルをすべてリストし、dir **/*.txt は現在のフォルダーまたはそれより下のフォルダーにある、拡張子が txt のファイルをすべてリストします。** ワイルドカードの次の文字は、ファイル区切りでなければなりません。
Vedere anche
Prodotti
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!