【问题标题】:ITK library on iOS - Loading DICOMiOS 上的 ITK 库 - 加载 DICOM
【发布时间】:2011-05-14 13:10:32
【问题描述】:

我已经为 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。

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

【问题讨论】:

    标签: ios ipad dicom itk


    【解决方案1】:

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

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


    像素数据不一定是您期望在 JPEG 中找到的 RGB 数据。检查光度解释。如果它是 RGB,那么你很高兴(在解码和解压缩之后)。如果是单色的,您可能需要先转换为 RGB 值(请参阅How to translate DICOM image width and level to JPEG brightness and contrast?),然后再将数据传递给 UIImage。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        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 文档中找到一些示例 :(

        【讨论】:

        • 阅读了您的帖子,听起来我们都有相似的目标。你有没有得到这个工作?如果您有兴趣,我设法让 ITK 应用程序正常工作并将标准 jpeg、bmp、png 等文件传递给 UIImage 查看器....如何处理像素数据的任何进展。干杯,瑞克。
        • @rick 嘿,我需要帮助,你能把可以显示 dicom 图像的示例 ios 代码发给我吗?
        【解决方案4】:
        //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];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-25
          • 1970-01-01
          • 2023-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-13
          • 1970-01-01
          相关资源
          最近更新 更多