Table des matières
Introduction
OpenCV est une bibliothèque de vision par ordinateur open source populaire développée par Intel Corporation. Il fournit plus de 2 500 algorithmes d'optimisation et de nombreuses boîtes à outils pour les applications de traitement d'images et de vision par ordinateur telles que les niveaux de gris, les couleurs, la profondeur, les fonctionnalités et le suivi de mouvement. OpenCV est principalement écrit en langage C++, mais prend également en charge Python, Java, C et d'autres langages. En raison de son open source et de ses caractéristiques largement utilisées, il a été largement utilisé dans les domaines de la vision par ordinateur et de l'apprentissage automatique.
1.Zone ROI
Intercepter la zone d'intérêt : Dans une image, nous n'avons peut-être besoin que d'une partie de celle-ci, alors comment intercepter cette partie ?
Dans l'article précédent, nous avons mentionné que l'essence d'une image peut être représentée par un ensemble de tableaux
Alors pouvons-nous utiliser le découpage pour sélectionner la zone souhaitée ?
import cv2
image = cv2.imread('image/1.jpg')
cat = image[250:500, 250:500]
cv2.imshow('IMG', cat)
cv2.waitKey(0)
cv2.destroyAllWindows()
Nous savons qu'une image est un ensemble de données tridimensionnelles. Puisque nous découpons sur un plan pour obtenir la zone souhaitée, pouvons-nous segmenter ses canaux ?
import cv2
import numpy as np
image = cv2.imread('image/1.jpg')
# cat = image[250:500, 250:500]
# cv2.imshow('IMG', cat)
b,g,r = cv2.split(image)
cat = np.hstack((b,g,r))
cv2.imshow('IMG',cat)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.split()
Est une fonction d'OpenCV utilisée pour diviser des images multicanaux en images individuelles monocanal.
Pourquoi sont-elles toutes grises ? Parce que les images extraites sont essentiellement monocanal.
Alors, que dois-je faire si je veux la photo rouge ?
La première idée : extraire les trois canaux séparément, puis créer un tableau vide similaire aux données d'image, et enfin le remplir avec le canal souhaité.
La deuxième idée : Recopier les valeurs des deux autres couches à 0, en ne gardant que la couche couleur souhaitée.
import cv2
import numpy as np
image = cv2.imread('image/1.jpg')
img = image.copy()
b, g, r = cv2.split(img)
arr = np.zeros_like(image)
arr[:, :, 2] = r
print(arr)
cv2.imshow('IMG',arr)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
image = cv2.imread('image/1.jpg')
img = image.copy()
img[:,:,0] = 0
img[:,:,1] = 0
cv2.imshow('IMG', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. Rembourrage des limites
En traitement d'image, les méthodes de remplissage de limites couramment utilisées sont les suivantes :
Remplissage constant : remplit la bordure avec une valeur de pixel fixe. Il peut être implémenté via cv2.copyMakeBorder()
des fonctions et spécifié borderType=cv2.BORDER_CONSTANT
.
Répliquer le remplissage : copie la valeur du pixel de limite dans la limite de l'image. Il peut être implémenté via cv2.copyMakeBorder()
des fonctions et spécifié borderType=cv2.BORDER_REPLICATE
.
Reflect Padding : remplissez les valeurs des pixels limites en miroir. Il peut être implémenté via cv2.copyMakeBorder()
des fonctions et spécifié borderType=cv2.BORDER_REFLECT
.
import cv2
import numpy as np
image = cv2.imread('image/1.jpg')
top_size, bottom_size, left_size, right_size = (50, 50, 50, 50)
replicate = cv2.copyMakeBorder(image, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(image, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT)
constant = cv2.copyMakeBorder(image, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_CONSTANT,
value=0)
# print(image)
#
result = np.hstack((constant,reflect, replicate))
cv2.imshow('IMG', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
Lors de l'utilisation cv2.copyMakeBorder()
de fonctions de remplissage de limites, plusieurs paramètres doivent être compris et définis :
-
src
: L'image originale, c'est-à-dire l'image à remplir de bordures. -
top
,bottom
,left
,right
: Spécifiez la taille des bordures à ajouter au-dessus, en dessous, à gauche et à droite de l'image. Vous pouvez définir une taille différente pour chaque limite individuellement ou vous pouvez leur attribuer la même valeur. -
borderType
: Spécifiez la méthode de remplissage des limites. Les options de paramètres couramment utilisées incluent :cv2.BORDER_CONSTANT
: Remplissage constant, utilise une valeur de pixel fixe pour remplir la limite.cv2.BORDER_REPLICATE
: Copier le remplissage, copiez la valeur du pixel de bordure dans la bordure de l'image.cv2.BORDER_REFLECT
: Remplissage de réflexion, remplissant les valeurs des pixels limites de manière miroir.cv2.BORDER_WRAP
: Copiez le remplissage de la bordure, copiez le bord horizontal ou vertical de l'image sur la bordure correspondante.
-
value
: PourborderType=cv2.BORDER_CONSTANT
les cas uniquement, spécifie la valeur constante à utiliser pour remplir la limite. Peut être un scalaire (une seule valeur numérique) ou un tuple contenant des valeurs numériques correspondant au nombre de canaux d'image.
3. Calcul numérique
Le premier est l'addition au niveau numpy. ps prendra automatiquement le reste de 255 si la valeur dépasse 255.
import cv2
import numpy as np
image1 = cv2.imread('image/car.jpg')
image2 = cv2.imread('image/circle.jpg')
# img = np.array(image1)
image1_1= image1 + 10
print(np.array(image1[:5,:,0]))
print(np.array(image1_1[0:5,:,0]))
La seconde est la fonction fournie par opencv
cv2.add(image1,image2) doit s'assurer que la taille des images est la même
import cv2
import numpy as np
image1 = cv2.imread('image/car.jpg')
image2 = cv2.imread('image/circle.jpg')
if image1.shape != image2.shape:
image2 = cv2.resize(image2, (image1.shape[1], image1.shape[0]))
# img = np.array(image1)
image1_1 = image1 + 10
result = cv2.add(image1 ,image2)
print(np.array(image1[:5, :, 0]))
print(np.array(result[:5, :, 0]))
Contrairement à numpy, sa valeur ne dépassera pas 255
4.Fusion d'images
cv2.addWeighted()
La fonction est la fonction utilisée pour la fusion d'images dans OpenCV
La syntaxe de la fonction est la suivante :
dst = cv2.addWeighted(src1, alpha, src2, beta, gamma)
-
src1
: La première image d’entrée à fusionner. -
alpha
: Le coefficient de poids de la première image d'entrée. Il représentesrc1
la proportion de l'image dans le résultat de la fusion. -
src2
: La deuxième image d’entrée à fusionner. -
beta
: Le coefficient de poids de la deuxième image d'entrée. Il représentesrc2
la proportion de l'image dans le résultat de la fusion. -
gamma
:Paramètre de réglage de la luminosité. Il s'agit d'un paramètre facultatif utilisé pour ajuster davantage la luminosité du résultat de la fusion. -
La première chose à noter est que les formes des deux images à fusionner doivent être cohérentes, sinon elles ne pourront pas être fusionnées.
Comme suit
import cv2
image1 = cv2.imread('image/1.jpg')
image2 = cv2.imread('image/lena.jpg')
blended_image = cv2.addWeighted(image1, 0.6, image2, 0.4, 0)
cv2.imshow('IMG', blended_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Donc avant de fusionner, nous devons définir la forme de l’image pour qu’elle soit cohérente.
import cv2
image1 = cv2.imread('image/1.jpg')
image2 = cv2.imread('image/lena.jpg')
# 调整两个图像的大小以保持一致
image1 = cv2.resize(image1, (500, 500))
image2 = cv2.resize(image2, (500, 500))
blended_image = cv2.addWeighted(image1, 0.6, image2, 0.4, 0)
cv2.imshow('IMG', blended_image)
cv2.waitKey(0)
cv2.destroyAllWindows()