计算机视觉——Harris角点检测
Harris角点检测原理
角点的概念
角点通常被定义为两条边的交点,更严格的说,角点的局部邻域应该具有两个不同区域的不同方向的边界。或者说,角点就是多条轮廓线之间的交点。
直观上或者从字面意思上很容易看出角点是什么,在哪里,那么从数字图像处理的角度来看的话,可以描述如下:
- 像素点附近区域像素无论是在梯度方向、还是在梯度幅值上都发生较大的变化。
- 一阶导数(即灰度的梯度)的局部最大所对应的像素点;
- 两条及两条以上边缘的交点;
- 图像中梯度值和梯度方向的变化速率都很高的点;
- 角点处的一阶导数最大,二阶导数为零,指示物体边缘变化不连续的方向。
角点检测的意义
首先角点是图像中很重要的特征,对图像图形的理解和分析有很重要的作用。角点在保留图像图形重要特征的同时,可以有效地减少信息的数据量,使其信息的含量很高,有效地提高了计算的速度,有利于图像的可靠匹配,使得实时处理成为可能。对于同一场景,即使视角发生变化,角点通常具备稳定性质的特征。
角点检测(Corner Detection)是计算机视觉系统中用来获得图像特征的一种方法,由于角点检测的实时性以及稳定性,广泛应用于运动检测、图像匹配、视频跟踪、三维建模和目标识别等领域中。角点作为一种特征点,角点检测也称为特征点检测。
在实际的视觉用用中,大多数的角点检测方法检测的是拥有特定特征的图像点,而不仅仅是“角点”。这些特征点在图像中有具体的坐标,并具有某些数学特征,如局部最大或最小灰度、某些梯度特征等。
Harris 角点检测
角点检测算法基本思想是使用一个固定窗口(取某个像素的一个邻域窗口)在图像上进行任意方向上的滑动,比较滑动前与滑动后两种情况,窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有着较大灰度变化,那么我们可以认为该窗口中存在角点。
首先我们用数学的方法描述一下窗口在图片上滑动时像素点灰度变化描述:
- [u,v]是窗口的偏移量
- (x,y)是窗口内所对应的像素坐标位置,窗口有多大,就有多少个位置
- w(x,y)是窗口函数
- I(x,y) 是平移前窗口某点的像素值,I(x+u,y_v)时窗口平移后对应点的像素值
我们通过对灰度变化部分(即有uv参加的部分)进行泰勒展开得到:
其中第一个约等于是对I(x+u,y+v)的一阶近似,其中Ix和Iy分别是像素在x,y方向上的梯度。下一个等号是对一阶近似后的式子化简再做平方展开得到的,改写成矩阵的形式侧可以得到最后的结果
所以我们可以将E(u,v)进行整理得
其中M是 2*2 矩阵,可由图像的导数求得:
Harris检测数学表达:
通过M的两个特征值的大小对图像点进行分类:
• R 只与M的特征值有关
• 角点:R 为大数值正数
• 边缘:R为大数值负数
• 平坦区:R为小数值
代码
# -*- coding: utf-8 -*-
from pylab import *