计算机视觉--Harris角点检测实现与分析(一)

一、Harris角点检测

1.1 何为角点?

      对于角点,到目前为止还没有明确的数学定义。但是我们可以认为角点就是极值点,即在某方面属性特别突出的点。一般的角点检测都是对有具体定义的、或者是能够具体检测出来的兴趣点的检测。这意味着兴趣点可以是角点,是在某些属性上强度最大或者最小的孤立点、线段的终点,或者是曲线上局部曲率最大的点。
      通俗的来说,在一副图像中,我们可以认为角点是物体轮廓线的连接点,当拍摄视角变化的时候,这些特征点仍能很好地保持稳定的属性。下面有两幅不同视角的图像,通过找出对应的角点进行匹配。
在这里插入图片描述
我们可以直观的概括下角点所具有的特征

  • 轮廓之间的交点;
  • 对于同一场景,即使视角发生变化,通常具备稳定性质的特征;
  • 该点附近区域的像素点无论在梯度方向上还是其梯度幅值上有着较大变化;

1.2 角点检测算法基本思想是什么?

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

1.3 如何用数学方法去刻画角点特征?

当窗口发生[u,v]移动时,那么滑动前与滑动后对应的窗口中的像素点灰度变化描述如下:
在这里插入图片描述
公式解释:

  • [u,v]是窗口的偏移量
  • (x,y)是窗口内所对应的像素坐标位置,窗口有多大,就有多少个位置
  • w(x,y)是窗口函数,最简单情形就是窗口内的所有像素所对应的w权重系数均为1。但有时候,我们会将w(x,y)函数设定为以窗口中心为原点的二元正态分布。如果窗口中心点是角点时,移动前与移动后,该点的灰度变化应该最为剧烈,所以该点权重系数可以设定大些,表示窗口移动时,该点在灰度变化贡献较大;而离窗口中心(角点)较远的点,这些点的灰度变化几近平缓,这些点的权重系数,可以设定小点,以示该点对灰度变化贡献较小,那么就想到使用二元高斯函数来表示窗口函数。

所以通常窗口函数有如下两种形式:
在这里插入图片描述

二、代码实现

实现Harris角点检测主要是通过调用PCV包中自带的harris.py文件中的函数。

# -*- 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')

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

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

show()

三、不同场景下角点检测结果与分析

结果说明

以下每种场景,检测: 正面、侧面、旋转、尺度(远近)变化、光照变化的不同情况。每种情况下显示四组图,分别表示Harris响应图、阈值为0.01、 0.05以及0.1检测出的角点。

3.1 场景一:垂直或水平边缘多

3.1.1 检测结果

正面:
在这里插入图片描述
侧面:
在这里插入图片描述
光照较暗(傍晚拍摄):
在这里插入图片描述
正面远景:
在这里插入图片描述
旋转:
在这里插入图片描述

3.1.2 分析

  • 在垂直或水平边缘多的场景下,对于旋转变化、正侧面对比,基本不会对角点检测产生太大的影响,这是因为利用harris角点检测,对于垂直或水平边缘多的场景,边缘点附近会形成明显的梯度变化,因而可以明显地检测出角点。
  • 对于尺度变化(远近),可以看出远景下检测出的角点更多,主要因为扩大了范围。在远近不同的情况下,检测窗口尺寸不变的前提下,窗口内所包含图像的内容也是不同的,比较直观的说法即拍摄远景时,能看到更多的风景,因此检测出的角点自然会更加丰富,当然对比远近景下的同一座建筑物,远景中检测出的角点会因为建筑物在窗口中缩小导致检测出的角点变少。
  • 光线变化对比下并没有太大区别。说明 Harris角点检测算子对亮度和对比度的变化不敏感。这是因为在进行Harris角点检测时,使用了微分算子对图像进行微分运算,而微分运算对图像密度的拉升或收缩和对亮度的抬高或下降不敏感。换言之,对亮度和对比度的仿射变换并不改变Harris响应的极值点出现的位置,但是,由于阈值的选择,可能会影响角点检测的数量。
    在这里插入图片描述
  • 阈值越大,检测出的角点越少。

3.2 场景二:纹理角点丰富

3.2.1 检测结果

正面:
在这里插入图片描述
侧面:
在这里插入图片描述
远景:
在这里插入图片描述
正面旋转180度:
在这里插入图片描述
亮度变化(较暗):
在这里插入图片描述

3.2.2 分析

  • 对于纹理角点丰富的场景,在尺度变化(远近)时,在远景下,一些角点容易被遗漏,正面和侧面对比下,角点检测会出现较大差异,这是因为纹理角点丰富的场景,在Harris角点检测中,周围灰度值梯度较大的点较多,容易产生差异。
  • 旋转变化中,保持不变性,从Harris角点检测的原理分析,Harris角点检测算子使用的是角点附近的区域灰度值二阶矩阵。简写成如下形式:
    在这里插入图片描述
    用α,β表示矩阵M的特征值,二阶矩阵M可以看成是一个椭圆,那么α,β就是椭圆的长短轴的度量,如果仅仅是作了旋转变化,即椭圆转过一定角度,但是其形状保持不变(特征值保持不变),所以角点响应值R也不会发生变化。
  • 亮暗对比下,可以看出在较暗环境下深色物体(如以上结果图中的茶壶)几乎没有角点被检测出来,结合原理解释:深色物体本身灰度值与暗部的灰度值相近,因此不会产生边缘轮廓的灰度值差,所以难以检测。

3.3 场景三:平坦

3.3.1 检测结果

正面:
在这里插入图片描述
旋转:
在这里插入图片描述
侧面:
在这里插入图片描述
正面远景:
在这里插入图片描述
亮暗变化(较暗):
在这里插入图片描述

3.3.2 分析

  • 在纹理平坦的场景下,可以看出以上几种情况都能较清晰地检测出角点,这是因为平坦环境对角点检测干扰较小。
  • 在远近景对比下,会出现较大差异,远景中角点密集,猜测是目标物缩小,导致部分线段也会被检测成角点。说明Harris角点检测算子不具有尺度不变性。如下图所示,当右图被缩小时,在检测窗口尺寸不变的前提下,在窗口内所包含图像的内容是完全不同的。左侧的图像可能被检测为边缘或曲线,而右侧的图像则可能被检测为一个角点。
    在这里插入图片描述
  • 在较暗环境下,以上结果图中很清晰地检测出插座的四个角,原因是周围白色墙壁与暗处的插座灰度值形成更鲜明的对比,梯度突出;但是同理,在暗处插座孔与周围灰度值大致相同,因此很难被检测出角点。

四、角点检测响应函数R值的分析

写在另一篇博客中,点击查看: 计算机视觉–Harris角点检测实现与分析(二).

五、小结

实验结果小结:

  • 其他条件相同的情况下:阈值越小,找到的角点最多。
  • Harris角点检测具有旋转不变性。
  • Harris角点检测算子对亮度和对比度的变化不敏感。
  • Harris角点检测算子不具有尺度不变性。

本次实验过程中遇到的问题主要有:
需要输出图片时会出现如下报错
在这里插入图片描述
解决方案是:打开控制面板 - >系统设置 - >高级系统设置 - >环境变量->系统变量 - >新建。设置变量名称:QT_PLUGIN_PATH,变量目录:…\Anaconda2 \ Library \ plugins(电脑中的路径)。设置好环境变量后重启pycharm,问题即得到解决。

发布了16 篇原创文章 · 获赞 5 · 访问量 2909

猜你喜欢

转载自blog.csdn.net/qq_41784565/article/details/104496567