[IMG_0100_1.tif,IMG_0100_2.tif,IMG_0100_3.tif,IMG_0100_4.tif,IMG_0100_5.tif,IMG_0110_1.tif,IMG_0110_2.tif,IMG_0110_3.tif,IMG_0110_4.tif,IMG_0110_5.tif ............]
といった末尾の数字に規則性があるファイル名を持つファイルがあるとき,末尾が2,3,4であるファイルだけを連続して読み込むにはどうすればよいでしょうか.
このような感じで...
[IMG_0100_2.tif,IMG_0100_3.tif,IMG_0100_4.tif,IMG_0110_2.tif,IMG_0110_3.tif,IMG_0110_4.tif, ............]

 Réponse acceptée

Akira Agata
Akira Agata le 20 Nov 2019

4 votes

あるいは、ファイルが大量にあるようでしたら以下の方法ではいかがでしょうか。
% カレントフォルダにある .tifファイル一覧を作成
s = dir('*.tif');
s = struct2table(s);
% 末尾が _2.tif ~ _4.tif のみを抽出
idx = endsWith(s.name,{'_2.tif','_3.tif','_4.tif'});
s = s(idx,:);
for kk = 1:height(s)
filePath = fullfile(s.folder{kk},s.name{kk});
%
% Read the file and do something
%
end

3 commentaires

Kouki
Kouki le 21 Nov 2019
Modifié(e) : Kouki le 21 Nov 2019
回答ありがとうございます。
このような感じでimreadを使って画像を読み込めた?と思うのですが、この後に
IMG_0100_2.tif,IMG_0100_3.tif,IMG_0100_4.tifの3つの画像を合成
IMG_0101_2.tif,IMG_0101_3.tif,IMG_0101_4.tifの3つの画像を合成
IMG_0102_2.tif,IMG_0102_3.tif,IMG_0102_4.tifの3つの画像を合成
.
.
.
IMG_0110_2.tif,IMG_0110_3.tif,IMG_0110_4.tifの3つの画像を合成
といったように3つの画像を合成して1つの画像にする処理を行いたいのですが、可能でしょうか。
(imfuseを用いると1度に3つを合成できず…)
質問が多くなってしまいすみません。
clear;clc
% カレントフォルダにある .tifファイル一覧を作成
s = dir('*.tif');
s = struct2table(s);
% 末尾が _2.tif ~ _4.tif のみを抽出
idx = endsWith(s.name,{'_2.tif','_3.tif','_4.tif'});
s = s(idx,:);
I=cell(1,height(s));
for kk = 1:height(s)
filePath = fullfile(s.folder{kk},s.name{kk});
% Read the file
I{kk}=imread(fullfile(s.folder{kk},s.name{kk}));
end
Akira Agata
Akira Agata le 22 Nov 2019
.tifファイルはすべてカラー画像で、各 IMG_xxxx に対して必ず _2.tif, _3.tif, _4.tif の3枚の画像が存在すると想定すると、たとえば下記のようになるかと思います。
s = dir('*.tif');
s = struct2table(s);
idx = endsWith(s.name,{'_2.tif','_3.tif','_4.tif'});
s = s(idx,:);
group = extractBetween(s.name,'_','_');
[s.group, uGroup] = findgroups(group);
for kk = 1:max(s.group)
pt = find(s.group == kk);
% Read 3 images for each group
I1 = imread(fullfile(s.folder{pt(1)},s.name{pt(1)}));
I2 = imread(fullfile(s.folder{pt(2)},s.name{pt(2)}));
I3 = imread(fullfile(s.folder{pt(3)},s.name{pt(3)}));
% Convert RGB to gray-scale
I1gray = rgb2gray(I1);
I2gray = rgb2gray(I2);
I3gray = rgb2gray(I3);
% Compsit of 3 images
Iall = cat(3,I1gray,I2gray,I3gray);
% Save as 'IMG_xxxx_all.tif'
fileName = ['IMG_',uGroup{kk},'_all.tif'];
imwrite(Iall,fileName);
end
Kouki
Kouki le 22 Nov 2019
何度もすみません、とても参考になりました。
ありがとうございます。

Connectez-vous pour commenter.

Plus de réponses (1)

Kazuya
Kazuya le 20 Nov 2019
Modifié(e) : Kazuya le 20 Nov 2019

2 votes

一案ですが、ファイルのリストを string 型で作って contains を使えば、該当するファイル名だけのリストを作れるので、それを for ループで回せば良いかと思いました。
例:
filelist = ["IMG_0100_1.tif","IMG_0100_2.tif","IMG_0100_3.tif","IMG_0100_4.tif","IMG_0100_5.tif",...
"IMG_0110_1.tif","IMG_0110_2.tif","IMG_0110_3.tif","IMG_0110_4.tif","IMG_0110_5.tif"]';
idx = contains(filelist,["_2.tif","_3.tif","_4.tif"]);
filelist234 = filelist(idx)
末尾に 2,3,4 を含むファイル名だけが filelist234 に残ります。
filelist234 =
6×1 string 配列
"IMG_0100_2.tif"
"IMG_0100_3.tif"
"IMG_0100_4.tif"
"IMG_0110_2.tif"
"IMG_0110_3.tif"
"IMG_0110_4.tif"
おおもとの filelist は以下で作れると思います。
listing = ls('*.tif');
filelist = string(listing);

1 commentaire

Kouki
Kouki le 21 Nov 2019
ありがとうございます。 参考にさせていただきます。。

Connectez-vous pour commenter.

Catégories

En savoir plus sur データのインポートと解析 dans Centre d'aide et File Exchange

Community Treasure Hunt

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

Start Hunting!