在電腦視覺中,特徵點(Feature Points) 是影像中具有代表性的位置,例如角落(Corners)、邊緣交會點。這些特徵點常被用來做 影像對齊、物件追蹤、3D 重建 等應用。
特徵點的選取對於後續的影像分析、物件辨識、運動估計等任務有關鍵影響。
今天我們來認識兩種經典的特徵檢測方法:
準備一張圖片 image.jpg
,放在與程式同一資料夾。
import cv2
import numpy as np
# 讀取影像並轉灰階
img = cv2.imread("image.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("Original", gray)
# 將以下程式碼放在所有顯示語句的最後面
cv2.waitKey()
cv2.destroyAllWindows()
說明:
灰階影像能簡化計算,並保留角點偵測所需的亮度資訊。
在特徵點檢測前,通常會先進行去雜訊(如高斯模糊),以提升檢測品質。
Harris 角點偵測基於灰階影像的梯度變化,當區域內同時在 x 與 y 方向 變化大時,該點就可能是「角點」。
此方法會計算每個像素周圍的梯度,並根據特定公式判斷是否為角點。
blockSize
:計算角點時考慮的鄰域大小。ksize
:Sobel 算子的大小,用於計算影像梯度。k
:Harris 角點偵測的自由參數,通常介於 0.04~0.06。img_harris = img.copy()
# Harris 角點檢測
gray_harris = np.float32(gray)
dst = cv2.cornerHarris(gray_harris, blockSize=2, ksize=3, k=0.04)
# 擴展角點顯示結果
dst = cv2.dilate(dst, None)
# 閾值處理,標記角點(紅色)
img_harris[dst > 0.01 * dst.max()] = [0, 0, 255]
cv2.imshow("Harris Corners", img_harris)
補充說明:
Harris 方法對雜訊較敏感,可能會偵測到非理想角點。可透過調整參數或前處理(如模糊)改善結果。
Shi-Tomasi 改進了 Harris 的判斷條件,挑選出更「好追蹤」的角點。
這個方法也是 OpenCV 中 cv2.goodFeaturesToTrack()
的核心,常用於物件追蹤、光流估計等。
maxCorners
:最多要偵測多少個角點。qualityLevel
:角點品質的最低門檻(0~1),越高則只保留更明顯的角點。minDistance
:角點間的最小距離,避免角點過於密集。img_shi = img.copy()
# 使用 Shi-Tomasi 偵測角點
corners = cv2.goodFeaturesToTrack(gray, maxCorners=50, qualityLevel=0.01, minDistance=10)
corners = corners.astype(int)
# 在原圖上畫出角點
for i in corners:
x, y = i.ravel()
cv2.circle(img_shi, (x, y), 4, (0, 255, 0), -1)
cv2.imshow("Shi-Tomasi Corners", img_shi)
補充說明:
Shi-Tomasi 方法能有效排除雜訊,挑選出更適合追蹤的角點,常用於物件追蹤與運動分析。
方法 | 優點 | 缺點 | 適用場景 |
---|---|---|---|
Harris | 計算簡單,速度快 | 雜訊多,角點品質參差不齊 | 影像匹配、粗略偵測 |
Shi-Tomasi | 角點品質高,適合追蹤 | 參數需調整,速度略慢 | 物件追蹤、光流估計 |
說明:
Harris 強調角點的數學特性,結果可能比較多雜訊。
Shi-Tomasi 更適合做「追蹤」用途,挑出的角點品質更佳。
實務上可根據需求選擇合適方法,或搭配其他特徵描述子(如 SIFT、ORB)提升效果。