1

我已经为 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:/test路径的目录中。但这没有用。

DICOM所以我的想法是通过互联网加载类似的内容:

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

现在我考虑尝试获取 dicom 数据(患者姓名等)并将其与图像数据分开。然后我认为最后一定有可能在 IPAD 上显示 UIImage。

我为此搜索了一个示例,但遗憾的是……我没有找到好的东西。如果有人知道如何通过 ipad 在 ipad 上加载 dcm,ITK或者知道如何从NSData对象中获取图像数据?

4

4 回答 4

2

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

至于在 iPad(或任何移动设备)上加载 DICOM 文件,我会小心这样做。一些 DICOM 文件非常大(大约为 GB),这可能会使您的应用程序崩溃。当然,无论如何,您可能很难将这么大的文件加载到 iPad 上 :)


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

于 2011-05-16T09:28:41.623 回答
1

您可能需要调查 DCMTK。在 iphone 上,您可能需要 DCMTK 中的网络协议功能。

于 2011-09-23T02:18:18.523 回答
0

自从我上一篇文章以来,我现在对我的问题有了一些解决方案。

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(缓冲区指针)的数据来创建 UIImage。遗憾的是,我没有在 ITK 文档中找到一些示例 :(

于 2011-05-16T13:35:19.390 回答
0
//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];
于 2012-03-05T02:42:02.670 回答