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

75 次查看(过去 30 天)
萌香
萌香 2022-6-14
评论: 萌香 2022-6-16
画像が複数枚入っているフォルダを読み込み、順に処理を行って保存したいです。
下記のようなコードを書いているのですが、画像が全く表示されません。
エラーメッセージも出ないため、どこが間違っているのか特定できずにいます。
お力を貸していただけないでしょうか。
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

采纳的回答

Kojiro Saito
Kojiro Saito 2022-6-14
画像が表示されない理由は、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 个评论
Kojiro Saito
Kojiro Saito 2022-6-15
编辑:Kojiro Saito 2022-6-15
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
萌香
萌香 2022-6-16
ありがとうございます。たくさん質問してしまい申し訳ありません。
とても助かりました。
初心者なのでコメントアウトでのご説明も多くてありがたい限りです。
教えていただいたコードを使ってやってみます。
本当にありがとうございました。

请先登录,再进行评论。

更多回答(1 个)

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

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 イメージ 的更多信息

Community Treasure Hunt

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

Start Hunting!