2017-04-08 159 views
3

這對我來說是一個持續的挑戰。我試圖用openCV將兩個3 RGB圖像組合成一個6通道TIFF圖像。在OpenCV中編寫4個以上的通道圖像Python

到目前爲止,我的代碼如下:

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不能爲tiff圖像寫入超過4個通道(RGBA),並且我沒有找到替代方法來編碼此圖像。

我在創建我自己的函數來編寫帶有適當頭文件的二進制數據,但這種方式比我想去的要深。

openCV中有另一個函數,我可以使用它將工作,或另一個庫,可以寫這個numpy數組TIFF與6個通道?

回答

1

在OpenCV使用libpnglibtiff等模塊內部寫RGB圖像,作爲各種圖像表示格式,如jpgpng等假設的事實,即輸入陣列必須是一個單個信道,信道3或4頻道。該假設是爲了優化圖像的磁盤大小。但是在6通道矩陣中違反了相同的假設。

所以,你可以使用序列化庫像pickle,它一般可以用於任何序列化Python對象,在這種情況下,你想序列化numpy的矩陣,那麼它會正常工作,但是你將無法以利用pngjpg格式使用的壓縮技術。

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 

然而,如果你關心的是文件的大小,並希望使用的tiffpng等內存優化,那麼我會建議你到你的6通道圖像分割,以各種渠道和創造2個新的3通道矩陣,並在它們上使用imwrite進行保存,並在讀取時讀取這兩個圖像並將它們組合爲6通道圖像。

+0

謝謝你。雖然這不完全是我期待的,但它可以讓我做到我想要的。之前我沒有這樣想過。 – tpubbsGIS

相關問題