10. Opérations de haut niveau du traitement d'image opencv-python (2) - détection des coins

Algorithme de Harris et Shi-Tomas

objectif d'apprentissage

Comprendre les principes des algorithmes de Harris et Shi-Tomasi

Possibilité d'utiliser Harris et Shi-Tomasi pour la détection des coins

1. Détection des coins Harris

1. Principe

L'idée de la détection du point de coin Harris est d'observer l'image à travers une petite fenêtre locale de l'image. La caractéristique du point de coin est que déplacer la fenêtre dans n'importe quelle direction entraînera des changements évidents dans les niveaux de gris, comme le montre la figure suivante : Convertissez les idées ci-dessus sous forme mathématique, c'est-à-dire le
Insérer la description de l'image ici
local La fenêtre se déplace dans toutes les directions (u, v) et la somme de toutes les différences en niveaux de gris est calculée. L'expression est la suivante :
Insérer la description de l'image ici
où I(x, y) est le l'image en niveaux de gris de la fenêtre locale, et I(x+u, y+v) est la traduction. Après l'échelle de gris de l'image, w(x, y) est la fonction de fenêtre, qui peut être une fenêtre rectangulaire ou une fenêtre gaussienne qui attribue des poids différents à chaque pixel, comme le montre la figure ci-dessous : Dans la détection de coin, E(u,
Insérer la description de l'image ici
v ) a la plus grande valeur, en utilisant le développement de Taylor du premier ordre :
Insérer la description de l'image ici
où Ix et Iy sont les dérivées le long de x et y directions, qui peuvent être calculées avec l'opérateur sobel.
La dérivation est la suivante :
Insérer la description de l'image ici
La matrice M détermine la valeur de E(u, v). Ci-dessous, nous utilisons M pour trouver les points d'angle. M est la fonction du terme quadratique de Ix et Iy, qui peut être exprimée sous la forme d'un ellipse. Les demi-axes long et court de l'ellipse sont donnés par la valeur propre de M λ 1 \lambda_1je1et λ 2 \lambda_2je2Déterminée, la direction est déterminée par le vecteur propre, comme le montre la figure suivante :
Insérer la description de l'image ici
La relation entre les valeurs propres de la fonction elliptique et les points d'angle, les lignes droites (bords) et les plans de l'image est comme le montre la figure suivante : Comme Comme le
Insérer la description de l'image ici
montre la figure ci-dessus, elle est divisée en trois situations :

  • Une ligne droite dans l'image, une valeur propre est grande, une valeur propre est petite, λ 1 \lambda_1je1>> λ 2 \lambda_2je2ou λ 1 \lambda_1je1<< λ 2 \lambda_2je2. Les valeurs de la fonction elliptique sont grandes dans une direction et petites dans les autres directions.
  • avion dans l'image. Les deux valeurs propres sont petites et approximativement égales ; les valeurs de la fonction elliptique sont petites dans toutes les directions.
  • Points d'angle dans l'image. Les deux valeurs propres sont grandes et approximativement égales, et la valeur de la fonction elliptique augmente dans toutes les images.

La méthode de calcul du point d'angle donnée par Harris ne nécessite pas le calcul de valeurs de caractéristiques spécifiques, mais calcule une valeur de réponse d'angle R pour déterminer le point d'angle. La formule de calcul de R est :
Insérer la description de l'image ici
où, detM est le déterminant de la matrice M ; traceM est la trace de la matrice M ; α est une constante avec une plage de valeurs de 0,04 à 0,06. En fait, les caractéristiques sont implicites dans detM et traceM, parce que :
Insérer la description de l'image ici
Ensuite, nous jugeons s'il s'agit d'un point d'angle comme celui-ci : Comme le montre la figure ci-dessous :
Insérer la description de l'image ici

  • Points de coin lorsque R est un grand nombre positif.
  • Limite lorsque R est un grand nombre négatif.
  • Lorsque R est un nombre décimal, on considère qu’il s’agit d’une zone plate.

2. Mise en œuvre spécifique

L'API utilisée pour implémenter la détection Harris dans OpenCV est :

dst=cv.cornerHarris(src, blockSize, ksize, k)

paramètre

  • img : image d'entrée avec le type de données float32.
  • blockSize : taille du quartier à prendre en compte dans la détection des coins.
  • ksize : la taille du noyau utilisée pour la dérivation sobel.
  • k : Le paramètre libre dans l'équation de détection de coin, le paramètre de valeur est [0,04, 0,06].
    Exemple de code :
import cv2 as cv
import numpy as np 
import matplotlib.pyplot as plt
# 1 读取图像,并转换成灰度图像
img = cv.imread('./image/chessboard.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 2 角点检测
# 2.1 输入图像必须是 float32
gray = np.float32(gray)

# 2.2 最后一个参数在 0.04 到 0.05 之间
dst = cv.cornerHarris(gray,2,3,0.04)
# 3 设置阈值,将角点绘制出来,阈值根据图像进行选择
img[dst>0.001*dst.max()] = [0,0,255]
# 4 图像显示
plt.figure(figsize=(10,8),dpi=100)
plt.imshow(img[:,:,::-1]),plt.title('Harris角点检测')
plt.xticks([]), plt.yticks([])
plt.show()

Les résultats obtenus sont les suivants :
Insérer la description de l'image ici
Avantages et inconvénients de la détection de coin Harris :

avantage:

  • Invariance de rotation, l'ellipse tourne d'un certain angle mais sa forme reste inchangée (les valeurs propres restent inchangées)
  • La transformation affine des niveaux de gris de l'image a une invariance partielle. Puisque seule la dérivée première de l'image est utilisée, elle est invariante à la transformation de translation des niveaux de gris de l'image et invariante aux changements de niveaux de gris de l'image.

défaut:

  • Très sensible à l’échelle et non invariant géométriquement à l’échelle
  • Les points de coin extraits sont au niveau du pixel.

2. Détection des coins Shi-Tomas

1. Principe

L'algorithme Shi-Tomasi est une amélioration de l'algorithme de détection des coins de Harris et donne généralement de meilleurs points de coin que l'algorithme de Harris. La fonction de réponse de coin de l'algorithme de Harris consiste à soustraire la valeur déterminante de la matrice M de la trace de M et à utiliser la différence pour déterminer s'il s'agit d'un point de coin. Plus tard, Shi et Tomasi ont proposé une méthode améliorée : si la plus petite des deux valeurs propres de la matrice M est supérieure au seuil, elle est considérée comme un point d'angle , c'est-à-dire : comme le
Insérer la description de l'image ici
montre
Insérer la description de l'image ici
la figure suivante : De là figure, on voit que seul λ 1 \lambda_1je1et λ 2 \lambda_2je2Lorsque les deux sont supérieurs à la valeur minimale, cela est considéré comme un point d’angle.

2. Réalisez

Implémentez la détection des coins Shi-Tomasi dans OpenCV à l'aide de l'API :

corners = cv2.goodFeaturesToTrack ( image, maxcorners, qualityLevel, minDistance )

paramètre

  • image : entrée d'une image en niveaux de gris
  • maxCorners : obtenez le nombre de points d'angle
  • qualityLevel : ce paramètre indique le niveau de qualité de coin acceptable le plus bas, entre 0 et 1.
  • minDistance : la distance euclidienne minimale entre les points d'angle pour éviter les points caractéristiques adjacents.
    retour:
  • Coins : les points de coin recherchés, où tous les points de coin inférieurs au niveau de qualité sont exclus, puis les points de coin qualifiés sont triés par qualité, puis les points de coin proches des coins de meilleure qualité (inférieure à la distance euclidienne minimale) sont supprimés. , et enfin trouver les coins maxCorners et revenir.
    Exemple de code :
import numpy as np 
import cv2 as cv
import matplotlib.pyplot as plt
# 1 读取图像
img = cv.imread('./image/tv.jpg') 
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# 2 角点检测
corners = cv.goodFeaturesToTrack(gray,1000,0.01,10)  
# 3 绘制角点
for i in corners:
    x,y = i.ravel()
    cv.circle(img,(x,y),2,(0,0,255),-1)
# 4 图像展示
plt.figure(figsize=(10,8),dpi=100)
plt.imshow(img[:,:,::-1]),plt.title('shi-tomasi角点检测')
plt.xticks([]), plt.yticks([])
plt.show()

L'image traitée résultante ressemble à ceci :
Insérer la description de l'image ici

Résumer

Algorithme de Harris

Idée : observez l'image à travers une petite fenêtre locale de l'image. La caractéristique du point d'angle est que déplacer la fenêtre dans n'importe quelle direction entraînera des changements évidents dans les niveaux de gris de l'image.
API :

cv2.cornerHarris()

Arithmétique Shi-Tomasi

Les améliorations apportées à l'algorithme de Harris permettent de mieux détecter les points d'angle.
API :

cv2.goodFeatureToTrack()

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44463519/article/details/126167013
conseillé
Classement