2017-04-08 37 views
3

これは私にとって一変している課題です。私はopenCVを使って2つの3つのRGBイメージを1つの6チャンネルTIFFイメージに結合しようとしています。次のようにOpenCV Pythonで4チャンネル以上の画像を書き込む

これまでのところ、私のコードは次のとおりです。

import cv2 
import numpy as np 

im1 = cv2.imread('im1.jpg') 
im2 = cv2.imread('im2.jpg') 

merged = np.concatenate((im1, im2), axis=2) # creates a numpy array with 6 channels 

cv2.imwrite('merged.tiff', merged) 

私も(OpenCVのの分割を使用してみました)及び()メソッドをマージし、私が実行したときと同じ結果

import cv2 
import numpy as np 

im1 = cv2.imread('im1.jpg') 
im2 = cv2.imread('im2.jpg') 

b1,g1,r1 = cv2.split(im1) 
b2,g2,r2 = cv2.split(im2) 

merged = cv2.merge((b1,g1,r1,b2,g2,r2)) 

cv2.imwrite('merged.tiff', merged) 

を取得imwrite()関数次のエラーが発生しました。

 
OpenCV Error: Assertion failed (image.channels() == 1 || image.channels() == 3 || image.channels() == 4) in cv::imwrite_, file C:\builds\master_PackSlaveAddon-win32-vc12-static\opencv\modules\imgcodecs\src\loadsave.cpp, line 455 
Traceback (most recent call last): 
    File "", line 1, in 
cv2.error: C:\builds\master_PackSlaveAddon-win32-vc12-static\opencv\modules\imgcodecs\src\loadsave.cpp:455: error: (-215) image.channels() == 1 || image.channels() == 3 || image.channels() == 4 in function cv::imwrite_

両方の画像の寸法が同じです(900X1200)。私はopenCVが4つ以上のチャンネル(RGBA)をTIFF画像に書き込むことができないと思っています。この画像をエンコードする別の方法を見つけるのは無理です。

私は自分の関数を作成して適切なヘッダーを持つバイナリデータを作成するというアイデアを思いついていますが、それは私が行きたいよりも深いところです。

私はそれが動作するように使うことができるopenCVの別の関数、またはこのnumpyの配列を6チャンネルのtiffに書き込むことができる別のライブラリがありますか? OpenCVのがlibpng使用

答えて

1

libtiff等のモジュールは、内部入力配列は、単一のチャネル、3チャネルまたは4チャネルでなければならないということを想定jpgpng、等のような様々な画像表現形式としてRGB画像を書き込みます。イメージのディスクサイズを最適化することが前提です。しかし、同じ仮定は6チャネルマトリックスで違反されるだろう。

pickleのようなシリアライゼーションライブラリを使用することができますので、一般的にどのPythonオブジェクトもシリアル化するために使用できます。この場合、numpy行列をシリアル化したいのでうまく動作しますが、 pngまたはjpgフォーマットで使用される圧縮技術を利用することができます。あなたは、ファイルのサイズと懸念している、とさまざまなチャネルにあなたの6チャンネルの画像を分割して作成するために、私はあなたをお勧めしますなどtiffまたはpng、のメモリの最適化を使用したいがあれば

import numpy as np 
import pickle 

arr = np.ones((1000, 1000, 6), dtype=np.uint8) * 255 

with open("arr_dump.pickle", "wb") as f_out: 
    pickle.dump(arr, f_out) 

with open("arr_dump.pickle", "rb") as f_in: 
    arr_new = pickle.load(f_in) 
    print arr_new.shape 

2つの新しい3チャネルマトリクスを使用し、それらの上にimwriteを使用して保存し、読み込み中に両方の画像を読み取り、それらを6チャンネル画像に結合します。

+0

ありがとうございます。それは私が期待していたものではありませんが、私が望むものを正確に行うことができます。私は前にこのように考えなかった。 – tpubbsGIS

関連する問題