我需要将 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 中分离通道很容易,就像对矩阵中的某些元素进行采样一样。