2016-04-19 7 views
0

Ich arbeite mit Lungen-Datensätze in Matlab, aber ich muss die Scheiben richtig sortieren und zeigen.Sortieren dicom Bilder in Matlab

Ich wusste, dass dies mit dem Parameter "Instanznummer" in Dicom-Header getan werden kann, aber ich konnte nicht den richtigen Code ausführen.

Wie kann ich das tun?

Hier mein Stück Code ist:

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,[]); 

Antwort

1

Zu allererst den DICOM-Header zu erhalten, müssen Sie dicominfo verwenden, die eine struct enthält jedes der Felder zurück. Wenn Sie das Feld InstanceNumber zum Sortieren nach verwenden möchten, können Sie dies auf diese Weise tun.

%// 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 

Das besagt, dass Sie sorgfältig DICOMs mit der InstanceNumber sortieren müssen. Dies ist keine robuste Methode, da sich "InstanceNumber" auf dasselbe Bild beziehen kann, das im Laufe der Zeit oder in verschiedenen Schichten eines 3D-Volumes erfasst wurde. Wenn Sie das eine oder das andere wollen, würde ich etwas spezifischeres wählen.

Wenn Sie physische Scheiben sortieren möchten, würde ich empfehlen, nach dem Feld SliceLocation zu sortieren (falls verfügbar). Wenn Sie nach Zeit sortieren, können Sie TriggerTime (falls verfügbar) verwenden.

Auch Sie müssen berücksichtigen, dass es möglicherweise auch mehrere Serie in Ihrem Ordner, so vielleicht mit der Verwendung der SeriesNumber, um diese zu unterscheiden.

+0

Wirklich vielen Dank ,,, aber als ich Ihren Code ausprobiert habe ich mit dem folgenden Fehler zurück. Struct Inhalt Verweis von einem Nicht-Struktur-Array-Objekt. Fehler in Projekt3> Load_Image_Callback (Zeile 190) [~, inds] = sort ([infos.InstanceNumber]); –

+0

@AhmedHassaan Sorry! Ich musste den Aufruf 'cellfun' in' dicominfo' ändern, um eine Struktur anstelle einer Zelle zurückzugeben. Testen Sie es jetzt. – Suever

Verwandte Themen