如何使用 cv2 保存二进制图像(dtype=bool)?

Posted

技术标签:

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

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

TypeError: image data type = 0 is not supported

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

【问题讨论】:

【参考方案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,应该大部分都解决了。

【讨论】:

以上是关于如何使用 cv2 保存二进制图像(dtype=bool)?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确使用 cv2.imwrite 通过 cv2.selectROI 在 openCV 中保存图像

图像算术运算——相加相减与或异或非

如何从 cv2.findContours 结果中重新创建带有孔的原始图像?

OpenCV 函数学习15-图像的加权加法(cv2.addWeight)

OpenCV 函数学习14-图像与标量相加(cv2.add)

OpenCV 函数学习13-图像的加法运算(cv2.add)