2017-02-23 30 views
0

每个代表一个通道,我想合并成一个单一的像RGB图像。图像是RAW,所以没有文件头。我已经设法将它们混合在一起混合单通道图像到彩色图像

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

但这是混合飞机一个接一个,但有没有办法做隔行混合?


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


那么,我需要在输出是RGB图像(不是PNG,可悲的是ImageMagick的是创造一个PNG作为输出)包含交错的数据。为了更加明确,图像将使rgb图像平面交错(即rrrrrr ... ggggggg ... bbbbbbb)。我想要的是操作这是创建一个rgb图像行交错(即rrr ... ggg ... bbb ... rrr ... ggg ... bbb ... rrr ... ggg。 ..bbb ...)。对不起,从一开始就不明确。

关于数据,现在看来,这是12 BPP或14 BPP小尾数

+0

'bash'不知道任何关于图像文件的东西,也不是'猫';你需要一个程序。 – chepner

+0

对不起,我认为有一种方法可以在bash中完成,但它也可能是imagemagick。我编辑了问题 – sop

+1

在纠正您的问题时,您还应该指出数据是8位还是16位。 –

回答

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。 因人而异

更新

那么,我需要在输出是RGB图像(不是PNG,可悲的是ImageMagick的是创建一个PNG作为输出)

对不起那。只需切换output.pngoutput.rgb。 ImageMagick将完成剩下的工作。

关于数据,似乎它是12 BPP或14 BPP小端

从8调整-depth至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 

。希望得到您关闭的。

+0

你写了一个很好的答案,但我发现这不是我真正需要的,所以我更新了这个问题, – sop

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