特征检测与匹配
边缘检测
边缘是图像强度函数快速变化的地方。
- 平滑:尽可能抑制噪声,而不破坏真实边缘。
- 增强:应用过滤器增强图像中边缘的质量(锐化)。
- 检测:确定哪些边缘像素应作为噪声丢弃,以及应该保留(通常,阈值提供了用于检测的标准)。
- 定位:确定边缘的准确位置(亚像素分辨率对于某些应用程序可能需要,也就是说,估计边缘的位置要比像素之间的间距更好)。在这个步骤中,通常需要进行边缘细化和连接。
Sobel 算子
带噪声的边缘检测
Canny 算子
- 使用高斯滤波器,以平滑图像,滤除噪声。
- 计算图像中每个像素点的梯度强度和方向。
- 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。
- 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
- “滞后”阈值:
- 定义两个阈值:低和高
- 使用高阈值启动边缘曲线,使用低阈值继续它们
- “跟随”边缘从强边缘像素开始
- “滞后”阈值:
- 通过抑制孤立的弱边缘最终完成边缘检测。
高斯拉普拉斯算子(LoG)
当边缘不是很锐利的时候,LoG的零交叉效果比梯度更好。
关键点检测
- 检测:找出一组与众不同的关键点。
- 描述:提取每个兴趣点周围的特征描述符作为向量。
- 匹配:计算特征向量之间的距离以找到对应关系。
Harris 角点检测
将 M 特征值分解:
根据λ1,λ2的值我们可以把其分为三类:
- λ1,λ2都很小且近似,E在所有方向接近于常数;
- λ1>>λ2,或者λ2>>λ1, E在某一方向上很大;
- λ1,λ2都很大且近似,E在所有方向上很大。
- 高斯模糊,计算 Ix,Iy;
- 计算 I x 2 , I y 2 Ix^2,Iy^2 Ix2,Iy2;
- 高斯模糊;
- 计算 C;
- C 阈值检测;
- 非极大值抑制。
非极大值抑制算法(Non-maximum suppression,NMS)的本质是搜索局部极大值,抑制非极大值元素。
close all
clear all
I = imread('empire.jpg');
I = rgb2gray(I);
I = imresize(I,[500,300]);
imshow(I);
sigma = 1;
halfwid = sigma * 3;
[xx, yy] = meshgrid(-halfwid:halfwid, -halfwid:halfwid);
Gxy = exp(-(xx .^ 2 + yy .^ 2) / (2 * sigma ^ 2));
Gx = xx .* exp(-(xx .^ 2 + yy .^ 2) / (2 * sigma ^ 2));
Gy = yy .* exp(-(xx .^ 2 + yy .^ 2) / (2 * sigma ^ 2));
%%apply sobel in herizontal direction and vertical direction compute the
%%gradient
%fx = [-1 0 1;-1 0 1;-1 0 1];
%fy = [1 1 1;0 0 0;-1 -1 -1];
Ix = conv2(I,Gx,'same');
Iy = conv2(I,Gy,'same');
%%compute Ix2, Iy2,Ixy
Ix2 = Ix.*Ix;
Iy2 = Iy.*Iy;
Ixy = Ix.*Iy;
%%apply gaussian filter
h = fspecial('gaussian',[6,6],1);
Ix2 = conv2(Ix2,h,'same');
Iy2 = conv2(Iy2,h,'same');
Ixy = conv2(Ixy,h,'same');
height = size(I,1);
width = size(I,2);
result = zeros(height,width);
R = zeros(height,width);
Rmax = 0;
%% compute M matrix and corner response
for i = 1:height
for j =1:width
M = [Ix2(i,j) Ixy(i,j);Ixy(i,j) Iy(i,j)];
R(i,j) = det(M) - 0.04*(trace(M)^2);
if R(i,j)> Rmax
Rmax = R(i,j);
end
end
end
%% compare whith threshold
count = 0;
for i = 2:height-1
for j = 2:width-1
if R(i,j) > 0.01*Rmax
result(i,j) = 1;
count = count +1;
end
end
end
%non-maxima suppression
result = imdilate(result, [1 1 1; 1 0 1; 1 1 1]);
[posc,posr] = find(result == 1);
imshow(I);
hold on;
plot(posr,posc,'r.');
Harris-Laplace 检测子
Harris 可以平移不变,但是放缩不行。Harris-Laplace 检测子建立 Harris 函数的多尺度空间,然后计算每个尺度里的局部 cornerness 角程度最大值,作为初始点;然后验证每一个初始点在LoG在尺度空间是否是极值点,不是极值点则删除。
使用 DoG 代替 LoG 算子:
Harris-Laplace检测子原理及实现
DoG算子和LoG算子