Basé sur le combat réel OpenCV (connaissances de base 2)

Table des matières

Introduction

1.Zone ROI

2. Rembourrage des limites

3. Calcul numérique

4.Fusion d'images


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 :

  1. src: L'image originale, c'est-à-dire l'image à remplir de bordures.

  2. 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.

  3. 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.
  4. value: Pour borderType=cv2.BORDER_CONSTANTles 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ésente src1la 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ésente src2la 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()

 

Je suppose que tu aimes

Origine blog.csdn.net/weixin_45303602/article/details/132462238
conseillé
Classement