フォルダから画像を順に読み取り処理する方法

83 visualizzazioni (ultimi 30 giorni)
萌香
萌香 il 14 Giu 2022
Commentato: 萌香 il 16 Giu 2022
画像が複数枚入っているフォルダを読み込み、順に処理を行って保存したいです。
下記のようなコードを書いているのですが、画像が全く表示されません。
エラーメッセージも出ないため、どこが間違っているのか特定できずにいます。
お力を貸していただけないでしょうか。
im_list=dir("フォルダ名")
file_name={im_list.name};
for i=3:size(file_name,1)
I=imread(file_name{1})
imshow(I)
I2=rgb2gray(I);
BW=I2<75;
imshow(BW)
saveas(fig,file_name{1}.pdf)
end

Risposta accettata

Kojiro Saito
Kojiro Saito il 14 Giu 2022
画像が表示されない理由は、size(file_name, 1) が1のため、for文の中が実行されていないためです。
file_name は1行 ✕ (画像の枚数+2)列 の変数になっています。+2は「.」と「..」です。
画像枚数分だけ処理するので、size(file_name, 2)にする必要があります。
また「.」と「..」も取り除いてしまったほうが処理が楽です。
以下のように変更してみてください。
foldername = "フォルダ名";
im_list=dir(foldername);
file_name={im_list.name};
file_name = file_name(~ismember(file_name, {'.', '..'})); %「.」と「..」を除去
for n=1:size(file_name, 2)
I=imread(fullfile(foldername, file_name{n}));
imshow(I)
I2=rgb2gray(I);
BW=I2<75;
imshow(BW)
saveas(gcf, [file_name{n} '.pdf'])
end
  4 Commenti
Kojiro Saito
Kojiro Saito il 15 Giu 2022
Modificato: Kojiro Saito il 15 Giu 2022
for文での処理内容を1つのpdfにまとめて保存するのは、tiledlayoutsubplotを使ったやり方でできます。
tiledlayoutの例
for n=1:size(file_name, 2)
I=imread(fullfile(foldername, file_name{n}));
tiledlayout(2, 1); % 2行1列で画像を並べたい場合
%tiledlayout(1, 2); % 1行2列で画像を並べたい場合
nexttile;
imshow(I)
I2=rgb2gray(I);
BW=I2<75;
nexttile;
imshow(BW)
saveas(gcf, [file_name{n} '.pdf'])
%exportgraphics(gcf, [file_name{n} '.pdf'])
end
余白を少なくする場合は、コメントアウトしているexportgraphicsを使ったほうが良いです。
imageDatastoreを使った書き方やimtileで隙間なく横に並べる方法はこんな感じです。お好みで色んな書き方ができます。
imds = imageDatastore('フォルダ名');
while hasdata(imds)
[I, info]=read(imds);
filename = split(info.Filename, filesep);
filename = filename{end};
%imshow(I)
I2=rgb2gray(I);
BW=I2<75;
%imshow(BW)
imt = imtile({I, BW});
figure;imshow(imt)
exportgraphics(gcf, [filename '.pdf'])
%saveas(gcf, [filename '.pdf'])
end
萌香
萌香 il 16 Giu 2022
ありがとうございます。たくさん質問してしまい申し訳ありません。
とても助かりました。
初心者なのでコメントアウトでのご説明も多くてありがたい限りです。
教えていただいたコードを使ってやってみます。
本当にありがとうございました。

Accedi per commentare.

Più risposte (1)

Shunichi Kusano
Shunichi Kusano il 15 Giu 2022
Modificato: Shunichi Kusano il 15 Giu 2022
imageDatastore使うともっと簡単に書けてしまいます。おススメです。
imds = imageDatastore("フォルダ名");
while hasdata(imds)
[I,info] = read(imds);
% 処理を入れる
end
  1 Commento
萌香
萌香 il 15 Giu 2022
Modificato: 萌香 il 15 Giu 2022
ありがとうございます!
とてもシンプルになりびっくりしています。
使わせていただきます。
すみません、追加で質問なのですが、for文での処理内容を1つのpdfにまとめて保存することは可能ですか?上記だとIとBWを保存するようなイメージです。

Accedi per commentare.

Categorie

Scopri di più su Convert Image Type in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!