
計算機視覺 - 特徵檢測與提取
什麼是特徵檢測和提取?
特徵檢測是識別影像中具有獨特特徵的特定點或模式的過程。
特徵提取涉及以可用於各種計算機視覺任務的方式描述這些檢測到的特徵。
這些步驟共同使計算機能夠更有效地理解和解釋視覺資料。
特徵型別
我們可以將特徵分為三種不同的型別,如下所示:
- 邊緣:這些是影像亮度急劇變化的邊界。它們表示影像中物件的輪廓。
- 角點:兩個或多個邊緣相遇的點。它們通常出現在不同形狀或物件的交匯處。
- 斑點:影像中與周圍區域相比,在亮度或顏色等屬性上有所不同的區域。
以下是特徵檢測和提取的一些常用技術:
- 邊緣檢測
- 角點檢測
- 斑點檢測
- 特徵描述符
邊緣檢測
邊緣檢測識別影像中亮度急劇變化的點。這有助於突出影像中物件的邊界。
常見的邊緣檢測方法如下所示:
- Sobel運算元:計算每個畫素處影像強度的梯度,從而突出邊緣。
import cv2 import numpy as np # Load image in grayscale image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE) # Apply Sobel operator sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=5) sobel_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=5) sobel_combined = cv2.sqrt(sobel_x**2 + sobel_y**2)
edges = cv2.Canny(image, 100, 200)
角點檢測
角點檢測識別影像中兩個或多個邊緣相交的點。角點可用於跟蹤和匹配不同影像之間的物件。
常見的角點檢測方法如下所示:
- Harris角點檢測器:使用角點得分相對於方向的微分來查詢角點。
corners = cv2.cornerHarris(image, 2, 3, 0.04)
corners = cv2.goodFeaturesToTrack(image, 100, 0.01, 10) corners = np.int0(corners) for corner in corners: x, y = corner.ravel() cv2.circle(image, (x, y), 3, 255, -1)
斑點檢測
斑點檢測識別影像中與周圍區域相比,在屬性上存在顯著差異的區域。斑點可以表示物件、形狀或感興趣區域。
常見的斑點檢測方法如下所示:
- 高斯-拉普拉斯運算元 (LoG):透過查詢影像拉普拉斯運算元的零交叉來檢測斑點。
- 高斯差分 (DoG):LoG的近似值,透過減去兩幅模糊影像來檢測斑點。
- SimpleBlobDetector:OpenCV中內建的方法,根據面積、圓形度和凸度等引數檢測斑點。
params = cv2.SimpleBlobDetector_Params() detector = cv2.SimpleBlobDetector_create(params) keypoints = detector.detect(image) im_with_keypoints = cv2.drawKeypoints(image, keypoints, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
特徵描述符
一旦檢測到特徵,特徵描述符就會以可用於匹配或識別的方式描述這些特徵。描述符將特徵的外觀和形狀編碼為數值向量。
常見的特徵描述符如下所示:
- 尺度不變特徵變換 (SIFT):檢測並描述影像中的區域性特徵,對尺度和旋轉不變。
sift = cv2.SIFT_create() keypoints, descriptors = sift.detectAndCompute(image, None)
surf = cv2.SURF_create() keypoints, descriptors = surf.detectAndCompute(image, None)
orb = cv2.ORB_create() keypoints, descriptors = orb.detectAndCompute(image, None)
特徵檢測和提取的應用
特徵檢測和提取用於各種計算機視覺應用,例如:
- 物件識別:識別和分類影像中的物件。
- 影像匹配:查詢相似影像或匹配不同影像之間的特徵。
- 運動跟蹤:跟蹤物件在一系列影像中的運動。
- 3D重建:從多個2D影像構建3D模型。
廣告