Dividir o arquivo bruto RGB em 3 arquivos, um para cada canal?

2

Eu preciso converter um arquivo raw RGB em 3 arquivos contendo cada um dos canais vermelho, verde e azul.

    
por malat 22.02.2013 / 10:58

3 respostas

4

Já experimentou as ferramentas netpbm? Isso funcionará com o R8G8B8 e outros pedidos RGB de 8 bits.

Para um arquivo raw de ordem RGB de largura 100 a 200 graus:

rawtoppm -rgb 100 200 input.rgb > image.ppm
ppmtorgb3 image.ppm 

Agora, você terá 3% de arquivos de mapa cinza no formatopgm, cada um com sufixos .red .grn e .blu . Esses arquivos .pgm são quase um formato binário bruto, exceto pelo cabeçalho curto, então:

tail +4 image.red > image_r.raw
tail +4 image.grn > image_g.raw
tail +4 image.blu > image_b.raw

se você realmente quiser os canais brutos assim. Ou, para processamento adicional:

pgmtoppm red   image.red > image_red.ppm
pgmtoppm green image.grn > image_grn.ppm 
pgmtoppm blue  image.blu > image_blue.ppm

Agora você tem três arquivos em formato ppm , que são os canais RGB separados (consulte também rgb3toppm ). Estes podem ser convertidos para outros formatos usando ppmtoX , por ex. %código%. Use " ppmtopng " em vez da cor no segundo parâmetro para deixar cada uma como uma escala de cinza.

O white do Imagemagick também pode ser útil, ele também irá lidar com formatos raw RGB, RGBA e 16 bits, e tem uma opção convert para dividir canais.

for ch in R G B; do
  convert -set colorspace RGB -size 100x200 -depth 8 rgb:image.rgb \
      -channel ${ch} -separate -depth 8 gray:image_${ch}.raw
done

Verifique se a opção -separate é apropriada para sua entrada. As versões mais recentes permitem que você faça isso em um único comando, consulte o link

convert ... -channel RGB -separate gray:image_%d.raw

e R / G / B serão gravados em -set colorspace files

Nota, o comando image_0.raw image_1.raw image_2.raw foi atualizado com base na ajuda e no feedback de Stephane Chazelas , houve várias alterações no comportamento do espaço de cores do ImageMagic-6.7.7 que causam problemas devido ao (eu acredito) sRGB ser usado de RGB.
  # colorspace changes mean this works differently after ImageMagick-6.7.6
  convert -size 100x200 -depth 8 rgb:image.rgb \
      -channel ${ch} -separate -depth 8 gray:image_${ch}.raw
    
por 22.02.2013 / 12:35
0

Com o ksh93, você pode fazer:

command /opt/ast/bin/cut -r3 -Nb1 < file > red
command /opt/ast/bin/cut -r3 -Nb2 < file > green
command /opt/ast/bin/cut -r3 -Nb3 < file > blue

(sim, eu sei, não há /opt/ast/bin/cut no seu sistema, mas as chances são de que ksh93 ainda tenha um built-in para isso).

com perl :

perl -F -ane '
  BEGIN{
    $/=;
    map {open $f[$n++], ">", $_} qw{red green blue}
  }
  for $i (0..2) {print {$f[$i]} $F[$i]}'

Com apenas ferramentas padrão do Unix, você pode fazer:

od -vAn -tu1 < file |
  tr -cs 0-9 '[\n*]' |
  grep . |
  paste - - - |
  awk '{printf "%c", $1 > "red"
        printf "%c", $2 > "green"
        printf "%c", $3 > "blue"}'

Eles dividiriam um arquivo 123123123123 "em 1111 " red ", 2222 " green "e 3333 " blue ". Se, em vez disso, você quiser um arquivo "vermelho" que tenha 100100100100 , que ainda seja um arquivo RGB, mas em que as outras cores tenham sido suprimidas, será necessário adaptar o código acima para gerar os bytes NUL extras para as outras cores. ou você poderia usar um utilitário de manipulação de imagem como ImageMagick convert :

size=$(wc -c < file)
convert -size "1x$size" -channel GB -fx 0 rgb:- rgb:- < file > red
# ...and so on for green and blue
    
por 22.02.2013 / 11:23
0

Você também pode fazer a separação de canais usando o MATLAB. Leia isso: link Isso mostra como ler dados RAW. Separar canais no MATLAB é fácil, como amostrar alguns elementos na matriz.

    
por 02.06.2013 / 21:38