Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 将单通道图像混合到彩色图像中_Bash_Imagemagick - Fatal编程技术网

Bash 将单通道图像混合到彩色图像中

Bash 将单通道图像混合到彩色图像中,bash,imagemagick,Bash,Imagemagick,每个代表一个通道,我想把它们合并成一个通道,就像RGB图像一样。图像是原始的,因此没有文件头。我已经设法把它们和其他东西混在一起了 cat imgPl0.raw imgPl1.raw imgPl2.raw >> img.rgb 但是这是一个接一个地混合平面,但是有没有办法进行交错混合呢 也许使用imagemagick还有另一种方法 嗯,我在输出时需要的是一个rgb图像(不是png,不幸的是imagemagick正在创建一个png作为输出),其中包含隔行扫描的数据。更明确地说,c

每个代表一个通道,我想把它们合并成一个通道,就像RGB图像一样。图像是原始的,因此没有文件头。我已经设法把它们和其他东西混在一起了

cat imgPl0.raw imgPl1.raw imgPl2.raw >> img.rgb
但是这是一个接一个地混合平面,但是有没有办法进行交错混合呢


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


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


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

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
还可以找到其他例子

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

更新

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

很抱歉。只需将
output.png
切换到
output.rgb
。剩下的就交给ImageMagick了

关于数据,似乎是12个基点或14个基点的小端点

将深度从8调整到12,或每部分14位。 还有一个选择,但我认为不需要

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

简单。设置选项


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

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


希望您能如愿以偿。

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
还可以找到其他例子

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

更新

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

很抱歉。只需将
output.png
切换到
output.rgb
。剩下的就交给ImageMagick了

关于数据,似乎是12个基点或14个基点的小端点

将深度从8调整到12,或每部分14位。 还有一个选择,但我认为不需要

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

简单。设置选项


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

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


希望您能接近。

如果您的数据是每个样本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
#/bin/bash
#每行字节数
bpr=100
行=0
#循环浏览文件的所有行
while:;做
#从每个通道读取一行,并将标准输出重定向到result.rgb
对于((chan=0;chan row.tmp 2>/dev/null)
[!-s row.tmp]&退出
cat row.tmp
完成
((行+=1))
完成>结果.rgb

如果您的数据是每个样本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
!/bin/bash
#每行字节数
bpr=100
行=0
#循环浏览文件的所有行
当:;做
#从每个通道读取一行,并将标准输出重定向到result.rgb
对于((chan=0;chan row.tmp 2>/dev/null)
[!-s row.tmp]&退出
cat row.tmp
完成
((行+=1))
完成>结果.rgb

bash
对图像文件一无所知,cat也不知道;您需要一个这样的程序。对不起,我认为bash中有一种方法可以做到这一点,但也可能是imagemagick。我在更正问题时编辑了问题,您还应该指出每个样本的数据是8位还是16位。
bash
不知道“我对图像文件一无所知,
cat
;您需要一个这样做的程序。对不起,我认为在bash中有一种方法可以做到这一点,但它也可能是imagemagick。我在更正问题的同时编辑了问题,您还应该指出每个样本的数据是8位还是16位。您写了一个很好的答案,但我发现这一点这不是我真正需要的,所以我更新了问题,你写了一个很好的答案,但我发现这不是我真正需要的,所以我更新了问题,