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

2024-09-28 03:19:33 发布

您现在位置:Python中文网/ 问答频道 /正文

这对我来说是个持续的挑战。我正在尝试使用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不能为一个tiff图像编写超过4个通道(RGBA),而且我没有找到另一种方法来编码这个图像。

我想创建自己的函数,用适当的头来编写二进制数据,但这比我想做的要深入得多。

openCV中是否还有一个可以使用的函数,或者另一个可以用6个通道将这个numpy数组写入tiff的库?


Tags: 图像imageimportnumpynpmergedcv2opencv
1条回答
网友
1楼 · 发布于 2024-09-28 03:19:33

OpenCV在内部使用libpnglibtiff等模块来编写RGB图像,因为jpgpng等各种图像表示格式都假定输入数组必须是单通道、3通道或4通道。提出了优化图像磁盘大小的假设。但同样的假设在6通道矩阵中也会被违背。

因此,您可以使用像^{}这样的序列化库,它通常可以用于序列化任何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通道图像。

相关问题 更多 >

    热门问题