一、角點檢測
在計算機視覺中,角點檢測是識別圖像中局部區域(角點)的關鍵技術,這些區域通常是兩條或多條邊緣的交點,具有豐富的結構信息,常用于圖像匹配、跟蹤、三維重建等任務。
Harris角點檢測算法是一種常用的計算機視覺算法,用于檢測圖像中的角點。該算法通過計算圖像中每個像素的局部自相關矩陣,來判斷該像素是否為角點。
角點檢測算法的基本思想:
使用一個固定的小窗口在圖像上進行任意方向的滑動,比較滑動前與滑動后兩種情況,窗口中的像素灰度變化程度,如果存在任意方向上的滑動,都有著較大灰度變化(sobel算子,在圖像的邊緣檢測中有詳細解釋),那么我們可以認為該窗口中存在角點。
1、Harris 角點檢測(經典方法)
1.?原理
基于圖像局部灰度變化,通過計算像素點在x/y 方向的梯度,構建結構張量矩陣(梯度自相關矩陣),再通過響應函數判斷是否為角點:
角點指圖像中局部區域與周圍區域有較大灰度變化的點或像素。 cornerHarris(img, blockSize, ksize, k[, dst[, borderType]]) -> dst? img:單通道灰度圖像(數據類型為 float32)。? blockSize: 計算角點時考慮的鄰域大小(如 2 表示 2x2 鄰域)。? ksize:Sobel 梯度計算的核大小(常用 3)。? k: 響應函數中的參數,影響角點檢測的敏感度(k 越小,檢測到的角點越多)。,取值參數為 [0.04,0.06]。dst:返回numpy.ndarray對象,大小和src相同,值越大,對應像素點是角的概率越高
?1、圖片的讀取以及灰度轉換
img = cv2.imread('huanghelou.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
?2、檢測角點,并對響應值進行閾值處理
dst = cv2.cornerHarris(gray,4,3,0.04)
# 標記檢測到的角點
img[dst > 0.01 * dst.max()] = [0, 255, 0]
# 這里通過對角點響應進行閾值處理,標記出檢測到的角點。
# 0.05 * dst.max() 是一個閾值,大于這個值的像素點會被標記為綠色。
cv2.imshow('img',img)
cv2.waitKey(0)
2、Shi-Tomasi 角點檢測(Good Features to Track)
1.?原理
Harris 算法的改進版,直接利用矩陣?M?的最小特征值判斷角點:
- 若最小特征值大于閾值,則認為是角點(相比 Harris 更魯棒,尤其在圖像跟蹤中表現更好)。
2.?OpenCV 函數
corners = cv2.goodFeaturesToTrack(gray_img, maxCorners, qualityLevel, minDistance)
- 參數:
maxCorners
:最多檢測的角點數量(若角點數量超過,按響應值降序篩選)。qualityLevel
:角點質量閾值(0~1,值越小保留的角點越多,通常取 0.01~0.1)。minDistance
:角點之間的最小像素距離(避免密集角點)。
- 輸出:角點坐標數組(形狀為?
(N, 1, 2)
,N 為角點數量)。
3.?示例代碼
import cv2
import numpy as npimg = cv2.imread('building.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# Shi-Tomasi角點檢測
corners = cv2.goodFeaturesToTrack(gray, maxCorners=100, qualityLevel=0.01, minDistance=10)
corners = np.int0(corners) # 轉換為整數坐標# 繪制角點
for corner in corners:x, y = corner.ravel()cv2.circle(img, (x, y), 3, (0, 255, 0), -1) # 綠色圓點標記cv2.imshow('Shi-Tomasi Corners', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
3、FAST 角點檢測(快速角點檢測)
1.?原理
基于像素灰度差異的高效角點檢測算法,核心思想是:若某像素點與其周圍 16 個像素中的 N 個(如 9 個)灰度差異足夠大,則認為是角點(稱為 FAST-9)。
- 優點:速度極快,適合實時應用。
- 缺點:對噪聲敏感,需結合非極大值抑制(NMS)篩選角點。
2.?OpenCV 函數
fast = cv2.FastFeatureDetector_create(threshold=10, nonmaxSuppression=True)
corners = fast.detect(gray_img, None)
- 參數:
threshold
:灰度差異閾值(值越小,檢測到的角點越多)。nonmaxSuppression
:是否啟用非極大值抑制(建議設為 True,避免密集角點)。
- 輸出:
KeyPoint
?對象列表,包含角點坐標、大小等信息。
3.?示例代碼
import cv2img = cv2.imread('fast_corner.jpg', cv2.IMREAD_GRAYSCALE)# 創建FAST檢測器
fast = cv2.FastFeatureDetector_create(threshold=10, nonmaxSuppression=True)# 檢測角點
corners = fast.detect(img, None)# 繪制角點
img_color = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
cv2.drawKeypoints(img_color, corners, img_color, color=(0, 255, 0), flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)cv2.imshow('FAST Corners', img_color)
cv2.waitKey(0)
cv2.destroyAllWindows()
二、算法對比與選擇
算法 | 優點 | 缺點 | 適用場景 |
---|---|---|---|
Harris | 經典方法,檢測穩定 | 計算量大,角點密集 | 學術研究、全局角點檢測 |
Shi-Tomasi | 跟蹤效果好,抑制邊緣響應 | 依賴參數調優 | 圖像跟蹤(如 LK 光流) |
FAST | 速度極快,適合實時應用 | 對噪聲敏感,需 NMS | 實時系統(如無人機、機器人) |
三、注意事項
-
輸入圖像預處理:
- 必須為單通道灰度圖(彩色圖需先轉換為灰度圖)。
- 建議先進行高斯模糊降噪(如?
cv2.GaussianBlur
),減少噪聲對角點檢測的影響。
-
參數調優:
qualityLevel
(Shi-Tomasi)和?threshold
(FAST)需根據圖像對比度調整,避免檢測到過多或過少角點。minDistance
?用于控制角點密度,避免相鄰過近的角點。
-
角點響應可視化:
- Harris 的響應值需通過閾值(如全局最大值的 1%~5%)篩選后標記。
-
Shi-Tomasi 和 FAST 可直接通過坐標繪制角點。
總結
角點檢測是圖像特征提取的基礎步驟,OpenCV 提供了從經典(Harris)到高效(FAST)的多種算法。選擇時需結合場景需求:
- 追求精度和穩定性:Shi-Tomasi(推薦用于跟蹤任務)。
- 追求速度:FAST(需配合 NMS 和降噪)。
- 學術研究或通用場景:Harris(理解角點檢測的數學原理)。 通過合理調整參數和預處理,可有效提升角點檢測的效果,為后續計算機視覺任務奠定基礎。