web-dev-qa-db-fra.com

Comment enregistrer une image binaire (avec dtype = bool) en utilisant cv2?

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.

9
Vaibhav Dixit

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.

9
John

Convertissez l'image binaire en type de données "uint8".

Essaye ça:

>>> binary_image.dtype='uint8'
>>> cv2.imwrite('image.png', binary_image)
3
avereux

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.

1
ZdaR

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.

0
Ajay Jha
0
Nathan