我在python中使用opencv并想保存二进制图像(dtype = bool)。如果我只是使用cv2.imwrite,我会收到以下错误:
TypeError: image data type = 0 is not supported
有人可以帮我吗?该图像基本上应该在以后用作掩模。
答案 0 :(得分:3)
将二进制图像转换为' uint8'数据类型。
试试这个:
Sub DetermineLastWriteTime()
Const NUM_MINS As Double = 20
Dim myNameSpace As Outlook.NameSpace
Dim myInbox As Outlook.Folder
Dim myInboxItems As Outlook.Items
Dim myItem As Object, t, mins
Set myNameSpace = Application.GetNamespace("MAPI")
Set myInbox = myNameSpace.GetDefaultFolder(olFolderInbox)
Set myInboxItems = myNameSpace.GetDefaultFolder(olFolderInbox).Items
For Each myItem In myInboxItems
t = myItem.LastModificationTime
mins = (Now - t) * (24 * 60)
If mins <= NUM_MINS Then
Debug.Print t, mins
End If
Next myItem
End Sub
答案 1 :(得分:3)
您可以使用此:
cv2.imwrite('mask.png', maskimg.astype('uint8') * 255)
因此,这会将其转换为8位无符号整数,这将为False
提供0,为True
提供1,然后将其乘以255以形成(位)掩码,然后再进行写入。该操作不是就地完成 ,因此您仍然可以使用maskimg
进行索引等。
答案 2 :(得分:0)
否OpenCV
不希望二进制图像采用布尔ndarray的格式。 OpenCV
仅支持np.uint8
,np.float32
,np.float64
,因为OpenCV更像是一个图像处理库,所以当您想到{时,具有布尔值的图像毫无意义{1}}或灰度格式。
存储二进制矩阵的最紧凑数据类型是RGB
或uchar
,因此您需要使用此数据类型而不是dtype=np.uint8
。
答案 3 :(得分:0)
ndarray.astype('bool')
请参阅此页面可能有所帮助:
https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.ndarray.astype.html
答案 4 :(得分:0)
如果使用的是OpenCV,则应考虑使用hsv格式对图像进行脱粒。使用cv2.cvtColor()
将BGR图像转换为HSV,然后使用cv2.inRange()
函数对图像进行阈值处理。
您将需要色相(h),饱和度和值(v)的上限和下限值。为此,您可以使用this script或创建自己的参考文件。
此脚本旨在返回实时视频流输入的hsv上下限值,但进行细微调整后,您也可以对图像输入进行同样的操作。
使用cv2.imwrite()
保存获得的二进制(种类)图像,然后就可以了。您也可以使用此二进制图像进行遮罩。如果您仍然有任何疑问,可以参考this script,它应该可以消除大部分疑问。