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