[PYTHON] Faites attention au type lorsque vous créez un masque d'image avec Numpy

Chose que tu veux faire

Si vous souhaitez remplir une partie d'une image ou d'une vidéo en noir et la rogner, créez un masque pour l'image et superposez-la.

L'image originale lena.png Image masquée masked_image.png

Échec

Utilisez Numpy pour créer un masque dans lequel la zone que vous souhaitez noircir est 0 et la zone que vous souhaitez recadrer est 1. Quand j'ai pensé que je pouvais masquer en multipliant chaque élément de la matrice, le résultat était différent de ce à quoi je m'attendais.

h_img, w_img = img.shape[:2]
mask = np.zeros((h_img, w_img, 3))
radius = int(h_img / 2)
center = radius
cv2.circle(mask, (center, center), radius, (1, 1, 1), thickness=-1, shift=0)
masked_img = img * mask

Masque réalisé avec Numpy err_mask.png

Image masquée (masked_img) err_masked_image.png

Cause et solution

Lors de la définition d'une matrice avec Numpy, la valeur par défaut est le type float64 sauf si dtype est spécifié. En revanche, l'image lue par imread de opencv est lue par CV_8U, CV_16F, CV_32F (généralement CV_8U) en fonction de sa luminosité. Avec CV_8U, le type de données Numpy prend en charge np.uint8. En d'autres termes, dans l'exemple ayant échoué, l'image CV_8U est masquée avec un type float64.

Lors de la définition d'une matrice avec Numpy, spécifiez le type np.uint8. l'a fait.

mask = np.zeros((h_img, w_img, 3), dtype=np.uint8) #Spécifiez le type comme uint8

Image masquée masked_image.png

Lorsque j'essaye d'afficher le masque sous forme d'image, il fait noir. mask.png

Impressions

C'est une erreur rudimentaire d'inadéquation des types de données, mais il m'a fallu un certain temps pour le remarquer, probablement parce que je n'utilise que python ces derniers temps et que j'ai moins de chance d'être au courant du type. En premier lieu, au lieu de le définir dans np.zeros, j'aurais dû utiliser np.zeros_like pour définir la matrice incluant le type d'image.

Recommended Posts

Faites attention au type lorsque vous créez un masque d'image avec Numpy
Soyez prudent lors de la différenciation des vecteurs propres d'une matrice
Solution lorsque l'image ne peut pas être affichée avec tkinter [python]
Faites attention à LANG pour UnicodeEncodeError lors de l'impression du japonais avec Python 3
L'histoire de la fabrication d'un moule immuable
Soyez prudent lors de l'ajout d'un tableau à un tableau
Soyez prudent lorsque vous exécutez CakePHP3 avec PHP7.2
Soyez prudent lorsque vous récupérez des tweets à intervalles réguliers avec l'API Twitter
L'histoire de la création d'un outil pour charger une image avec Python ⇒ l'enregistrer sous un autre nom
Extraire la couleur de l'objet dans l'image avec le clustering Mask R-CNN et K-Means
[Python] Déterminez le type d'iris avec SVM
Soyez prudent lorsque vous travaillez avec des fichiers texte compressés au format gzip
[Attention] Lors de la création d'une image binaire (1 bit / pixel), faites attention au format de fichier!
Extraire le tableau des fichiers image avec OneDrive et Python
Soyez prudent lors de la lecture de données avec des pandas (spécifiez dtype)
Lors de la lecture d'une image avec SimpleITK, il y a un problème s'il y a du japonais dans le chemin
Créez un tableau à deux dimensions en ajoutant une ligne à la fin d'un tableau vide avec numpy
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
Les zéros NumPy peuvent être définis même avec une taille de 0
Maîtrisez le type avec Python? (Quand faire la vérification de type)
L'histoire de la création d'un bot de boîte à questions avec discord.py
Que faire lorsqu'une partie de l'image d'arrière-plan devient transparente lorsque l'image transparente est combinée avec Oreiller
Une méthode de conversion du style d'une image tout en préservant la couleur
Comprendre la fonction de convolution en utilisant le traitement d'image comme exemple
Soyez prudent lorsque vous spécifiez la valeur d'argument par défaut dans la série Python 3
Familiarisez-vous avec (voulez être) autour du pipeline de spaCy
Calculez la similitude entre les phrases avec Doc2Vec, une évolution de Word2Vec
[Statistiques] Saisir l'image de la théorie de la limitation du pôle central avec un graphe
ZipArchive n'a pas pu être utilisé avec l'image Laravel lancée sur ConoHa.
Considérez la vitesse de traitement pour déplacer le tampon d'image avec numpy.ndarray
[Pythonista] L'histoire de la réalisation d'une action pour copier le texte sélectionné
Solution lorsqu'une erreur se produit lors du masquage de l'écran de la console avec PyInstaller
L'histoire de la création d'un module qui ignore le courrier avec python
Un mémo lors de la création d'un environnement qui peut être débogué avec Lambda @ Edge pour le moment