Como converter várias imagens tiff em coordenadas xyz em um único arquivo de texto usando o terminal?

2

Tenho pouca experiência com programação e Linux e preciso da sua ajuda.

A situação em que estou é que tenho uma pilha de imagens tiff em preto e branco (aprox. 400 de 10 Mb cada) que preciso converter em coordenadas xyz e valores em escala de cinza e compilar todos em SOMENTE um arquivo de texto único com x, y, z, escala de cinza (as coordenadas z, desta forma: primeira imagem da pasta z = 0000, segunda imagem 0001 ... tantas coordenadas z quanto imagens na pasta).

Eu tenho um script (que eu não estou familiarizado, mas acho que é feito com o Image Magick) que pode fazê-lo, mas apenas para uma única imagem de cada vez, e adiciona apenas as coordenadas x, y e um valor em escala de cinza, mas não z.

O script é:

The exact format of the TXT image is defined by the convert command, then 'tail' is used to junk the header, 'tr' to character replace every non-number character with a single space, so that the later 'while' can read it easily, junking any comment numbers that may have been left.

convert -depth 8 -colorspace RGB $1 txt:- | tail -n +2 | tr -cs '0-9.\n' ' ' | while read x y Gray junk; do if [ "$Gray" -eq 0 ]; then echo "$x,$y $Gray" done

Para rodar eu coloquei no terminal Linux:

chmod +x img.sh

E depois disso (selecionei o mesmo nome da imagem, mas com .txt como nome do arquivo):

./img.sh pic0000.tif > pic0000.txt

Também tentei alterá-lo para fazer tudo de uma vez, substituindo a linha convert -depth 8 -colorspace RGB $1 txt:- |

com

convert -depth 8 -colorspace RGB $* txt:- |

e colocando isso no terminal

chmod +x ./img.sh ./img.sh *.tif > *.txt

E agora ele coloca todos os arquivos em um com x y Escala de cinza, mas não posso adicionar os valores z.

A propósito, demora muito tempo para criar o arquivo txt.

As primeiras linhas do arquivo XYZ final devem ser, por exemplo:

0 0 0 value in greyscale 1 0 0 value in greyscale '

e o último:

3095 2951 400 value in greyscale

Você me daria alguma pista, idéias ou soluções para fazer isso? Qualquer ajuda seria sinceramente apreciada.

    
por trıtog 13.09.2015 / 21:28

2 respostas

2

Eu usaria um script mais simples no ImageMagick e, em seguida, sed da saída. O problema está em determinar suas imagens Z.

Digamos que a imagem em Z = 27 seja DCM0027.tif e que você tenha imagens de 1 a 420.

Então você precisa gerar o nome do arquivo a partir do número e analisar o arquivo em si. Para facilidade de uso, o arquivo XYZ.txt é gerado de forma incremental:

 #!/bin/sh

 rm -f XYZ.txt
 for i in $( seq 1 420 ); do
      FILE=$( printf "DCM%04d.tif" )
      convert -depth 8 -colorspace gray $FILE txt:- \
         | sed -e "s/^\([0-9]*\),\([0-9]*\):.*gray(\([0-9]*\))/,,$i,/g' >> XYZ.txt
 done

O acima deve ser executado como um script (salvo em img.sh e assim por diante). Se você precisar que os números 1 e 420 sejam parametrizados, pode substituí-los por $ 1 e $ 2. Então você executaria img.sh 1 420 .

Outra possibilidade é redirecionar o próprio script:

 #!/bin/sh
 for i in $( seq $1 $2 ); do
      FILE=$( printf $3 )
      convert -depth 8 -colorspace gray $FILE txt:- \
         | sed -e "s/^\([0-9]*\),\([0-9]*\):.*gray(\([0-9]*\))/,,$i,/g'
 done

O texto acima exigiria tanto os números como a estrutura do nome do arquivo, e o redirecionamento para salvar os dados:

 img.sh 1 500 "DCM%04d.tif" > XYZ.txt

"% 04d" significa "quatro dígitos, zero preenchido". Portanto, 0001, 0002, 0003. Se os números forem, por exemplo, DCM1FILE.tif, DCM9FILE.tif, DCM10FILE.tif, etc., você usaria "DCM% dFILE.tif" como um padrão de arquivo.

Finalmente, se você precisar do número de arquivos .tif em uma pasta, você pode usar $( ls *.tif | wc -l ) (provavelmente existe uma maneira mais fácil):

 img.sh 1 $( ls DCM*.tif | wc -l) "DCM%04d.tif" > XYZ.txt
    
por 13.09.2015 / 22:34
0

Obrigado @Iserni, agradeço seu esforço, mas acho que não entendi seu roteiro.

A propósito, no final eu resolvi o problema, vou postar aqui, talvez seja útil para alguém.

De .tiff em tons de cinza a .txt em um arquivo, com coordenadas z, assim:

x y z Gray (always zero)

Para saber quando uma foto termina e outra começa, veja que o valor "z" é alterado. Para compilar: chmod +x ./script.sh e depois:

./script.sh>xyzfile.txt

Não se esqueça de ter na pasta APENAS as imagens e o script.

#!/bin/bash 
z=0 
for i in pic*; do
 z=$[$z+1] 
convert -depth 8 -colorspace Gray $i txt:- |
 tail -n +2 | tr -cs '0-9.\n' ' ' |
 while read x y Gray junk;
 do if [ "$Gray" -eq 0 ]; then 
echo "$x $y $z $Gray"
 fi
 done
 done 
    
por 14.09.2015 / 21:14