フォルダから画像を順に読み取り処理する方法
78 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
萌香
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
0 comentarios
Respuesta aceptada
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
el 15 de Jun. de 2022
Editada: Kojiro Saito
el 15 de Jun. de 2022
for文での処理内容を1つのpdfにまとめて保存するのは、tiledlayoutやsubplotを使ったやり方でできます。
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
Más respuestas (1)
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
Ver también
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!