Notebook 19
Tomografia, heatmaps

O script neste documento lê um arquivo do tipo DICOM (Digital Imaging and Communications in Medicine) com dados relacionados a uma "fatia" tomográfica do corpo humano. O arquivo foi gerado por um sistema tomográfico real (https://www.dropbox.com/s/8pihvvxt1em8vb2/DICOM.zip?dl=0, a partir de https://lapisco.ifce.edu.br/producao-academica/private-datasets/database-lungs-from-chest-ct-scans/) e contém dois grupos de informações:

  1. um "cabeçalho" de 1910 bytes com informações sobre o paciente, data de aquisição, dados sobre o equipamento, entre outras informações que, devido a questões de privacidade, foram parcialmente "cegados";
  2. uma lista de 524288 bytes contendo os dados tomográficos propriamente ditos (os "números de Housfield" que são, essencialmente, uma medida da densidade eletrônica dos tecidos). Cada dois bytes (16 bits) formam um número inteiro, e estão estruturados de modo a representar uma matriz de 512 × 512 números (512 × 512 × 2 = 524288).

    O número de Housfield $H$, que é essencialmente uma medida da densidade eletrônica dos materiais, distribui-se por 4096 níveis, que vão de −2048 a 2047, tendo a água no centro da escala ($H$ = 0). Para materias menos densos que a água $H \lt 0$; para materiais mais densos que a água, $H \gt 0$. O ar tem $H \simeq -1000$, tecido ósseo $H \simeq 1000$, enquanto os tecidos moles (gordura, músculo, glândulas etc.) têm $H$ entre −300 e 300, aproximadamente.

Essas informações são essenciais para que se possa interpretar o conteúdo do arquivo. Como pode ser visto no código fonte, para interpretar os primeiros 1910 bytes os dados são colocados em uma matriz de inteiros sem sinal com 8 bits (Uint8Array), enquanto os demais dados são colocados em uma matriz de inteiros com sinal com 16 bits (Int16Array).

O script mostra os dados de duas maneiras:

  1. Histogramas dos valores associados a cada pixel da imagem.

    O primeiro histograma mostra os dados "brutos". Os dados estão divididos essencialmente em três grupos: (a) um pico em −2048, associados aos pixels que não representam medidas físicas possíveis (fora do "campo de visão" do tomógrafo); (b) um grupo entre aproximadamente −1100 e −500, associados a medidas do ar no entorno do paciente e no interior dos seus pulmões; (c) um grupo entre aproximadamente −300 e 300, associados aos tecidos moles. Para além disso existe uma "graminha" associada à pequena quantidade de tecido ósseo presente na imagem.

    O segundo histograma faz um "janelamento" na região dos tecidos moles, para $-300 \lt H \lt 300$.

  2. Os dados propriamente ditos, na forma de imagens em tons de cinza, geradas com o Plotly. A primeira imagem mostra os dados associados ao primeiro histograma, e a segunda imagem os dados associados ao recorte em torno dos tecidos moles.
  3. Ao clicar em "escolher arquivo" (ou equivalente) o navegador abrirá uma janela para a seleção do arquivo. copie no campo "Nome:" a seguinte URL:





    Dependendo do seu dispositivo, o script pode demorar um pouco para responder, uma vez que são manipulados uma quantidade relativamente grande de dados.

    Cabeçalho:

    Exercícios

    1. Gere o histograma e uma imagem para um janelamento "pulmonar" utilizando $-1100 \lt H -600$.

    2. Gere o histograma e uma imagem para um janelamento "ósseo" utilizando $300 \lt H \lt 1300$.

    3. O Plotly dispõe de vários várias esquemas de cores para heatmaps ("YlOrRd", "YlGnBu", "RdBu", "Portland", "Picnic", "Jet", "Hot", "Greens", "Electric", "Earth", "Bluered", "Blackbody"). Experimente gerar suas imagens com esses outros esquemas de cores.