iT邦幫忙

2025 iThome 鐵人賽

DAY 23
0
佛心分享-IT 人自學之術

OpwnCV影像處理新手村系列 第 23

🚀 DAY 23:進階特徵點檢測與描述(Feature Detection & Description)|SIFT

  • 分享至 

  • xImage
  •  

在 DAY22 中我們學會了 HarrisShi-Tomasi,能找出影像中的角點。
但這些方法雖然能找到角點,卻沒有提供每個角點的描述方式,因此無法直接用於影像比對。

本章將介紹經典的 SIFT(Scale-Invariant Feature Transform),它不僅能偵測關鍵點,還能提供特徵描述子(Feature Descriptors),用來做影像匹配、物件辨識等進階應用。


目錄

  1. SIFT 的特點
  2. 測試圖片準備
  3. SIFT 關鍵點偵測程式範例
  4. SIFT 特徵匹配程式範例
  5. 方法比較與補充說明

1. SIFT 的特點

  • 尺度不變性:無論影像縮放大小,關鍵點都能被偵測到。
  • 旋轉不變性:影像旋轉後,關鍵點依然能對應。
  • 光照穩定性:對於亮度改變仍具有一定的魯棒性。
  • 特徵描述子:每個關鍵點都會產生 128 維向量,可用於比對。

SIFT 的這些特性使其在物件辨識、場景重建、影像拼接等領域廣泛應用。


2. 測試圖片準備

準備兩張圖片(同一場景但縮放或旋轉不同),例如 box.jpgbox_in_scene.jpg

import cv2
import numpy as np

# 讀取兩張圖片
img1 = cv2.imread("box.jpg")
img2 = cv2.imread("box_in_scene.jpg")

img1_gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
img2_gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

cv2.imshow("Original img1", img1_gray)
cv2.imshow("Original img2", img2_gray)

# 將以下程式碼放在所有顯示語句的最後面
cv2.waitKey()
cv2.destroyAllWindows()

說明:
灰階影像能簡化計算,並保留角點偵測所需的亮度資訊。
在特徵點檢測前,通常會先進行去雜訊(如高斯模糊),以提升檢測品質。

原圖灰階


3. SIFT 關鍵點偵測程式範例

# 建立 SIFT 物件
sift = cv2.SIFT_create()

# 偵測關鍵點與描述子
keypoints, descriptors = sift.detectAndCompute(img1_gray, None)

# 畫出關鍵點
img_sift = cv2.drawKeypoints(img1, keypoints, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

cv2.imshow("SIFT Keypoints", img_sift)

程式說明:

  • detectAndCompute():同時偵測關鍵點 (keypoints)與計算描述子 (descriptors)
  • drawKeypoints():將關鍵點畫在影像上,圓圈大小代表關鍵點的尺度。

SIFT關鍵點檢測


4. SIFT 特徵匹配程式範例

# 建立 SIFT 物件
sift = cv2.SIFT_create()

# 偵測與計算特徵
kp1, des1 = sift.detectAndCompute(img1_gray, None)
kp2, des2 = sift.detectAndCompute(img2_gray, None)

# 建立 BFMatcher(暴力比對器)
bf = cv2.BFMatcher(cv2.NORM_L2, crossCheck=True)

# 匹配特徵
matches = bf.match(des1, des2)
matches = sorted(matches, key=lambda x: x.distance)

# 繪製前 20 個最佳匹配
img_matches = cv2.drawMatches(img1, kp1, img2, kp2, matches[:20], None, flags=2)

cv2.imshow("SIFT Matching", img_matches)

程式說明:

  • BFMatcher:暴力比對器,使用 L2 距離計算描述子相似度。
  • drawMatches():將兩張影像的匹配結果可視化,便於觀察匹配效果。

SIFT特徵匹配


5. 方法比較與補充說明

方法 是否有描述子 尺度/旋轉不變性 適用場景 優點 缺點
Harris 角點偵測 計算簡單、速度快 無法做影像比對
Shi-Tomasi 角點偵測、追蹤 角點品質高 無法做影像比對
SIFT 影像比對、辨識 穩定性高、描述能力強 計算較慢、專利限制

補充說明:

  • SIFT 產生的描述子可用於影像匹配、物件辨識、場景重建等進階應用。
  • SIFT 對於影像縮放、旋轉、光照變化具有高度魯棒性。
  • 若需即時應用,可考慮更快的 SURF、ORB 等方法(後續章節介紹)。
  • SURF(Speeded Up Robust Features)雖然速度快且效果佳,但因專利限制,OpenCV 預設版本通常無法直接使用,需額外安裝或設定才能啟用,因此本系列不再介紹 SURF 的特徵檢測方式,建議優先使用 SIFT 或 ORB 等開源且易用的方法。

🎯 今日結語

  1. SIFT 不僅能偵測特徵點,還能提供特徵描述子,支援影像匹配與辨識。
  2. 相較於 Harris / Shi-Tomasi,SIFT 更穩定且功能完整,適合實際應用。
  3. 特徵描述子是影像比對的關鍵,未來會學習 SURF、ORB 等更快的演算法。
  4. 實務上可根據需求選擇合適方法,並搭配前處理提升效果

上一篇
🚀 DAY 22:特徵點檢測(Feature Detection)|Harris Corner、Shi-Tomasi
下一篇
🚀 DAY 24:進階特徵點檢測與描述(Feature Detection & Description)|ORB
系列文
OpwnCV影像處理新手村24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言