10. opencv-python 이미지 처리의 최상위 작업(2) - 모서리 감지

Harris와 Shi-Tomas 알고리즘

학습 목표

Harris 및 Shi-Tomasi 알고리즘의 원리 이해

코너 감지를 위해 Harris 및 Shi-Tomasi를 활용하는 기능

1. 해리스 코너 감지

1. 원리

해리스 코너 포인트 검출의 아이디어는 이미지의 작은 로컬 창을 통해 이미지를 관찰하는 것인데, 코너 포인트의 특징은 창을 어느 방향으로든 움직이면 다음 그림과 같이 그레이스케일에 뚜렷한 변화가 발생한다는 것입니다. : 위의 아이디어를 수학적 형태, 즉
여기에 이미지 설명을 삽입하세요.
로컬로 변환하면 창이 모든 방향(u, v)으로 이동하고 모든 회색조 차이의 합이 계산됩니다. 식은 다음과 같습니다.
여기에 이미지 설명을 삽입하세요.
여기서 I(x, y)는 로컬 창의 이미지 회색조 및 I(x+u, y+v)는 변환입니다. 이미지의 회색조 다음 w(x, y)는 직사각형 창 또는 가우스 창이 될 수 있는 창 함수입니다. 이는 아래 그림과 같이 각 픽셀에 서로 다른 가중치를 할당합니다. 모서리 감지에서 E(u,
여기에 이미지 설명을 삽입하세요.
v )는 1차 Taylor 확장을 사용하여 가장 큰 값을 갖습니다.
여기에 이미지 설명을 삽입하세요.
여기서 Ix와 Iy는 x와 y에 따른 도함수입니다. 방향은 소벨 연산자로 계산할 수 있습니다.
파생은 다음과 같습니다:
여기에 이미지 설명을 삽입하세요.
M 행렬은 E(u, v)의 값을 결정합니다. 아래에서는 M을 사용하여 꼭지점을 찾습니다. M은 Ix와 Iy의 2차 항 함수로, 모양으로 표현될 수 있습니다. 타원의 긴 반축과 짧은 반축은 M λ 1 \lambda_1 의 고유값으로 제공됩니다.1그리고 λ 2 \lambda_22결정되면 방향은 다음 그림과 같이 고유벡터에 의해 결정됩니다.
여기에 이미지 설명을 삽입하세요.
타원 함수 고유값과 이미지의 모서리 점, 직선(모서리) 및 평면 간의 관계는 다음 그림과 같습니다.
여기에 이미지 설명을 삽입하세요.
위 그림에서 볼 수 있듯이 세 가지 상황으로 구분됩니다.

  • 이미지의 직선, 하나의 고유값은 크고 하나의 고유값은 작습니다. λ 1 \lambda_11>> λ 2 \lambda_22또는 λ 1 \lambda_11<< λ 2 \lambda_22. 타원 함수 값은 한 방향으로 크고 다른 방향으로 작습니다.
  • 이미지의 비행기. 두 고유값은 모두 작고 대략 동일하며, 타원 함수 값은 모든 방향에서 작습니다.
  • 이미지의 모서리 지점입니다. 두 고유값은 모두 크고 대략 동일하며 모든 이미지에서 타원 함수 값이 증가합니다.

Harris가 제시한 코너점 계산 방법은 특정 특징값의 계산이 필요하지 않고 코너 응답값 R을 계산하여 코너점을 결정합니다. R의 계산 공식은 다음과 같습니다:
여기에 이미지 설명을 삽입하세요.
여기서, detM은 행렬 M의 행렬식이고, TraceM은 행렬 M의 자취이며, α는 0.04~0.06 값 범위의 상수입니다. 실제로 특성은 detM과 TraceM에 내재되어 있습니다. 왜냐하면 :
여기에 이미지 설명을 삽입하세요.
그런 다음 다음과 같이 코너 포인트인지 여부를 판단합니다. 아래 그림과 같습니다.
여기에 이미지 설명을 삽입하세요.

  • R이 큰 양수일 때 코너 포인트입니다.
  • R이 큰 음수일 때의 경계입니다.
  • R이 소수이면 평평한 지역으로 간주됩니다.

2. 구체적인 구현

OpenCV에서 Harris 감지를 구현하는 데 사용되는 API는 다음과 같습니다.

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

매개변수

  • img: 데이터 유형이 float32인 입력 이미지입니다.
  • blockSize: 코너 감지 시 고려할 이웃 크기입니다.
  • ksize: 소벨 파생에 사용되는 커널 크기입니다.
  • k: 코너 검출 방정식의 자유 매개변수, 값 매개변수는 [0.04, 0.06]입니다.
    코드 예:
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()

얻은 결과는 다음과 같습니다.
여기에 이미지 설명을 삽입하세요.
해리스 코너 탐지의 장점과 단점:

이점:

  • 회전 불변성, 타원은 특정 각도로 회전하지만 모양은 변경되지 않습니다(고유값은 변경되지 않음).
  • 이미지 그레이스케일의 아핀 변환은 부분 불변성을 가지며, 이미지의 1차 도함수만 사용되므로 이미지 그레이스케일 변환 변환에는 불변이고 이미지 그레이스케일 변경에는 불변입니다.

결점:

  • 규모에 매우 민감하며 기하학적 규모 불변이 아님
  • 추출된 꼭지점은 픽셀 수준입니다.

2. 시토마스 코너 감지

1. 원리

Shi-Tomasi 알고리즘은 Harris 코너 감지 알고리즘을 개선한 것이며 일반적으로 Harris 알고리즘보다 더 나은 코너 포인트를 생성합니다. 해리스 알고리즘의 코너 응답 함수는 M의 자취에서 행렬 M의 행렬식 값을 빼고 그 차이를 이용하여 코너 포인트인지 여부를 판단하는 것입니다. 나중에 Shi와 Tomasi는 개선된 방법을 제안했습니다. 즉, 행렬 M의 두 고유값 중 작은 값이 임계값보다 크면 이를 꼭지점으로 간주합니다 . 즉, 다음 그림과
여기에 이미지 설명을 삽입하세요.
같습니다 . 그림에서, 단지 λ 1 \lambda_1
여기에 이미지 설명을 삽입하세요.
이라는 것을 알 수 있습니다.1그리고 λ 2 \lambda_22둘 다 최소값보다 크면 코너 포인트로 간주됩니다.

2. 깨닫다

API를 사용하여 OpenCV에서 Shi-Tomasi 코너 감지를 구현합니다.

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

매개변수

  • 이미지: 입력 회색조 이미지
  • maxCorners: 코너 포인트 수를 가져옵니다.
  • qualityLevel: 이 매개변수는 허용 가능한 가장 낮은 모서리 품질 수준(0~1)을 나타냅니다.
  • minDistance: 인접한 특징점을 피하기 위한 모서리 점 사이의 최소 유클리드 거리입니다.
    반품:
  • 코너: 검색된 코너 포인트, 품질 수준 이하의 코너 포인트를 모두 제외하고 적격 코너 포인트를 품질별로 정렬한 후 품질이 더 좋은(최소 유클리드 거리 미만) 코너 근처 코너 포인트를 삭제합니다. , 그리고 마지막으로 maxCorners 모서리를 찾아서 돌아옵니다.
    코드 예:
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()

처리된 결과 이미지는 다음과 같습니다.
여기에 이미지 설명을 삽입하세요.

요약하다

해리스 알고리즘

아이디어: 이미지의 작은 로컬 창을 통해 이미지를 관찰합니다. 모서리 지점의 특징은 창을 어떤 방향으로든 이동하면 이미지의 회색조가 뚜렷하게 변경된다는 것입니다.
API:

cv2.cornerHarris()

Shi-Tomasi 산법

Harris 알고리즘이 개선되어 코너 포인트를 더 잘 감지할 수 있습니다.
API:

cv2.goodFeatureToTrack()

추천

출처blog.csdn.net/weixin_44463519/article/details/126167013