Was ist eine Ecke?
Eine Ecke kann als Verbindung zweier Kanten interpretiert werden (wobei eine Kante eine plötzliche Änderung der Bildhelligkeit darstellt).

Shi-Tomasi-Eckenerkennung -

Shi-Tomasi Corner Detection wurde von J. Shi und C. Tomasi in ihrer Arbeit ' Good Features to Track ' veröffentlicht. Hier besteht die grundlegende Intuition darin, dass Ecken erkannt werden können, indem nach einer signifikanten Änderung in alle Richtungen gesucht wird.

Wir betrachten ein kleines Fenster auf dem Bild und scannen dann das gesamte Bild nach Ecken.

Das Verschieben dieses kleinen Fensters in eine beliebige Richtung würde zu einer großen Änderung des Erscheinungsbilds führen, wenn sich dieses bestimmte Fenster zufällig an einer Ecke befindet.

Flache Regionen ändern sich in keiner Richtung.



Wenn es eine Kante gibt, gibt es keine größere Änderung entlang der Kantenrichtung.

Mathematischer Überblick -

Für ein Fenster (W) bei (X, Y) mit der Pixelintensität I (X, Y) lautet die Formel für die Shi-Tomasi-Eckendetektion -

f (X, Y) = Σ (I (X k , Y k ) - I (X k + & Delta; X, Y k + & Delta; Y)) 2 ,   wobei (X k , Y k ) ε W

Nach der Formel:
Wenn wir das Bild mit einem Fenster wie mit einem Kernel scannen und feststellen, dass es einen Bereich gibt, in dem sich eine große Änderung ergibt, unabhängig davon, in welche Richtung wir tatsächlich scannen, haben wir eine gute Intuition dass es dort wahrscheinlich eine Ecke gibt.

Die Berechnung von f (X, Y) ist sehr langsam. Daher verwenden wir die Taylor-Erweiterung, um die Bewertungsfunktion R zu vereinfachen.

R = min (λ 1 , λ 2 )
wobei λ 1 , λ 2 Eigenwerte der resultierenden Matrix sind

Mit goodFeaturesToTrack()Funktion -

Syntax: cv2.goodFeaturesToTrack (grey_img, maxc, Q, minD)

Parameter:
grey_img - Graustufenbild mit Integralwerten
maxc - Maximale Anzahl der gewünschten Ecken (geben Sie einen negativen Wert an, um alle Ecken zu erhalten)
Q - Parameter der Qualitätsstufe (bevorzugter Wert = 0,01)
maxD - Maximaler Abstand (bevorzugter Wert = 10)

    
import cv2 
import numpy as np 
import matplotlib.pyplot as plt 
%matplotlib inline 
  
img = cv2.imread('chess.png') 
  
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
  
corners = cv2.goodFeaturesToTrack(gray_img, 100, 0.01, 10) 
  
corners = np.int0(corners) 
  
for i in corners: 
    x, y = i.ravel() 
    cv2.circle(img, (x, y), 3, (255, 0, 0), -1) 
  
plt.imshow(img) 
  
if cv2.waitKey(0) & 0xff == 27
    cv2.destroyAllWindows() 

Eingabe:

Ausgabe :