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

时间:2017-06-16 11:00:44

标签: python opencv cv2

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

TypeError: image data type = 0 is not supported

有人可以帮我吗?该图像基本上应该在以后用作掩模。

5 个答案:

答案 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.uint8np.float32np.float64,因为OpenCV更像是一个图像处理库,所以当您想到{时,具有布尔值的图像毫无意义{1}}或灰度格式。

存储二进制矩阵的最紧凑数据类型是RGBuchar,因此您需要使用此数据类型而不是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,它应该可以消除大部分疑问。