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 Image masquée
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
Image masquée (masked_img)
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
Lorsque j'essaye d'afficher le masque sous forme d'image, il fait noir.
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