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

61 Ansichten (letzte 30 Tage)
萌香
萌香 am 14 Jun. 2022
Kommentiert: 萌香 am 16 Jun. 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

Akzeptierte Antwort

Kojiro Saito
Kojiro Saito am 14 Jun. 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 Kommentare
Kojiro Saito
Kojiro Saito am 15 Jun. 2022
Bearbeitet: Kojiro Saito am 15 Jun. 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
萌香
萌香 am 16 Jun. 2022
ありがとうございます。たくさん質問してしまい申し訳ありません。
とても助かりました。
初心者なのでコメントアウトでのご説明も多くてありがたい限りです。
教えていただいたコードを使ってやってみます。
本当にありがとうございました。

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

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

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu イメージ finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!