角点是图像亮度发生剧烈变化或者图像边缘曲线上曲率极大值的点。角点检测方法主要分两类:基于图像边缘的方法和基于图像灰度的方法。前者往往需要对图像边缘进行编码,这在很大程度上依赖于图像的分割和边缘提取,具有相当大的难度和计算量,且一旦待检测目标局部发生变化,很有可能导致操作的失败。基于图像灰度的方法通过计算点的曲率及梯度来检测角点,避免了第一类方法存在的缺点,是目前研究的重点。评价角点检测算法性能优劣主要从以下5个方面:
(1)准确性:即使很细小的角点,也能检测到;
(2)定位性:检测到的角点应尽可能地接近它们在图像中的真实位置;
(3)稳定性:对相同场景拍摄的多幅图片,每一个角点的位置都不应该移动;
(4)实时性:角点检测算法的计算量越小,运行速度越快越好;
(5)鲁棒性:对噪声具有抗干扰性。
基于图像边缘:Rosenfeld和Freeman等人的方法,后期有CCS等方法。基于图像灰度:Moravec算子、Forstener算子、Harris算子、SUSAN算子等。本文先介绍Harris算子,Harris算子具有平移和旋转不变性,对光照条件的变化不敏感:
1、先调用MATLAB函数检测图像Harris角点特征,其中I是输入的图像矩阵,C为角点量度矩阵,用来检测图像I中的角点信息,并与I同尺寸,C的值越大表示图像I中的像素越有可能是一个角点。
clear all;close all;clc;
I=imread('5.jpg');
I=rgb2gray(I);
subplot(1,3,1);imshow(I);title('yuan');
%生成角点度量矩阵
C=cornermetric(I,'harris');
C_adjusted=imadjust(C);%imadjust在数字图像处理中用于进行图像的灰度变换
subplot(1,3,2);imshow(C_adjusted);title('角点矩阵');
%寻找并显示Harris角点
corner_peaks=imregionalmax(C);
corner_idx=find(corner_peaks==true);
[r b g]=deal(I);
r(corner_idx)=255;
g(corner_idx)=255;
b(corner_idx)=0;
RGB=cat(3,r,g,b);
subplot(1,3,3);imshow(RGB);title('检测出的Harris角点');
2、(1)计算图像I(x,y)在X和Y方向的梯度Ix、Iy.
(2)计算图像两个方向梯度的乘积
(3)使用高斯函数对Ix^2、Iy.^2和Ixy进行高斯加权,生成矩阵M的元素A,B和C
(4)计算每个像元的Harris相应值R,并对于小于某一阈值t的R置为零
(5)在3*3,或5*5的领域内进行非最大值抑