2016-04-19 9 views
0

私は肺のデータセットをmatlabで操作していますが、スライスを正しく並べ替えて表示する必要があります。Matlabでのdicom画像の並べ替え

私はそれがDicomヘッダーの "インスタンス番号"パラメータを使って行うことができることを知っていましたが、正しいコードを実行できませんでした。

どうすればいいですか?

は、ここでは、コードの私の作品である:すべての

Dicom_directory = uigetdir(); 
sdir = strcat(Dicom_directory,'\*.dcm'); 
files = dir(sdir); 
I = strcat(Dicom_directory, '\',files(i).name); 
x = repmat(double(0), [512 512 1 ]); 
x(:,:,1) = double(dicomread(I)); 
axes(handles.axes1); 
imshow(x,[]); 

答えて

1

まず、DICOMヘッダを取得するには、各フィールドを含むstructを返しますdicominfoを使用する必要があります。 InstanceNumberフィールドを並べ替えに使用する場合は、このようにすることができます。言われて、あなたはInstanceNumberを使用して慎重に並べ替えDICOMsする必要があることを

%// Get all of the files 
directory = uigetdir(); 
files = dir(fullfile(directory, '*.dcm')); 
filenames = cellfun(@(x)fullfile(directory, x), {files.name}, 'uni', 0); 

%// Ensure that they are actually DICOM files and remove the ones that aren't 
notdicom = ~cellfun(@isdicom, filenames); 
files(notdicom) = []; 

%// Now load all the DICOM headers into an array of structs 
infos = cellfun(@dicominfo, filenames); 

%// Now sort these by the instance number 
[~, inds] = sort([infos.InstanceNumber]); 
infos = infos(inds); 

%// Now you can loop through and display them 
dcm = dicomread(infos(1)); 
him = imshow(dcm, []); 

for k = 1:numel(infos) 
    set(him, 'CData', dicomread(infos(k))); 
    pause(0.1) 
end 

。 「InstanceNumber」は、時間の経過とともに取得された同じ画像、または3Dボリューム全体で異なるスライスを参照できるため、これを実行する堅牢な方法ではありません。あなたがどちらか一方を望むなら、私はもっと具体的なものを選ぶでしょう。

物理スライスを並べ替える場合は、SliceLocationフィールド(使用可能な場合)でソートすることをお勧めします。時間でソートする場合は、TriggerTime(利用可能な場合)を使用できます。

また、あなたはまた、潜在的ので、多分これらを区別するためにSeriesNumberを使用することを検討してフォルダ内の複数のシリーズがあるかもしれないことを考慮する必要があります。

+0

本当にありがとうございました,,,しかし、あなたのコードを試したところ、次のエラーで戻ってきました。 非構造体配列オブジェクトからの構造体の参照です。 プロジェクト3のエラー> Load_Image_Callback(行190) [〜、inds] = sort([infos.InstanceNumber]); –

+0

@AhmedHassaan申し訳ありません!私は 'cellfun'呼び出しを' dicominfo'に変更して、セルではなく構造体を返さなければなりませんでした。今すぐテストしてください。 – Suever

関連する問題