Python计算机视觉——Harris角点检测

Python计算机视觉——Harris角点检测

  • Harris角点检测
    • 概念
      • 角点
      • 角点检测
    • 原理
      • 算法的基本思想
        • 梯度计算
        • 响应值计算
        • 角点提取
      • Harris角点检测流程
    • 实现
      • 实验要求
      • 代码
      • 结果
        • 1.边缘丰富区域
          • 1.1正面
          • 1.2侧面
          • 1.3旋转
          • 1.4远近对比(近)
          • 1.5光暗对比(暗)
        • 2.纹理角点丰富区域
          • 2.1正面
          • 2.2侧面
          • 2.3旋转
          • 2.4远近对比(远)
          • 2.5光暗对比(暗)
        • 3.纹理平坦区域
          • 3.1正面
          • 3.2侧面
          • 3.3旋转
          • 3.4远近对比(远)
          • 3.5光暗对比(暗)
  • 借鉴

Harris角点检测

概念

基于特征的图像配准方法是图像配准中最常见的方法之一。它不是直接利用图像像素值,二十通过像素值导出的符号特征(如特征点、特征线、特征区域)来实现图像配准,因此可以克服利用灰度信息进行图像配准的缺点,主要体现在以下三个方面:
(1)利用特征点而不是图像灰度信息,大大减少了在匹配过程中的计算量;
(2)特征点的匹配度量值相对位置变化比较敏感,可以提高匹配的精度;
(3)特征点的提取过程可以减少噪声的影响,对灰度

角点

一类重要的点特征:角点(corner points),其定义主要有以下:

(1)局部窗口沿各方向移动,灰度均产生明显变化的点
(2)图像局部曲率突变的点

我们可以直观的概括下角点所具有的特征:

轮廓之间的交点;

对于同一场景,即使视角发生变化,通常具备稳定性质的特征;

该点附近区域的像素点无论在梯度方向上还是其梯度幅值上有着较大变化;

角点检测

角点检测大致可分为三类:基于灰度图的角点检测、基于二值化图像的角点检测和基于轮廓曲线的角点检测。Harris属于基于灰度图的角点检测。

原理

算法的基本思想

算法基本思想是使用一个固定窗口在图像上进行任意方向上的滑动,比较滑动前与滑动后两种情况,窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有着较大灰度变化,那么我们可以认为该窗口中存在角点。

Harris角点检测可分为三步:梯度计算、响应值计算、角点提取。

梯度计算

对图像中的任意一像素点I(x,y),进行自相关平移w(x+∆x、y+∆y)得到自相关函数:

c(x,y,∆x,∆y) = ∑wh(x,y)(I(x,y)-I(x+∆x,y+∆y))2

其中 ∑w表示窗口内的点,h(x,y)表示加权函数,加权函数可根据自己需要进行修改(通过修改源代码)。

由泰勒可得:

I(x+∆x,y+∆y) = I(x,y)+∆xIx(x,y)+∆yIy(x,y)+p ≈I(x,y)+∆xIx(x,y)+∆yIy(x,y)

        代入自相关函数可得(加权函数暂时忽略):

c(x,y,∆x,∆y) = ∑w(I(x,y)-I(x+∆x,y+∆y))2 ≈ ∑w((∆xIx(x,y))2+2∆x∆yIx(x,y)Iy(x,y)+(∆yIy(x,y))2)

将上公式用图表示如下:
Python计算机视觉——Harris角点检测_第1张图片
Python计算机视觉——Harris角点检测_第2张图片
Python计算机视觉——Harris角点检测_第3张图片
 其中,u和v分别表示∆x和∆y,w(x,y)表示加权函数。Harris算法是通过判断像素值是否在多个方向上有明显变化可转换为为是否在x和y方向上像素值均有明显变化,再转换为Ix或Iy的变化,再转换为M矩阵的特征值λ1,λ2的变化,如下图:
 Python计算机视觉——Harris角点检测_第4张图片

响应值计算

上面计算不易于通过编程实现,Harris通过定义角点响应函数R的方式,用于表示一个角点的Harris响应值,通常用下面表达式度量角点响应:
Python计算机视觉——Harris角点检测_第5张图片
trace表示为矩阵的迹,det为矩阵的行列式(矩阵的迹:主对角线上的值相加即所有特征值的和),k是常量,一般取值为0.04~0.06,这个参数仅仅是这个函数的一个系数,它的存在只是调节函数的形状而已。
R = λ1λ2-k(λ1+λ2)2

角点提取

通过上面计算出一角点的Harris响应值大小,后通过设定的阈值t,进行判断该点是否为角点(大于t为角点,小于t则不为角点)

Harris角点检测流程

(1)通过高斯函数的导数对原始图像进行卷积计算;图像在水平方向和垂直方向的导数Ix和Iy;
(2)计算对应这些梯度外积即(Ix2 、Iy2、IxIy)三个图像。
(3)使用高斯函数对以上图像进行卷积滤波;
(4)使用前面的公式计算角点响应函数R值;
(5)对计算到的角点图像进行局部极大值抑制。

实现

实验要求

(1)需要拍摄纹理平坦、垂直或水平边缘多(如建筑物)、纹理角点丰富的三种场景
(2)每种场景,至少需要有 正面、侧面、旋转、尺度(远近)变化,最好能再加光照变化
(3)每种场景实验结果结束后,做实验结果的分析,分析内容需涉及到原理与实验结果的对应关系

代码

# -*- 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('../data/empire.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('off')
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, i+2)
    imshow(im)
    print im.shape
    plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords], '*')
    axis('off')

#原书采用的PCVPCV harris模块
#harris.plot_harris_points(im, filtered_coords)

# plot only 200 strongest
# harris.plot_harris_points(im, filtered_coords[:200])

show()

结果

1.边缘丰富区域

1.1正面

Python计算机视觉——Harris角点检测_第6张图片

1.2侧面

Python计算机视觉——Harris角点检测_第7张图片

1.3旋转

Python计算机视觉——Harris角点检测_第8张图片

1.4远近对比(近)

Python计算机视觉——Harris角点检测_第9张图片

1.5光暗对比(暗)

Python计算机视觉——Harris角点检测_第10张图片
分析:由该组实验可知,边缘丰富区域多的图片角点较多。明亮暗程度会影响角点的寻找,较亮的事物更精确。

2.纹理角点丰富区域

2.1正面

Python计算机视觉——Harris角点检测_第11张图片

2.2侧面

Python计算机视觉——Harris角点检测_第12张图片

2.3旋转

Python计算机视觉——Harris角点检测_第13张图片

2.4远近对比(远)

Python计算机视觉——Harris角点检测_第14张图片

2.5光暗对比(暗)

Python计算机视觉——Harris角点检测_第15张图片
由该组实验可知,纹理丰富的图片角点更甚于边缘丰富图片,远近程度会影响纹理丰富的图片寻找角点,亮暗程度影响纹理丰富的图片寻找角点的程度更高,光亮的图片更有利于寻找角点。

3.纹理平坦区域

3.1正面

Python计算机视觉——Harris角点检测_第16张图片

3.2侧面

Python计算机视觉——Harris角点检测_第17张图片

3.3旋转

Python计算机视觉——Harris角点检测_第18张图片

3.4远近对比(远)

Python计算机视觉——Harris角点检测_第19张图片

3.5光暗对比(暗)

Python计算机视觉——Harris角点检测_第20张图片

由该组实验可知,纹理平坦的图片角点较少。对于纹理平坦的图片来讲,寻找角点,图片的角度,远近程度,明暗程度都不大影响纹理平坦的图片寻找角点。

借鉴

链接一: https://www.cnblogs.com/urglyfish/p/12441410.html.

链接二: https://blog.csdn.net/lwzkiller/article/details/54633670.

你可能感兴趣的:(Python计算机视觉——Harris角点检测)