Библиотека ITK на iOS - Загрузка DICOM - PullRequest
1 голос
/ 14 мая 2011

Я собрал библиотеку ITK для ipad - и она работает. Затем я попытался сделать пример ITK - что-то вроде этого:

// Load DICOM files
typedef itk::ImageSeriesReader< InputImageType > ReaderType;
ReaderType::Pointer reader = ReaderType::New();
typedef itk::GDCMImageIO ImageIOType;
typedef itk::GDCMSeriesFileNames NamesGeneratorType;
ImageIOType::Pointer gdcmIO = ImageIOType::New();
NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New();
namesGenerator->SetInputDirectory( "C:/test" );

Но я пробовал много возможностей загрузить стек DICOM в каталог в папке документов на ipad вместо пути c:/test. Но это не сработало.

Так что моя идея состоит в том, чтобы загрузить DICOM как это через Интернет:

NSData *dicomImage = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.someurl.ch/dicom/blabla.dcm"]];   

А теперь я думаю о том, чтобы попытаться получить данные dicom (имя пациента и т. Д.) И отделить их от данных изображения. Тогда я думаю, что должно быть возможно иметь в конце UIImage для отображения на IPAD.

Я искал пример для этого, но, к сожалению ... я не нашел ничего хорошего. Если у кого-нибудь есть идея, как загрузить dcm на ipad через ITK, или идея, как получить данные изображения из объекта NSData?

Ответы [ 4 ]

2 голосов
/ 16 мая 2011

ITK фактически использует GDCM для чтения файлов DICOM, поэтому, вероятно, проще использовать GDCM напрямую.http://sourceforge.net/apps/mediawiki/gdcm/index.php

Что касается загрузки файлов DICOM на iPad (или любое другое мобильное устройство), я буду осторожен при этом.Некоторые файлы DICOM очень большие (порядка ГБ), и это, вероятно, просто приведет к сбою вашего приложения.Конечно, в любом случае вам, вероятно, будет трудно загружать файлы такого размера на iPad:)


Пиксельные данные не обязательно являются данными RGB, как вы ожидаете найти в JPEG.Проверьте фотометрическую интерпретацию.Если это RGB, то все готово (после декодирования и распаковки).Если он монохромный, вам может потребоваться преобразовать его в значения RGB (см. Как перевести ширину и уровень изображения DICOM в яркость и контрастность JPEG? ) перед передачей данных в UIImage.

1 голос
/ 23 сентября 2011

Возможно, вы захотите изучить DCMTK. На iphone вам, вероятно, понадобятся возможности сетевого протокола, которые есть в DCMTK.

0 голосов
/ 05 марта 2012
//assume that the image width is 880 and the image height is 635
int imageWidth = 880;
int imageHeight = 635;
NSString *dicomPath = [[[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/"] stringByAppendingString:@"your dicom file name"];
const char *c_dicomPath = [dicomPath UTF8String];

typedef unsigned char InputPixelType; 
const unsigned int InputDimension = 3;
typedef itk::Image< InputPixelType, InputDimension > InputImageType;

typedef itk::ImageFileReader< InputImageType > ReaderType;
ReaderType::Pointer reader = ReaderType::New();
reader->SetFileName(c_dicomPath);

typedef itk::GDCMImageIO ImageIOType; 
ImageIOType::Pointer gdcmImageIO = ImageIOType::New(); 
reader->SetImageIO(gdcmImageIO);

InputPixelType *imageBuf = (InputPixelType*)malloc(sizeof(InputPixelType)*imageHeight*imageWidth*3);
reader->Update();

//get dicom image
memset(imageBuf, 0, sizeof(InputPixelType)*imageHeight*imageWidth*3);

gdcmImageIO->Read(imageBuf);
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
CGDataProviderRef provider = CGDataProviderCreateWithData(nil, imageBuf, imageWidth*imageHeight*3*sizeof(InputPixelType), nil);  

CGImageRef imageRef = CGImageCreate(imageWidth,//width
                                    imageHeight,//height 
                                    8,//size_t bitsPerComponent, 
                                    24,//size_t bitsPerPixel,
                                    imageWidth*sizeof(InputPixelType)*3,//size_t bytesPerRow, 
                                    colorspace,//CGColorSpaceRef space,
                                    kCGBitmapByteOrderDefault,//CGBitmapInfo bitmapInfo,
                                    provider,//CGDataProviderRef provider,
                                    nil,//const CGFloat *decode,
                                    NO,//bool shouldInterpolate, 
                                    kCGRenderingIntentDefault//CGColorRenderingIntent intent
                                    );
//here is the dicom image decode from dicom file
UIImage *dicomImage = [[UIImage alloc] initWithCGImage:imageRef scale:1.0 orientation:UIImageOrientationUp];
0 голосов
/ 16 мая 2011

Со времени моего последнего поста у меня теперь есть небольшое решение для моей проблемы.

namesGenerator->SetInputDirectory( documentFolderPath );
typedef std::vector<std::string> FileNamesContainer; 
FileNamesContainer fileNames = nameGenerator->GetInputFileNames();
reader->SetFileNames( fileNames );
reader->Update();
ImageType *  imageTest = reader->GetOutput(); // get 3d volume
PixelType * pixelData = imageTest->GetBufferPointer(); // get bufferpointer

С этим я могу загружать стеки DICOM и получать всю информацию заголовка dicom :) Теперь моя проблема заключается вполучение данных пикселей изображения в UIImage.Я могу загрузить отдельные значения пикселей с помощью этого кода: (только для теста, getPixel - медленный метод)

ImageType::IndexType pixelIndex;
pixelIndex[0] = 100; 
pixelIndex[1] = 100; 
pixelIndex[2] = 0;

ImageType::PixelType pixelValue = imageTest->GetPixel( pixelIndex );

Но моя проблема в том, что я не понимаю, как я могу обрабатывать данные * pixeldata (bufferpointer) для создания UIImage.К сожалению, я не нашел некоторого примера в документации ITK: (

...