在OpenCV Python中编写4个以上的通道图像

时间:2017-04-08 23:53:36

标签: python image opencv numpy

这对我来说是一个持续的挑战。我正在尝试使用openCV将两个3 RGB图像组合成一个6通道TIFF图像。

到目前为止,我的代码如下:

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的split()和merge()方法并获得相同的结果

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中的另一个函数,或者可以使用6个频道将这个numpy数组编写为tiff的另一个函数吗?

1 个答案:

答案 0 :(得分:1)

OpenCV在内部使用libpng等模块来编写RGB图像,因为各种图像表示格式如libtiffjpg等等都假设输入数组必须是单通道,3通道或4通道。假设优化图像的磁盘大小。但是在6通道矩阵中会违反相同的假设。

所以你可以使用像pickle那样的序列化库,它通常可以用来序列化任何Python对象,在这种情况下你想序列化一个numpy矩阵,所以它会正常工作,但是你赢了# 39;能够利用pngpng格式使用的压缩技术。

jpg

但是,如果您关注文件的大小,并希望使用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 tiff等内存优化,那么我建议您将6通道图像拆分为各种通道,创建2个新的3通道矩阵,并使用imwrite保存,并在阅读时读取两个图像并将它们组合成6通道图像。