图像特征学习——Harris角点检测(opencv-python)
本项目理论和源代码来自唐宇迪opencv项目实战
1 概述
图像的特征提取
一张图片中我们进行特征提取,主要分为平坦区域、边界区域和角点区域。本项目依据这三种类型的特征展开Harris角点检测的探究。
文末附代码
2 理论背景
Harris角点检测
如何分辨图像中的三中特征:角点、平坦区域、边界。
在图像中框出一个窗口,并在图像上小范围移动(△x,△y),计算移动前窗口图像的相关性。
自相关性表示为:
这一步在cv2.cornerHarris()函数中体现为第二个参数,表示窗口的大小。
从自相关性表达式中可以看出:该值越大,说明移动前后灰度变化越大;该值越小,说明移动前后灰度变化越小
特别的,我们更关注的是窗口内图像的中心部分。在自相关性的表达式中,增加了权值W(u, v),这个权值可以是常数也可以是高斯加权函数,高斯加权函数最常使用。
平方项中前一项是原窗口中(u,v)像素点的灰度值,后一项是移动后窗口中(u+△x+v+△y)像素点处的灰度值。
对每一个像素点都要进行计算,那么就需要对表达式进行简化。
基于泰勒展开式,对平方项中的后一项进行化简:
代入自相关性的表达式中,第一项消掉。其中Ix和Iy是偏导数。
近似得到:
将这个近似的表达式转化成三个矩阵的乘积。利用矩阵求出特征值。线性代数中特征值的分解,是将一个矩阵分解为如下形式
最后自相关性可以表达为: