Pergunta

O que é a maneira mais simples e-pythônico para arquivo de analisar uma DICOM?

A implementação nativa Python sem o uso de bibliotecas não-Python seria muito preferido. DICOM é o formato de arquivo padrão em imagens médicas digitais (olhar aqui para mais informações).

Existem algumas bibliotecas C / C ++ que a leitura de apoio (um subconjunto) de DICOM arquivos. Dois ou três deles ainda têm vínculos Python. Um analisador nativa Python serviria a dois propósitos para mim:

  1. Não há necessidade de construir qualquer C / externo bibliotecas C ++.
  2. Saiba mais sobre o formato de arquivo DICOM.
Foi útil?

Solução

E a partir de hoje há um outro pacote de Python puro leitura DICOM arquivos disponíveis: pydicom

Outras dicas

Eu estou usando pydicom fortemente estes dias, e ele balança.

É muito fácil para começar a jogar com ele:

import dicom 
data = dicom.read_file("yourdicomfile.dcm")

Para obter o material interessante para fora desse objeto "dados", de alguma forma semelhante a dcmdump saída:

for key in data.dir():        
    value = getattr(data, key, '')
    if type(value) is dicom.UID.UID or key == "PixelData":
        continue

    print "%s: %s" % (key, value)

Eu acho uma ótima maneira de aprender mais sobre o formato DICOM é para arquivos semelhantes abertos e escrever código para compará-los de acordo com vários aspectos: descrição do estudo, a largura da janela e no centro, representação de pixel e assim por diante

.

Divirta-se! :)

Se você quiser saber mais sobre o formato DICOM, "Digital Imaging e Comunicações em Medicina (DICOM): uma introdução prática e guia de sobrevivência" por Oleg Pianykh é bastante legível e dá uma boa introdução a conceitos-chave DICOM. Springer-Verlag é o editor deste livro. O padrão DICOM completo está, é claro, a referência final embora seja um pouco mais intimidação. Está disponível a partir NEMA ( http://medical.nema.org ).

O formato do arquivo é realmente menos esotérico que você possa imaginar e é composto por um preâmbulo seguido por uma seqüência de elementos de dados. O preâmbulo contém o texto ASCII "DICM" e vários bytes reservados que não são utilizadas. Seguindo o preâmbulo é uma sequência de elementos de dados. Cada elemento de dados consiste no tamanho do elemento, um código ASCII de dois caracteres que indica a representação de valor, uma tag DICOM, eo valor. Os elementos de dados no arquivo são ordenados por seus números de tag DICOM. A imagem em si é apenas mais um elemento de dados com um tamanho, a representação de valor, etc.

representações Valor especificar exatamente como interpretar o valor. É um número? É uma cadeia de caracteres? Se é uma cadeia de caracteres, é um curta ou longa e quais caracteres são permitidos? O código de representação de valor lhe diz isso.

Um DICOM etiqueta é um código hexadecimal de 4 byte composta de um número de 2 bytes "grupo" e um número de 2 bytes "elemento". O número do grupo é um identificador que lhe diz o que entidade informações da etiqueta se aplica (por exemplo, grupo 0010 refere-se ao paciente e grupo 0020 refere-se ao estudo). O número do elemento identifica a interpretação do valor (itens tais como o número de identificação do doente, a descrição da série, etc.). Para descobrir como você deve interpretar o valor, a sua aparência de código a tag DICOM em um arquivo dicionário.

Existem alguns outros detalhes envolvidos, mas essa é a essência dele. Provavelmente a coisa mais instrutivo que você pode fazer para aprender sobre o formato do arquivo é tomar um arquivo DICOM exemplo, olhar para ele com um editor hexadecimal, e passar pelo processo de analisá-lo mentalmente. Gostaria de aconselhar contra tentando aprender sobre DICOM, olhando para implementações de código aberto existentes, pelo menos inicialmente. É mais provável para confundir em vez de esclarecer. Obtendo a grande figura é mais importante. Depois de ter a imagem grande, então você pode descer para sutilezas.

A biblioteca pydicom mencionado acima parece ser uma grande biblioteca para acessar as estruturas de dados DICOM. Para usá-lo para acesso por exemplo dados RT DOSE, eu acho que se poderia fazer algo assim

import dicom,numpy
dose = dicom.ReadFile("RTDOSE.dcm")
d = numpy.fromstring(dose.PixelData,dtype=numpy.int16)
d = d.reshape((dose.NumberofFrames,dose.Columns,dose.Rows))

e, em seguida, se você estiver em Mayavi,

from enthought.mayavi import mlab
mlab.pipeline.scalar_field(d)

Isto dá coordenadas erradas e escalonamento da dose, mas o princípio deve ser de som.

dados CT deve ser muito similar.

desenvolvimento gdcm mais recente agora acontecer aqui:

http://gdcm.sourceforge.net/

Ele suporta Java e C # no topo de python.

Por que escrever ainda uma outra DICOM implementação quando você pode centralizar uma implementação única C ++ e tê-lo acessível para tantas línguas diferentes

Alguns anos atrás, eu estava olhando para a mesma coisa e encontrei este: Python DICOM lib

I não foi muito impressionado com o código, mas é nativa Python leitura DICOM arquivos.

DICOM é uma dor real ... mesmo quando os sticks fabricante às normas. Se você escrever sua própria biblioteca DICOM você encontrará diferentes fabricantes DICOMs são efetivamente incompatível com outros fornecedores [citação necessário].

Eu tentei (no meu tempo livre) escrevendo um C DICOM analisador empréstimos fortemente a partir de um pouco agradável Rubi analisador me deparei engenhosamente chamado ' ruby-DICOM '. É código realmente muito legível (eu olhei para uma das versões menores anteriores).

A maior dor de cabeça estava tentando acumular uma biblioteca de tags de cabeçalho com tipos de dados esperados. Há as marcas definidas pelo padrão, e as marcas de fornecedores. Os arquivos de rubi-DICOM contêm uma biblioteca de marcas em um formato de texto que pode ser facilmente inspecionado.

Eu desisti de literatura oficial como eu estava interessado apenas no formato de arquivo que parece ser apenas em um dos 10 ou tão grande PDFs.

Meus arquivos DICOM locais não são comprimidos e siga fácil padrão de código de bits arranjos, mas estar preparado para várias compressões e imagens de 12 bits estranhos armazenados em recipientes de 8 bits com endianness grande ou pequena e não padding bits ...

Eu desisti uma vez o tempo tornou-se muito escassos.

Python é provavelmente uma escolha muito melhor do que C para este modelo de cabeçalho parsing embora ...

Existem algumas bibliotecas (na maioria das vezes implementados em C / C ++) com vínculos Python, p.ex.:.

No entanto, eu estou procurando uma implementação nativa Python para aprender mais sobre o formato de arquivo DICOM.

Eu me pergunto o que o poster original tentado e quais os métodos funcionou e não funcionou para ele. Eu nunca trabalhei com DICOM, mas uma rápida pesquisa no google para "DICOM python" deu vários resultados interessantes. Parece que este projecto: http://www.creatis.univ-lyon1.fr / Public / Gdcm / deve entregar o que você quer. Ele tem ligações Python e uma lista de discussão muito ativa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top