【问题标题】:How to save a binary image(with dtype=bool) using cv2?如何使用 cv2 保存二进制图像(dtype=bool)?
【发布时间】:2017-11-19 03:13:54
【问题描述】:

我在 python 中使用 opencv 并想保存二进制图像(dtype=bool)。如果我只是使用 cv2.imwrite 我会收到以下错误:

TypeError: image data type = 0 is not supported

有人可以帮我解决这个问题吗?该图像基本上应该稍后用作掩码。

【问题讨论】:

    标签: python opencv cv2


    【解决方案1】:

    OpenCV 不希望二进制图像采用布尔 ndarray 格式。 OpenCV 仅支持 np.uint8np.float32np.float64,因为 OpenCV 更像是一个图像处理库,所以当您想到 RGB 或灰度格式时,具有布尔值的图像毫无意义。

    存储二进制矩阵最紧凑的数据类型是uchardtype=np.uint8,所以你需要使用这种数据类型而不是np.bool

    【讨论】:

      【解决方案2】:

      将二进制图像转换为 'uint8' 数据类型。

      试试这个:

      >>> binary_image.dtype='uint8'
      >>> cv2.imwrite('image.png', binary_image)
      

      【讨论】:

        【解决方案3】:
        ndarray.astype('bool')
        

        查看此页面可能会有所帮助:

        https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.ndarray.astype.html

        【讨论】:

        • OP 要求使用 CV2 的解决方案
        【解决方案4】:

        你可以用这个:

        cv2.imwrite('mask.png', maskimg * 255)
        

        因此,这会将其隐式转换为整数,即为False 提供 0,为True 提供 1,并在写入之前将其乘以 255 以生成(位)掩码。 OpenCV 非常宽容,可以写入 8 位深度的 int64 图像(但例如 uint16 16 位深度的图像)。该操作没有就地完成,因此您仍然可以使用maskimg 进行索引等。

        【讨论】:

        • 似乎也可以简单地工作为:` cv2.imwrite("mask.png", 255 * binary_image) `
        【解决方案5】:

        如果您使用的是 OpenCV,则应考虑使用 hsv 格式对图像进行脱粒。使用cv2.cvtColor() 将BGR 图像转换为HSV,然后使用cv2.inRange() 函数对图像进行阈值处理。

        您需要 Hue(h)、Saturation(s) 和 Value(v) 的上限和下限值。为此,您可以使用this script 或创建您自己的用作参考。

        此脚本旨在返回实时视频流输入的 hsv 下限值和上限值,但稍作调整后,您也可以对图像输入执行相同操作。

        使用cv2.imwrite()保存获得的二进制(种类)图像,然后就可以了。您也可以使用此二进制图像进行遮罩。如果你还有什么疑惑,可以参考this script,应该大部分都解决了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-07-12
          • 1970-01-01
          • 2020-02-27
          • 2018-02-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-12
          相关资源
          最近更新 更多