文章目錄
- 一、角點檢測
- 1、定義
- 2、檢測流程
- 1)輸入圖像
- 2)圖像預處理
- 3)特征提取
- 4)角點檢測
- 5)角點定位和標記
- 6)角點篩選或后處理(可選)
- 7)輸出結果
- 二、Harris 角點檢測(經典方法)
- 1、參數解釋
- 2、圖片的讀取以及灰度轉換
- 3、檢測角點,并對響應值進行閾值處理
- 三、Shi-Tomasi 角點檢測(Good Features to Track)
- 1、參數解釋
- 2、代碼示例
- 四、FAST 角點檢測(快速角點檢測)
- 1、參數解釋
- 2、代碼示例
- 總結
一、角點檢測
1、定義
在計算機視覺中,角點檢測是識別圖像中局部區域(角點)的關鍵技術,這些區域通常是兩條或多條邊緣的交點,具有豐富的結構信息,常用于圖像匹配、跟蹤、三維重建等任務。
Harris角點檢測算法是一種常用的計算機視覺算法,用于檢測圖像中的角點。該算法通過計算圖像中每個像素的局部自相關矩陣,來判斷該像素是否為角點。
2、檢測流程
1)輸入圖像
將待檢測的圖像作為輸入。
2)圖像預處理
對輸入圖像進行必要的預處理,如灰度化、降噪等,以便更好地進行角點檢測。
3)特征提取
使用角點檢測算法對預處理后的圖像進行角點特征提取。常見的角點檢測算法有Harris角點檢測算法、Shi-Tomasi角點檢測算法等。
4)角點檢測
根據所選的角點檢測算法,計算圖像中的每個像素點的角點響應值,以判斷其是否為角點。具體算法會根據不同的方法而有所差異。
5)角點定位和標記
根據角點響應值,確定角點的位置,并進行標記。可以使用函數或算法來繪制或返回角點的位置信息。
6)角點篩選或后處理(可選)
根據具體需求,可以對檢測到的角點進行篩選或進行后處理操作,如非極大值抑制、閾值過濾等,以去除不準確的角點或增強有效的角點。
7)輸出結果
根據需要,可以將檢測到的角點的位置信息、圖像中繪制的標記或其他相關信息作為輸出結果。
二、Harris 角點檢測(經典方法)
1、參數解釋
角點指圖像中局部區域與周圍區域有較大灰度變化的點或像素。
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相同,值越大,對應像素點是角的概率越高
2、圖片的讀取以及灰度轉換
img = cv2.imread('huanghelou.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
3、檢測角點,并對響應值進行閾值處理
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)
三、Shi-Tomasi 角點檢測(Good Features to Track)
1、參數解釋
corners = cv2.goodFeaturesToTrack(gray_img, maxCorners, qualityLevel, minDistance)
參數:
maxCorners:最多檢測的角點數量(若角點數量超過,按響應值降序篩選)。
qualityLevel:角點質量閾值(0~1,值越小保留的角點越多,通常取 0.01~0.1)。
minDistance:角點之間的最小像素距離(避免密集角點)。
輸出:角點坐標數組(形狀為 (N, 1, 2),N 為角點數量)。
2、代碼示例
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()
四、FAST 角點檢測(快速角點檢測)
1、參數解釋
fast = cv2.FastFeatureDetector_create(threshold=10, nonmaxSuppression=True)
corners = fast.detect(gray_img, None)
參數:
threshold:灰度差異閾值(值越小,檢測到的角點越多)。
nonmaxSuppression:是否啟用非極大值抑制(建議設為 True,避免密集角點)。
輸出:KeyPoint 對象列表,包含角點坐標、大小等信息。
2、代碼示例
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()
總結
角點檢測是計算機視覺中的一種特征檢測方法,用于尋找圖像中的角點或者具有角點特征的圖像區域。角點是指圖像中突然改變方向的點,即在其周圍的不同方向上都有較大的灰度變化。角點具有一些特殊性質,如旋轉不變性、尺度不變性和光照不變性等,因此在圖像處理和計算機視覺中具有廣泛的應用。