将单通道图像混合成彩色图像

时间:2017-02-23 15:30:35

标签: bash imagemagick

每个代表一个频道,我想将它们合并为一个频道,如RGB图像。图像是RAW,因此没有文件头。我已设法将它们与

混合
cat imgPl0.raw imgPl1.raw imgPl2.raw >> img.rgb

但这是一个接一个地混合飞机,但有没有办法进行隔行扫描混音?

也许使用imagemagick有另一种方法吗?

嗯,我在输出中需要的是一个rgb图像(不是png,可悲的是imagemagick正在创建一个png作为输出),其中包含隔行扫描的数据。更明确地说,cat - 图像将使rgb图像平面交错(即rrrrrr ... ggggggg ... bbbbbbb)。我想要的是一个操作创建一个rgb图像行隔行扫描(即rrr ... ggg ... bbb ... rrr ... ggg ... bbb ... rrr ... ... GGG BBB ...)。很抱歉从一开始就不明确。

关于数据,它似乎是12 bpp或14 bpp little endian

2 个答案:

答案 0 :(得分:2)

ImageMagick提供了一些技巧,但您需要负责定义标头中缺少的所有信息。像图像大小,量子深度和颜色空间的东西。

一种方法。

 convert -size 70x46 -depth 8 \
         r:imgPl0.raw g:imgPl1.raw b:imgPl2.raw \
         -set colorspace RGB -combine -colorspace sRGB \
         output.rgb

另一种选择是创建一个空白画布,并将原始文件中的数据复制到正确的画布通道。

convert -size 70x46 xc: -depth 8 \
        r:imgPl0.raw -compose CopyRed -composite \
        g:imgPl1.raw -compose CopyGreen -composite \
        b:imgPl2.raw -compose CopyBlue -composite \
        -colorspace sRGB output.rgb

可以找到其他示例here

另请注意:我假设这些.raw数据文件只包含单个通道样本,是无符号字符颜色大小,并且图像大小为70x46。 YMMV

<强>更新

  

嗯,我在输出中需要的是一个rgb图像(不是png,遗憾的是imagemagick正在创建一个png作为输出)

很抱歉。只需将output.png切换为output.rgb即可。 ImageMagick将完成剩下的工作。

  

关于数据,它似乎是12 bpp或14 bpp little endian

-depth从8调整为12或每部分14位。 还有一个-endian LSB选项,但我认为不需要。

  

我想要的是一个操作,它正在创建一个rgb图像行隔行扫描

易。设置-interlace Line选项。

所以......我之前的回答仍然有用,但只需要一些额外的选择。

 convert -size 70x46 -depth 12 \
         r:imgPl0.raw g:imgPl1.raw b:imgPl2.raw \
         -set colorspace RGB -combine -colorspace sRGB \
         -interlace Line output.rgb

convert -size 70x46 xc: -depth 12 \
        r:imgPl0.raw -compose CopyRed -composite \
        g:imgPl1.raw -compose CopyGreen -composite \
        b:imgPl2.raw -compose CopyBlue -composite \
        -colorspace sRGB -interlace Line output.rgb

希望你能够离开。

答案 1 :(得分:0)

如果你的数据是每个样本8位,你可以这样做,虽然不是很有效,不需要任何代码编写或编译或任何东西:

#!/bin/bash

# Bytes per row
bpr=100
row=0


# Loop through all rows of file
while :; do
   # Read a row from each channel and output on stdout redirected to result.rgb
   for ((chan=0;chan<3;chan++)); do
      dd if=imgPl${chan}.raw bs=$bpr count=1 skip=$row > row.tmp 2> /dev/null
      [ ! -s row.tmp ] && exit
      cat row.tmp
   done
   ((row+=1))
done > result.rgb