特征點檢測與匹配在計算機視覺中的作用至關重要,它為圖像處理、物體識別、增強現實等領域提供了堅實的基礎。
目錄
Harris角點檢測
SIFT(尺度不變特征變換)
SURF(加速穩健特征)
ORB(Oriented FAST and Rotated BRIEF)
總結
特征點檢測與匹配是計算機視覺中的一項基本任務,廣泛應用于圖像拼接、3D重建、目標識別等領域。在MATLAB中,可以使用各種算法進行特征點檢測和匹配,比如Harris角點檢測、SIFT(尺度不變特征變換)、SURF(加速穩健特征)和ORB(Oriented FAST and Rotated BRIEF)等。
Harris角點檢測
Harris角點檢測是一種經典的圖像特征點檢測方法,主要用于檢測圖像中的角點(即局部區域內灰度變化較大的點),廣泛應用于圖像對齊、拼接、運動估計等任務。
Harris角點檢測算法原理:
Harris角點檢測算法基于圖像梯度信息,計算每個像素點的自相關矩陣(Hessian矩陣)來衡量其是否為角點。該方法的關鍵步驟包括:
- 圖像梯度計算:計算圖像在水平和垂直方向上的梯度。
- 構造自相關矩陣:每個像素的自相關矩陣由梯度信息構成,用來衡量該點是否為角點。
- 角點響應函數:使用Harris響應函數來確定角點的位置。
- 非極大值抑制:在圖像中選擇最大響應值的點作為角點。
Harris角點響應函數:
Harris響應函數 R 是通過以下公式計算的:
MATLAB中的Harris角點檢測:
MATLAB提供了一個內置的detectHarrisFeatures
函數,可以直接用于檢測Harris角點。
% 讀取圖像
img = imread('01.png');% 轉換為灰度圖像
grayImg = rgb2gray(img);% 使用Harris角點檢測
points = detectHarrisFeatures(grayImg);% 顯示檢測到的角點
figure;
imshow(grayImg);
hold on;
plot(points.selectStrongest(500)); % 顯示前50個最強角點
title('Harris角點檢測結果');% 保存標記角點后的圖像到本地
saveas(gcf, 'Harris_Corner_Detection_Result.png');
結果分析:
- 角點的質量:Harris角點檢測的一個重要特性是可以計算角點的質量值(響應值)。這些值越大,表示角點的穩定性和可靠性越高。
- 應用場景:Harris角點通常用于圖像的配準、拼接、三維重建等任務,特別是在圖像變化較小或僅發生輕微變形時,角點具有較好的魯棒性。
SIFT(尺度不變特征變換)
SIFT(尺度不變特征變換)
SIFT(尺度不變特征變換,Scale-Invariant Feature Transform)是一種廣泛應用于計算機視覺領域的特征檢測和描述算法,旨在提取圖像中的不變特征,以便在不同尺度、旋轉、光照條件下進行匹配和識別。SIFT能夠從圖像中檢測出對尺度變化、旋轉和光照變化具有不變性的局部特征點,并生成描述符。
SIFT算法的步驟:
- 尺度空間極值檢測:通過對圖像應用不同尺度的高斯模糊,創建尺度空間。然后在尺度空間中查找極值點,作為潛在的特征點。
- 關鍵點定位:進一步精確定位特征點的位置,剔除低對比度和邊緣響應較弱的點。
- 方向賦值:為每個特征點分配一個或多個主方向,使得特征點對于旋轉不變。
- 特征描述符生成:根據特征點的局部鄰域生成描述符,這些描述符能夠在不同圖像之間進行匹配。
% 讀取圖像
img = imread('01.png');% 轉換為灰度圖像(如果原圖是彩色圖)
grayImg = rgb2gray(img);% 檢測圖像中的SIFT特征點
points = detectSIFTFeatures(grayImg);% 提取特征描述符
[features1, validPoints] = extractFeatures(grayImg, points);% 顯示檢測到的SIFT特征點
figure;
imshow(img);
hold on;
plot(validPoints.selectStrongest(50), 'showOrientation', true); % 顯示前50個最強的SIFT特征點
title('SIFT 特征點檢測');
% 保存圖像到本地
saveas(gcf, 'SIFT_Corner_Detection_Result.png'); % 保存為PNG格式
代碼解釋:
-
讀取和預處理圖像:
img = imread('01.png');
讀取圖像。grayImg = rgb2gray(img);
將圖像轉換為灰度圖。
-
SIFT特征點檢測:
points = detectSIFTFeatures(grayImg);
檢測圖像中的SIFT特征點。
-
提取特征描述符:
[features1, validPoints] = extractFeatures(grayImg, points);