2016-04-19 4 views
0

Я работаю с наборами данных легкого в Matlab, но мне нужно правильно отсортировать фрагменты и показать их.Сортировка изображений dicom в Matlab

Я знал, что это можно сделать, используя параметр «номер экземпляра» в заголовке 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, вам нужно использовать dicominfo, который будет возвращать struct, содержащую каждое из полей. Если вы хотите использовать поле InstanceNumber для сортировки по, вы можете сделать это таким образом.

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

Это, как говорится, необходимо тщательно изучить DICOM, используя InstanceNumber. Это не надежный способ сделать это, потому что «Номер экземпляра» может ссылаться на один и тот же образ, полученный со временем или на разные фрагменты в трехмерном томе. Если вы хотите того или другого, я бы выбрал что-то более конкретное.

Если вы хотите отсортировать физические фрагменты, я бы порекомендовал сортировку по полю SliceLocation (если есть). Если сортировка по времени, вы можете использовать TriggerTime (если имеется).

Также вам нужно будет учесть, что в вашей папке также может быть несколько series, поэтому, пожалуйста, рассмотрите возможность использования SeriesNumber для их дифференциации.

+0

Действительно большое спасибо ,,, но когда я попробовал свой код, я вернулся со следующей ошибкой. Ссылка на содержание структуры из объекта неструктурированного массива. Ошибка в проекте3> Load_Image_Callback (строка 190) [~, inds] = sort ([infos.InstanceNumber]); –

+0

@AhmedHassaan Извините, что! Мне пришлось изменить вызов 'cellfun' на' dicominfo', чтобы вернуть структуру, а не ячейку. Проверьте это сейчас. – Suever