Classificando arquivos de imagem usando informações de cabeçalho

3

Eu tenho vários arquivos de imagem dentro de um diretório com a mesma extensão (.mrc). No terminal, se eu fizer, cabeçalho, ele dá a seguinte saída:

 RO image file on unit   1 : FoilHole_17224697_Data_18256098_18256099_20150819_2015.mrc     Size=      65537 K

         This file has invalid axis indices, adjusting them to 1,2,3

 Number of columns, rows, sections .....    4096    4096       1
 Map mode ..............................    2   (32-bit real)              
 Start cols, rows, sects, grid x,y,z ...    0     0     0    4096   4096      1
 Pixel spacing (Angstroms)..............   1.000      1.000      1.000    
 Cell angles ...........................    0.000    0.000    0.000
 Fast, medium, slow axes ...............    X    X    X
 Origin on x,y,z .......................    0.000       0.000       0.000    
 Minimum density .......................   2056.0                               
 Maximum density .......................   4462.0                               
 Mean density ..........................   3213.5                               
 tilt angles (original,current) ........   0.0   0.0   0.0   0.0   0.0   0.0
 Space group,# extra bytes,idtype,lens .        0        0        0        0

     1 Titles :
EMAN 9/18/2015 15:41 

Estou procurando um script em que eu possa especificar um intervalo para o valor "Mean density" e os arquivos selecionados que contêm seu valor "Mean density" nesse intervalo são copiados para um novo diretório.

NB: Header é um programa do pacote de processamento de imagem IMOD. Para mais informações sobre a função 'cabeçalho' visite plaese: link

    
por Tofayel 19.09.2015 / 09:14

2 respostas

4

A menos que você tenha ferramentas dedicadas para listar informações sobre o seu arquivo .mrc, sugiro que você use alguma linguagem de script que tenha o recurso de empacotamento / descompactação e que possa manipular valor flutuante, como o perl, por exemplo. Se a saída que você acabou de imprimir é a saída de um comando, então você pode do grep em um loop for:

$!/bin/sh

treshold=42.0
for file in *.mrc
do
mean_density=$(header $file | grep "Mean density" | awk '{print $2}')
if [ $(echo "$mean_density>$treshold" | bc) -eq 1 ]
then
    echo "$i match!"
fi
done

Editar,

assumindo que o comando "header" imprimirá o cabeçalho do seu arquivo .mrc em um formato que você está citando em sua pergunta. Se você não tem tal programa, então a função perl unpack é definitivamente o que você precisa.

    
por 19.09.2015 / 09:33
0

Se o intervalo que você está procurando é algo como 3.000 - 3.999, o comando

grep -L -E "^Mean density \.+ 3\d\d\d(\.\d+)?$" *.mrc

deve imprimir a lista de arquivos com a densidade média que você está procurando. Regexes mais complicados são possíveis. Ou, se precisar executar header para obter o formato legível, você enviará a saída para egrep e testará o valor de retorno for f in *.mrc .

    
por 19.09.2015 / 09:35