如何从iOS上的DICOM文件中提取像素数据?

时间:2011-03-11 21:47:58

标签: iphone ios dicom

有谁知道如何从DICOM文件中提取像素数据并将其传递给iOS上的图像查看器?

很抱歉,如果这是一个简单的问题,但它似乎是我打开的大量蠕虫的主要组成部分。

4 个答案:

答案 0 :(得分:5)

我在iOS上使用GDCM。我还没有非常努力地推动它,但到目前为止它仍然运作良好。在ITK这篇优秀的文章中,我基本上遵循了黑客攻击XCode项目的指示。

以下是我为iOS编译的方法:

  1. 从sourceforge下载源,通过端口安装cmake。你需要一个最新版本的cmake(我使用的是2.8.2)
  2. 如果源位于名为gdcm-2.0.17 /的文件夹中,则在该级别创建另一个目录(例如gdcmbin),cd到该目录,然后输入 ccmake -GXCode ../gdcm-2.0。 17 / 在终端窗口中。这将创建XCode项目。当我这样做时,我没有创建任何示例程序或创建共享库(这在iOS中不起作用)。只需运行默认值。
  3. 按照ITK文件中有关更改构建选项的说明进行操作(第4页上的步骤#7)。
  4. 然后使用Clint Harris' blog
  5. 上的优秀说明将GDCM链接到您的项目中
  6. 当您在项目中将标题搜索路径设置为GDCM时 - 您必须输入两个路径: blah /gdcm-2.0.17/Source / **和 blah / gdcmbin / **。第一个路径上的尾部'/ Source'是必需的 - 否则您将获得不适合您的体系结构的标头。
  7. 一个小故障(烦人但尚未花时间搞清楚):当你从模拟器切换到设备时,你会得到一堆链接错误(反之亦然)。这是因为gdcm项目不会将输出放入不同目标的不同目录中。所以 - 在切换时在gdcm项目中运行清理和重建。我可能很快就会对此感到恼火,以改变它: - )。
  8. 以下是您如何调用库并将结果放入Objective-C词典的粗略摘要:

    NSMutableDictionary * imageDictionary = [[NSMutableDictionary alloc] initWithCapacity:40];
    // The output of gdcm::Reader is a gdcm::File
    gdcm::File &file = reader.GetFile();
    
    // the dataset is the the set of element we are interested in:
    gdcm::DataSet &ds = file.GetDataSet();
    const Tag studyInstance(0x0020,0x000d); // Study Instance UID
    const DataElement &dicomVal = ds.GetDataElement(studyInstance);
    std::string stringVal( dicomVal.GetByteValue()->GetPointer(), dicomVal.GetByteValue()->GetLength() );
    NSString *val = [NSString stringWithCString:stringVal.c_str() encoding:[NSString defaultCStringEncoding]];
    [imageDictionary setObject:val forKey:@"studyInstanceUID"];
    

    (注意:这是一个混合了C ++和ObjectiveC的* .mm文件)

答案 1 :(得分:1)

我想在swift或Objective-C的IOS项目中使用gdcm库,但无法成功。

我尝试了ccmake -G 'Xcode' ../gdcm并从输出中导入二进制文件,但是遇到了错误can't map file, errno:22 file locations for architecture x86_64

我猜@Sean谈论的文章不是最新的。有任何教程或技巧吗?

答案 2 :(得分:0)

如果您想查找DICOM软件,请查看idoimaging.com,这是医疗成像软件的交换中心。您可以选择您的平台,输入格式,输出格式,语言等.iOS未列为格式,但其中列出的大部分软件都有源代码,在库中有用,可用于MacOS X.例如,我选择了:

  • 输入格式:DICOM
  • 平台:Macintosh
  • 语言:C

并找到了几个包。考虑到MacOS和iOS之间的相似性以及其中一些是包含源代码的跨平台的事实,要让其中一个在iOS上工作应该不会太难。

答案 3 :(得分:0)

Imebra具有一个Objective-C包装器,该包装器也可以与Swift一起使用。

#import "imebraobjc/imebra.h"

// Get the DICOM dataset from file
NSError* error = nil;
ImebraDataSet* pDataSet = [ImebraCodecFactory loadFromFile:@"test.dcm" error:&error]

// CHeck the patient name (automatically convert from DICOM charsets to UTF-8)
NSString* checkPatientName = [pDataSet getString:[[ImebraTagId alloc] initWithGroup:0x10 tag:0x10] elementNumber:0 error:&error]; // Automatically converted to UTF-8 if necessary

// Get the frame 0
ImebraImage* pCheckImage = [pDataSet getImageApplyModalityTransform:0 error:&error];

// Get the image data
ImebraReadingDataHandlerNumeric* readingDataHandler = [pCheckImage getReadingDataHandler:&error];

// Scan the pixels. Access the data handler memory for faster data access
for(unsigned int pixel(0); pixel != readingDataHandler.size; ++pixel)
{
    unsigned int pixelValue = [readingDataHandler getUnsignedLong:pixel error:&error];
}

ImebraDrawBitmap* pDrawBitmap = [[ImebraDrawBitmap alloc] init];

// Obtain a NSImage (UIImage on iOS)
NSImage* pNsImage = [pDrawBitmap getImebraImage:pCheckImage error:&pError];