MATLAB Answers

ディレクトリの下の階​層も全て含めてmat​labに読み込ませる​には?

63 views (last 30 days)
ssk
ssk on 1 Feb 2019
Commented: ssk on 2 Feb 2019
プログラミング初心者です。
matlabで画像処理を行なおうと思っており、ディレクトリを(画像等が入っている)下の階層含め、すべて読み込ませようと思ったのですが、どうやらうまくいっていないようです。
.mファイルのみ読み取ることができて、matlab上でコードを書けるのですが、画像等も読み込ませる必要がございますので、ご教示頂けますと幸いです。

  0 Comments

Sign in to comment.

Accepted Answer

Shunichi Sekiguchi
Shunichi Sekiguchi on 1 Feb 2019
Edited: Shunichi Sekiguchi on 1 Feb 2019
コメントが一部不適切でした...
いえ,それはmainの中に入っているfileの情報を取得していることになります
また,DICOMファイルであれば
が参考になります.
mainの中の画像ファイルを取得したいとのことであれば,以下のコードのようにできます.
これで,data_cellの中にすべての画像が格納されます.
% main folderの情報を取得
MainFolderInfo = dir('main')
% 配列構造で入っているので
% 以下のような感じ
% {'.'; '..'; 'A'; 'B'}
% データの数
data_num = length(MainFolderInfo);
data_cell = cell(data_num - 2, 1);
for num = 3:data_num
img_name = MainFolderInfo(num).name
file_name = strcat('main/', img_name);
data_cell{num - 2, 1} = imread(file_name); % dicom file であれば dicomread()です
end

  3 Comments

ssk
ssk on 1 Feb 2019
ご回答大変ありがとうございます。少し前回のこちら側のコメントで申しそびれたことがございましたが、maliciousのフォルダがさらに分かれているとき病気ごとに分かれていて3つある場合のコードというのは、以下の修正でよろしいでしょうか?
main
--data
-- malicious01(肺炎)
-- image.dcm(連番ではない)
-- image.dcm(連番ではない)
    -- malicious02(肺がん)
     -- image.dcm(連番ではない)
-- image.dcm(連番ではない)
    -- malicious03(肺気胸)
     -- image.dcm(連番ではない)
-- image.dcm(連番ではない)
--benign
     -- image.dcm(連番ではない)
-- image.dcm(連番ではない)
上記の階層構造の場合において、以下の修正でコードが読み取られますでしょうか?
また、data_cell = cell(data_num - 2, 1);につきまして、data_num-2とする理由につきましてご教示いただけますと幸いです。どうぞよろしくお願いいたします。
---
MainFolderInfo = dir('main')
data_num = length(MainFolderInfo);
data_cell = cell(data_num - 4, 1);
for num = 5:data_num
img_name = MainFolderInfo(num).name
file_name = strcat('main/', img_name);
data_cell{num - 4, 1} = dicomread(file_name);
Shunichi Sekiguchi
Shunichi Sekiguchi on 2 Feb 2019
そのような構造であれば、一番下に書いた以下のコードで読み込むことができると思います
名前を付けたcellにそれぞれの画像が読み込まれます
-2とするのは、
MainFolderInfo.name
が余分な部分を含んでいるからです,みてみてください
% {'.'; '..'; 'A'; 'B'}
のように,AとBというファイル以外に,.と..を含んでいることが分かるかと思います.
でもその部分は書き方を変えるといらないので,以下のコードに書く形がいいかと思います.
% malicious01(肺炎)の情報を取得
MainFolderInfo = dir('main/data/malicious01(肺炎)');
% データの数
data_num = length(MainFolderInfo) - 2;
% cellを作成
data_cell_haien = cell(data_num, 1);
for num = 1:data_num
img_name = MainFolderInfo(num + 2).name
file_name = strcat('main/data/malicious01(肺炎)/', img_name);
data_cell_haien{num, 1} = imread(file_name);
end
% malicious02(肺がん)の情報を取得
MainFolderInfo = dir('main/data/malicious02(肺がん)');
% データの数
data_num = length(MainFolderInfo) - 2;
% cellを作成
data_cell_haigan = cell(data_num, 1);
for num = 1:data_num
img_name = MainFolderInfo(num + 2).name
file_name = strcat('main/data/malicious02(肺がん)/', img_name);
data_cell_haigan{num, 1} = imread(file_name);
end
% malicious03(肺がん)の情報を取得
MainFolderInfo = dir('main/data/malicious03(肺気胸)');
% データの数
data_num = length(MainFolderInfo) - 2;
% cellを作成
data_cell_kikyou = cell(data_num, 1);
for num = 1:data_num
img_name = MainFolderInfo(num + 2).name
file_name = strcat('main/data/malicious03(肺気胸)/', img_name);
data_cell_kikyou{num, 1} = imread(file_name);
end
% benignの情報を取得
MainFolderInfo = dir('main/data/benign');
% データの数
data_num = length(MainFolderInfo) - 2;
% cellを作成
data_cell_benign = cell(data_num, 1);
for num = 1:data_num
img_name = MainFolderInfo(num + 2).name
file_name = strcat('main/data/benign/', img_name);
data_cell_benign{num, 1} = imread(file_name);
end
ssk
ssk on 2 Feb 2019
ご回答誠にありがとうございます。
頂いたコードをもとに(imreadの部分をdicomreadに変えて)DICOMファイルの読み込みを試してみたところ、workspaceにdata_cell_haienというものは作られたのですが、中身に画像は入っておりませんでしたのでご教示いただけますと幸いです。
また、仮にdataフォルダを消して、mainフォルダの下に直接malicious、benignファイルが来るようにした場合、以下のようにコードが変化するというご認識でよろしいでしょうか?
data_num = length(MainFolderInfo) - 1;
img_name = MainFolderInfo(num + 1).name

Sign in to comment.

More Answers (1)

Shunichi Sekiguchi
Shunichi Sekiguchi on 1 Feb 2019
ディレクトリごと読み込ませるために
また画像を読み込む際は
が参考になるかと思います.
impreadをして画像を読み込む際,Pathが必要になります.
Pathというのは,実行するmファイルから,その画像までの移動するフォルダの名前になります
例えば,mainフォルダの下にAというフォルダがあったとします.
そしてその中にa.pngがあったとすると,
% まずこれでmain foldの中のa, bが見える
dir main
% main folderの中を取得
MainFolderInfo = dir('main')
% 配列構造で入っているので
% 以下のような感じ
% {'.'; '..'; 'A'; 'B'}
% folderの名前を取得
FolderName = MainFolderInfo(3).name
% 名前の足し算
path = strcat('main/', FolderName)
% folder Aの情報を取得
AFolderInfo = dir(path)
% これも先ほどと同様に見えるので
% 以下のような感じ
% {'.'; '..'; 'a.jpg'}
% よって3番目から名前を取得する
img_name = AFolderInfo(3).name
img_path = strcat( path, '/', img_name)
imread(img_path)
で読み込むことができます.
もし,画像の名前を連番等にしている場合はわざわざこのようなことをしなくてもそのdataまでのPathを指定してあげればfor文等でまとめて読み込めます.
% main/Aの中の1.png ~ 100.pngを読み込む場合
for c = 1:100
% pathの指定
img = imread(strcat('main/A/', num2str(c), '.png'))
end

  1 Comment

ssk
ssk on 1 Feb 2019
Sekiguchiさま、詳細なご説明頂き誠にありがとうございます。
大量の連番ではないDICOMファイル(benign tumor、malicious tumorのclassification済)のものがあり、これからCNNを使ってみようかなと思うのですが、
dir main
% main folderの中を取得
MainFolderInfo = dir('main')
上記の方法で画像を取得できる認識でお間違えないでしょうか。
どうぞよろしくお願いいたします。

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!