Harris角点检测及其数据分析
文章目录
一、针对角点的概述
角点是图像很重要的特征之一,对图像图形的理解和分析有很重要的作用。
角点在保留图像图形重要特征的同时,可以有效地减少信息的数据量,使其信息的含量很高,有效地提高了计算的速度,有利于图像的可靠匹配,使得实时处理成为可能。
从图像分析的角度来定义角点可以有以下定义:
角点是局窗口沿各方向移动,均匀产生明显变化的点,也是图像局部曲率突变的点。
典型的角点检测算法:
1、Harris角点检测
2、CSS角点检测
二、HARRIS角点检测思想
本次主要介绍的Harris角点检测的算法原理。Harris角点检测算法是最简单的角点检测方法之一。下面是Harris角点检测基本原理
1、人眼对角点的识别通常是在一个局部的小区域或小窗口完成的。如果在各个方向上移动这个特征的小窗口,窗口内区域的灰度发生了较大的变化,那么就认为在窗口内遇到了角点。
2、如果这个特定的窗口在图像各个方向上移动时,窗口内图像的灰度没有发生变化,那么窗口内就不存在角点;
3、如果窗口在某一个方向移动时,窗口内图像的灰度发生了较大的变化,而在另一些方向上没有发生变化,那么,窗口内的图像可能就是一条直线的线段。如下图:
三、HARRIS角点检测数学表达
1、将图像窗口平移【u,v】产生灰度变化E(u,v)。其中窗口函数(权重矩阵)可以是平坦的,也可以是高斯的如下图(权重矩阵W(通常为高斯滤波器)。
2、那我们该如何求解图中的I(x+u,y+v),以及E(u,v)?
延伸知识点:
一元函数泰勒展开
二元函数泰勒展开
将I(x+u, y+v)函数在(x, y)处泰勒展开,得:
于是对于局部微小的移动量 [u,v],可以近似得到下面的表达:
其中M是 22 矩阵,可由图像的导数求得:
窗口移动导致的图像变化量:实对称矩阵M的
特征值分析:
四、HARRIS角点计算流程
对角点响应函数R进行阈值处理:
R > threshold
提取R的局部极大值
PS:为了消除参数k的影响,也可采用商来计算响应:
Harris 角点的描述子通常是由角点周围像素块的灰度值,以及用于比较的归一化互相关矩阵构成的。其中,两个(相同大小)像素块I1(x) 和I2(x) 的相关矩阵定义为:
基础的互相关矩阵为f (I1(x), I2(x))=I1(x)∙I2(x),等同于矩阵点乘。而归一化互相关是相关矩阵的变形,具体为:
五、HARRIS基础算法代码
# -*- coding: utf-8 -*-
from pylab import *
from PIL import Image
from PCV.localdescriptors import harris
"""
Example of detecting Harris corner points (Figure 2-1 in the book).
"""
# 读入图像
im = array(Image.open('C:/Users/admin/Desktop/convert_images_format_test/b.2.jpg').convert('L'))
# 检测harris角点
harrisim = harris.compute_harris_response(im)
# Harris响应函数
harrisim1 = 255 - harrisim
figure()
gray()
#画出Harris响应图
subplot(141)
imshow(harrisim1)
print harrisim1.shape
axis('equal')
threshold = [0.01, 0.05, 0.1]
for i, thres in enumerate(threshold):
filtered_coords = harris.get_harris_points(harrisim, 6, thres)
subplot(1, 4<