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

조회 수: 7 (최근 30일)
Takumi Enomoto
Takumi Enomoto 2022년 12월 29일
댓글: Takumi Enomoto 2023년 1월 3일
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

채택된 답변

Atsushi Ueno
Atsushi Ueno 2022년 12월 30일
>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
Takumi Enomoto
Takumi Enomoto 2023년 1월 3일
実行することができました!
面倒と仰っていた㏅でフォルダを開くことばかり考えておりました。
ありがとうございました!

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Atsushi Ueno
Atsushi Ueno 2022년 12월 29일
편집: Atsushi Ueno 2022년 12월 29일
「現在開いているフォルダに対する処理」を複数のフォルダに対して実行していくには、 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
Atsushi Ueno
Atsushi Ueno 2022년 12월 29일
パス上のフォルダーとサブフォルダーを再帰的に検索するには、パス名にワイルドカードを使用します。たとえば、dir */*.txt は現在のフォルダーの 1 つ下のフォルダーにある、拡張子が txt のファイルをすべてリストし、dir **/*.txt は現在のフォルダーまたはそれより下のフォルダーにある、拡張子が txt のファイルをすべてリストします。** ワイルドカードの次の文字は、ファイル区切りでなければなりません。

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 ファイルの操作에 대해 자세히 알아보기

제품

Community Treasure Hunt

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

Start Hunting!