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

78 visualizaciones (últimos 30 días)
萌香
萌香 el 14 de Jun. de 2022
Comentada: 萌香 el 16 de Jun. de 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

Respuesta aceptada

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

Iniciar sesión para comentar.

Más respuestas (1)

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

Iniciar sesión para comentar.

Categorías

Más información sobre イメージ en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!