【问题标题】:mix single channel images into color image将单通道图像混合成彩色图像
【发布时间】:2017-07-14 04:20:56
【问题描述】:

每个代表一个通道,我想将它们合并为一个通道,例如 RGB 图像。图像是RAW,所以没有文件头。我设法将它们与

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

但这是一个接一个地混合平面,但有没有办法进行交错混合?


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


好吧,我在输出端需要的是一个包含交错数据的 rgb 图像(不是 png,遗憾的是 imagemagick 正在创建一个 png 作为输出)。更明确地说,cat-ing 图像将使 rgb 图像平面交错(即 rrrrrr...gggggg...bbbbbbb)。我想要的是一个操作,它正在创建一个 rgb 图像行交错(即 rrr...ggg...bbb...rrr...ggg...bbb...rrr ...ggg ... bbb ...)。很抱歉从一开始就没有明确表达。

关于数据,好像是 12 bpp 或 14 bpp little endian

【问题讨论】:

  • bash 对图像文件一无所知,cat 也不知道;你需要一个可以做到的程序。
  • 对不起,我以为在bash中有一种方法可以做到,但也可能是imagemagick。我编辑了问题
  • 在纠正您的问题时,您还应该指出每个样本的数据是 8 位还是 16 位。

标签: bash imagemagick


【解决方案1】:

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

希望你能接近。

【讨论】:

  • 你写的很好,但我发现这不是我真正需要的,所以我更新了问题,
【解决方案2】:

如果您的数据是每个样本 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

【讨论】:

    猜你喜欢
    • 2014-01-24
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多