J'utilise opencv dans python et je souhaite enregistrer une image binaire (dtype = bool). Si j'utilise simplement cv2.imwrite, j'obtiens l'erreur suivante:
TypeError: image data type = 0 is not supported
Quelqu'un peut il m'aider avec ça? L'image est censée fonctionner comme masque plus tard.
Vous pouvez utiliser ceci:
cv2.imwrite('mask.png', maskimg * 255)
Donc, cela le convertit implicitement en entier, ce qui donne 0 pour False
et 1 pour True
, et le multiplie par 255 pour créer un masque (bit-) avant de l'écrire. OpenCV est assez tolérant et écrit int64
images avec une profondeur de 8 bits (mais par exemple. uint16
images avec une profondeur de 16 bits). L'opération est pas effectuée sur place, vous pouvez donc toujours utiliser maskimg
pour l'indexation, etc.
Convertissez l'image binaire en type de données "uint8".
Essaye ça:
>>> binary_image.dtype='uint8'
>>> cv2.imwrite('image.png', binary_image)
Non OpenCV
n'attend pas l'image binaire au format d'un ndarray booléen. OpenCV
prend en charge uniquement np.uint8
, np.float32
, np.float64
, Puisque OpenCV est plus une bibliothèque de manipulation d'images, donc une image avec des valeurs booléennes n'a aucun sens, quand on pense à RGB
ou aux formats d'échelle de gris.
Le type de données le plus compact pour stocker une matrice binaire est uchar
ou dtype=np.uint8
, Vous devez donc utiliser ce type de données au lieu de np.bool
.
Si vous utilisez OpenCV, vous devriez envisager d'utiliser le format hsv pour battre l'image. Convertissez l'image BGR en HSV à l'aide de cv2.cvtColor()
, puis définissez votre image à l'aide de la fonction cv2.inRange()
.
Vous auriez besoin de valeurs pour les limites supérieure et inférieure de Teinte (h), Saturation (s) et Valeur (v). Pour cela, vous pouvez utiliser ce script ou créer le vôtre en l'utilisant comme référence.
Ce script est destiné à renvoyer des valeurs de limite inférieure et supérieure hsv pour l'entrée de flux vidéo en direct, mais avec des ajustements mineurs, vous pouvez également faire de même avec les entrées d'image.
Enregistrez l'image (type) binaire obtenue à l'aide de cv2.imwrite()
, et voilà. Vous pouvez également utiliser cette image binaire pour le masquage. Si vous avez encore des doutes, vous pouvez vous référer à ce script et il devrait effacer la plupart d'entre eux.
ndarray.astype('bool')
Voir cette page peut aider:
https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.ndarray.astype.html