2017-02-23 77 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