如何使用 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.uint8
、np.float32
、np.float64
,因为 OpenCV 更像是一个图像处理库,所以当您想到 RGB
或灰度格式时,具有布尔值的图像毫无意义。
存储二进制矩阵最紧凑的数据类型是uchar
或dtype=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)