MATLAB Answers

ssk
0

dicomファイルのリサイズについて

Asked by ssk
on 16 Feb 2019
Latest activity Edited by ssk
about 3 hours ago
Alexnet、Googlenetを利用するために
256*256*1のdicomファイルを257*257*3にリサイズしようとしております。
以下がコードです。
%path = current directory
currentdirectory = pwd;
%% Create an ImageDatastore to help you manage the data.currentdirectory = pwd;
categories = {'a', 'b', 'c','d'};
%Because ImageDatastore operates on image file locations,
imds = imageDatastore(fullfile(currentdirectory, categories),'IncludeSubfolders',true,'FileExtensions','.dcm','LabelSource', 'foldernames','ReadFcn');
%resize
imdsResized = imresize3(imds, [227 227 3]);
しかし、以下のエラーが出てしまいます。
Error using imresize3
Expected input number 1, V, to be one of these types:
single, double, int8, int16, int32, uint8, uint16, uint32
Instead its type was matlab.io.datastore.ImageDatastore.
原因がお分かりの方はご教示頂けますと幸いです。
どうぞよろしくお願いいたします。

  0 Comments

Sign in to comment.

1 Answer

Answer by Kenta Itakura on 17 Feb 2019
Edited by Kenta Itakura on 17 Feb 2019
 Accepted Answer

function resized = rs227(filename)
% 画像を読むこむ。指定の画像がimreadで読み取れなければ、ちがう関数で読み込んでください
I = imread(filename);
% 1チャンネル目にある値を第2、3チャンネルにそのままコピー
%catの直後の3は、チャンネルの深さ方向という意味
%チャンネル数が増える方向にIを3つ分重ねる
I = cat(3,I,I,I);
% 画像を227x227へリサイズ
resized = imresize(I, [227 227]);
end
添付したコード(上)をrs227という名前で保存して、同じディレクトリにおいて置き、さらに下のコードをimdsResized = imresize3(imds, [227 227 3]);の代わりに打てばうまくリサイズできると思います。DICOMファイルがimreadで読めない場合は、適切な関数で読み込んでください。
imresize3は、3次元的なデータを拡大、縮小するイメージで、1次元の画像をそのままコピーして、3次元にするときには使えないように思います。DICOMファイルというのは、画像的な扱いをするのでしょうか?
それともボリュームデータのような感じなのでしょうか。いずれにせよ、その扱い次第で、上の関数の中を変更させれば実行できると思います。メインのコマンドのほうには下のコードを書いてください。
imds = imageDatastore(fullfile(currentdirectory, categories),'IncludeSubfolders',true,'FileExtensions','.dcm','LabelSource', 'foldernames','ReadFcn',@dicomread);
%この下の1行を追加、もとのimresize3の行は消去
imds.ReadFcn = @(filename)rs227(filename);

  3 Comments

ssk
on 21 Feb 2019
Itakura さま 
平素よりお世話になっております。
imds.ReadFcn = @(filename)rs227(filename);
上記コードの指す意味につきましてご教示頂けますでしょうか?
なぜ@(filename)を使っているのか分からない点がございますので。。
@rs227(filename)ではだめなのでしょうか?
Kenta Itakura on 22 Feb 2019
上の無名関数を参照ください。例えば、
h = @(x) 10*x; とhを関数として定義して、2を代入すると
>> h(2)=20 のようになります。
@の直後は変数(入力する値)、その後は、関数の式です。
ここでは、あるファイルの名前が入力されると、別ファイルにある、rs227にしたがって計算され、filenameという値を受け取った時に返す画像をデータストアに格納(おそらく実際はデータを呼び出すときに変更)するようになっています。
rs227では、あるファイルを受け取ったときに227*227*3の画像を返すようになっているので、うまく転移学習(ファインチューニング)を行える、という流れです。確かに他の表記でもいけそうな気はしますが、はじめに入力する値を宣言しないと入らないようになっているようです。
ssk
on 23 Feb 2019
itakuraさま
ご丁寧にご回答頂き誠にありがとうございました。無名関数についての理解が深まりました。本当にありがとうございました!

Sign in to comment.