【发布时间】:2017-11-19 03:13:54
【问题描述】:
我在 python 中使用 opencv 并想保存二进制图像(dtype=bool)。如果我只是使用 cv2.imwrite 我会收到以下错误:
TypeError: image data type = 0 is not supported
有人可以帮我解决这个问题吗?该图像基本上应该稍后用作掩码。
【问题讨论】:
我在 python 中使用 opencv 并想保存二进制图像(dtype=bool)。如果我只是使用 cv2.imwrite 我会收到以下错误:
TypeError: image data type = 0 is not supported
有人可以帮我解决这个问题吗?该图像基本上应该稍后用作掩码。
【问题讨论】:
否 OpenCV 不希望二进制图像采用布尔 ndarray 格式。 OpenCV 仅支持 np.uint8、np.float32、np.float64,因为 OpenCV 更像是一个图像处理库,所以当您想到 RGB 或灰度格式时,具有布尔值的图像毫无意义。
存储二进制矩阵最紧凑的数据类型是uchar或dtype=np.uint8,所以你需要使用这种数据类型而不是np.bool。
【讨论】:
将二进制图像转换为 'uint8' 数据类型。
试试这个:
>>> binary_image.dtype='uint8'
>>> cv2.imwrite('image.png', binary_image)
【讨论】:
ndarray.astype('bool')
查看此页面可能会有所帮助:
https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.ndarray.astype.html
【讨论】:
你可以用这个:
cv2.imwrite('mask.png', maskimg * 255)
因此,这会将其隐式转换为整数,即为False 提供 0,为True 提供 1,并在写入之前将其乘以 255 以生成(位)掩码。 OpenCV 非常宽容,可以写入 8 位深度的 int64 图像(但例如 uint16 16 位深度的图像)。该操作没有就地完成,因此您仍然可以使用maskimg 进行索引等。
【讨论】:
如果您使用的是 OpenCV,则应考虑使用 hsv 格式对图像进行脱粒。使用cv2.cvtColor() 将BGR 图像转换为HSV,然后使用cv2.inRange() 函数对图像进行阈值处理。
您需要 Hue(h)、Saturation(s) 和 Value(v) 的上限和下限值。为此,您可以使用this script 或创建您自己的用作参考。
此脚本旨在返回实时视频流输入的 hsv 下限值和上限值,但稍作调整后,您也可以对图像输入执行相同操作。
使用cv2.imwrite()保存获得的二进制(种类)图像,然后就可以了。您也可以使用此二进制图像进行遮罩。如果你还有什么疑惑,可以参考this script,应该大部分都解决了。
【讨论】: