iOS上的ITK库 – 加载DICOM

我已经build立了iPad的ITK库 – 它的工作原理。 然后我试着做一个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:/testpath。 但是这没有用。

所以我的想法是通过互联网加载一个DICOM

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

现在我考虑试着脱离dicom数据(患者姓名等)并将其与图像数据分开。 然后我认为最后可以在IPAD上显示UIImage。

我寻找了一个例子,但可悲的是…我没有find好的东西。 如果有人知道如何通过ITK加载ipad上的dcm或想法如何从NSData对象中获取图像数据?

ITK实际上使用GDCM来读取DICOM文件,因此直接使用GDCM可能更容易。 http://sourceforge.net/apps/mediawiki/gdcm/index.php

至于在iPad(或任何移动设备)上加载DICOM文件,我会小心这样做。 一些DICOM文件非常大(大小为GB),这可能会导致应用程序崩溃。 当然,加载iPad上的文件可能会有困难:)


像素数据不一定是RGB数据,就像您期望在JPEG中find的一样。 检查光度解释。 如果它是RGB,那么你很好(去解码和解压缩之后)。 如果是单色的,则在将数据传递到UIImage之前,可能需要转换为RGB值(请参阅如何将DICOM图像宽度和级别转换为JPEG亮度和对比度? )。

您可能想要调查DCMTK。 在iPhone上,您可能需要使用DCMTK中的networking协议function。

自从我上一篇文章以来,我现在有一个解决我的问题的小解决scheme。

 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。 我可以加载这个代码的单个像素值:(只是为了testing,getPixel是一个慢的方法)

 ImageType::IndexType pixelIndex; pixelIndex[0] = 100; pixelIndex[1] = 100; pixelIndex[2] = 0; ImageType::PixelType pixelValue = imageTest->GetPixel( pixelIndex ); 

但我的问题是,我不明白如何处理* pixeldata(bufferpointer)的数据来创build一个UIImage。 可悲的是我没有findITK文件中的一些例子:(

 //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];