【问题标题】:Writing more than 4 channel images in OpenCV Python在 OpenCV Python 中编写超过 4 个通道的图像
【发布时间】:2017-09-04 05:21:16
【问题描述】:

这对我来说是一个持续的挑战。我正在尝试使用 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 错误:在 cv::imwrite_、文件 C:\builds\master_PackSlaveAddon-win32 中断言失败 (image.channels() == 1 || image.channels() == 3 || image.channels() == 4) -vc12-static\opencv\modules\imgcodecs\src\loadsave.cpp,第 455 行 回溯(最近一次通话最后): 文件“”,第 1 行,在 cv2.error: C:\builds\master_PackSlaveAddon-win32-vc12-static\opencv\modules\imgcodecs\src\loadsave.cpp:455: 错误: (-215) image.channels() == 1 || image.channels() == 3 || image.channels() == 4 在函数 cv::imwrite_

两张图片的尺寸相同 (900X1200)。我认为 openCV 不能将超过 4 个通道 (RGBA) 写入 tiff 图像,而且我没有找到另一种方法来编码该图像。

我正在考虑创建自己的函数来编写带有适当标头的二进制数据,但这比我想的要深得多。

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

【问题讨论】:

    标签: python image opencv numpy


    【解决方案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 通道图像。

    【讨论】:

      猜你喜欢
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-07
      • 1970-01-01
      • 2020-10-27
      相关资源
      最近更新 更多