将 RGB 原始文件拆分为 3 个文件,每个通道一个文件?

将 RGB 原始文件拆分为 3 个文件,每个通道一个文件?

我需要将 RGB 原始文件转换为 3 个文件,每个文件包含红色、绿色和蓝色通道。

答案1

您尝试过 netpbm 工具吗?这适用于 R8G8B8 和其他 8 位 RGB 指令。

对于宽度 100 高度 200 RGB 顺序原始文件:

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

您现在将拥有 3 种pgm格式的灰度图文件,每个文件都带有.red .grn.blu.这些.pgm文件是几乎原始二进制格式,除了短标头之外,因此:

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

如果你真的想要这样的原始频道。或者,为了进一步处理:

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

您现在拥有三个ppm格式文件,它们是独立的 RGB 通道(另请参阅rgb3toppm)。这些可以使用ppmtoX例如转换为其他格式ppmtopng。使用“ white”代替第二个参数中的颜色,将每个参数保留为灰度。

Imagemagickconvert也可能很有用,它也可以处理 RGB、RGBA 和 16 位原始格式,并且有一个-separate分割通道的选项。

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

检查该-set colorspace选项是否适合您的输入。较新的版本允许您通过单个命令执行此操作,请参阅http://www.imagemagick.org/Usage/color_basics

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

R/G/B 将被写入image_0.raw image_1.raw image_2.raw文件


请注意,convert命令已根据帮助和反馈进行了更新斯蒂芬·查泽拉斯,从 ImageMagic-6.7.7 开始,色彩空间行为发生了一些变化,由于(我相信)使用 sRGB 而不是 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

答案2

使用 ksh93,您可以执行以下操作:

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

/opt/ast/bin/cut(是的,我知道,您的系统上没有,但很可能ksh93仍然有内置的)。

perl

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

仅使用标准 Unix 工具,您可以执行以下操作:

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

这些会将123123123123“文件”分成1111“红色”、2222“绿色”和3333“蓝色”。相反,如果您想要一个具有 的“红色”文件100100100100,它仍然是 RGB 文件,但其他颜色已被抑制,则需要调整上面的代码以输出其他颜色的额外 NUL 字节,或者您可以使用 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

答案3

您还可以使用 MATLAB 进行通道分离。读这个: http://blogs.mathworks.com/steve/2011/03/08/tips-for-reading-a-camera-raw-file-into-matlab/ 这显示了如何读取 RAW 数据。在 MATLAB 中分离通道很容易,就像对矩阵中的某些元素进行采样一样。

相关内容