Как читать .dcm в Xcode с помощью python?

Я пытаюсь создать приложение для просмотра и анализа фрагментов DICOM. Я сделал это приложение в MATLAB, но в MATLAB недостаточно инструментов для создания действительно красивого графического интерфейса, а 3D-изображение плохое. Итак, я пытался использовать ITK и VTK для создания приложения в Xcode в течение длительного периода времени, но безуспешно. Однажды я нашел xcodeproject PythonDicomDocument — этот проект (написанный на питоне) может читать и показывать изображение DICOM! Я прочитал туториал о python и какао, но до сих пор не могу понять, как работает этот проект — в нем есть файл PythonDicomDocumentDocument.py:

from Foundation import *
from AppKit import *
from iiDicom import *

import objc


import dicom
import numpy
import Image


class PythonDicomDocumentDocument(NSDocument):
imageView = objc.IBOutlet('imageView')

def init(self):

    self = super(PythonDicomDocumentDocument, self).init()
    self.image = None
    return self

def windowNibName(self):

    return u"PythonDicomDocumentDocument"

def windowControllerDidLoadNib_(self, aController):
    super(PythonDicomDocumentDocument, self).windowControllerDidLoadNib_(aController)
    if self.image:
        self.imageView.setImageScaling_(NSScaleToFit)
        self.imageView.setImage_(self.image)


def dataOfType_error_(self, typeName, outError):
    return None

def readFromData_ofType_error_(self, data, typeName, outError):
    return NO

def readFromURL_ofType_error_(self, absoluteURL, typeName, outError):
    if absoluteURL.isFileURL():
        slice = iiDcmSlice.alloc().initWithDicomFileSlice_(absoluteURL.path())

        dicomImage = slice.sliceAsNSImage_context_(True, None)

        if dicomImage:
            self.image = dicomImage
                            #self.image = dicomImage

            return True, None

    return False, None

и файл main.m:

**#import "<"Python/Python.h>**

**#import "<"Cocoa/Cocoa.h>**


int main(int argc, char *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSBundle *mainBundle = [NSBundle mainBundle];
    NSString *resourcePath = [mainBundle resourcePath];
    NSArray *pythonPathArray = [NSArray arrayWithObjects: resourcePath,               [resourcePath stringByAppendingPathComponent:@"PyObjC"],      @"/System/Library/Frameworks/Python.framework/Versions/Current/Extras/lib/python/", nil];

setenv("PYTHONPATH", [[pythonPathArray componentsJoinedByString:@":"] UTF8String], 1);

    NSArray *possibleMainExtensions = [NSArray arrayWithObjects: @"py", @"pyc",            @"pyo", nil];
    NSString *mainFilePath = nil;

for (NSString *possibleMainExtension in possibleMainExtensions) {
    mainFilePath = [mainBundle pathForResource: @"main" ofType: possibleMainExtension];
    if ( mainFilePath != nil ) break;
}

if ( !mainFilePath ) {
    [NSException raise: NSInternalInconsistencyException format: @"%s:%d main() Failed to find the Main.{py,pyc,pyo} file in the application wrapper's Resources directory.", __FILE__, __LINE__];
}

Py_SetProgramName("/usr/bin/python");
Py_Initialize();
PySys_SetArgv(argc, (char **)argv);

    const char *mainFilePathPtr = [mainFilePath UTF8String];

    FILE *mainFile = fopen(mainFilePathPtr, "r");



int result = PyRun_SimpleFile(mainFile, (char *)[[mainFilePath lastPathComponent] UTF8String]);



if ( result != 0 )
    [NSException raise: NSInternalInconsistencyException
                format: @"%s:%d main() PyRun_SimpleFile failed with file '%@'.  See console for errors.", __FILE__, __LINE__, mainFilePath];

[pool drain];

return result;

}

Итак, я хочу «перевести» код MATLAB для чтения .dcm:

directory = uigetdir; % after this command Finder window will appear and user will             choose a folder with .dcm files

fileFolder = directory; % the path to the folder is saved to a variable fileFolder
dirOutput = dir(fullfile(fileFolder,'*.dcm')); % choose files .dcm in specified folder     %and save their names 
fileNames = {dirOutput.name}';

Names = char(fileNames);
numFrames = numel(fileNames); % count the number of files in the folder


    for i = 1:numFrames
    Volume(:,:,i) = dicomread(fullfile(fileFolder,Names(i,:))); % create a 3D array of         %DICOM pixel data
    end;

Может ли кто-нибудь сказать мне, как запустить тот же код для чтения файлов .dcm в Xcode с использованием python???

Я слышал, что Python и MATLAB похожи.


person Max Putrik    schedule 22.08.2011    source источник


Ответы (1)


Поздравляем с выбором Python для работы с DICOM; клан SciPy/numpy/matplotlib намного лучше справляется с огромными объемами данных, чем MATLAB (или, по крайней мере, GNU Octave), по моему опыту.

Общая загрузка и отображение кода с использованием GDCM привязки python, ConvertNumpy.py из примеров GDCM и matplotlib:

#!/usr/bin/env python

import gdcm
import ConvertNumpy
import numpy as np
import matplotlib.pyplot as plt

def loadDicomImage(filename):
    reader=gdcm.ImageReader()
    reader.SetFileName(filename)
    reader.Read()
    gdcmimage=reader.GetImage()
    return ConvertNumpy.gdcm_to_numpy(gdcmimage)

image=loadDicomImage('mydicomfile.dcm')

plt.gray()
plt.imshow(image)
plt.show()

Обратите внимание, что если ваши данные DICOM содержат значения «отступов», значительно выходящие за пределы диапазона воздушной кости вашего изображения, это может привести к путанице при автоматическом масштабировании imshow; используйте параметры vmax,vmin для этого вызова, чтобы указать диапазон, который вы действительно хотите видеть, или реализуйте свой собственный код выравнивания окна (что тривиально в numpy).

person timday    schedule 17.09.2011