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

目录

    • 一、harris算法简介
      • 1.角点概述
      • 2.Harris角点检测基本原理
    • 二、相关代码实现和结果分析
      • 相关代码
      • 1. 场景1(平坦区域)
        • 1.1
        • 1.2
        • 1.3
        • 1.4
        • 1.5
        • 结果分析
      • 2. 场景2(建筑物)
        • 2.1
        • 2.2
        • 2.3
        • 2.4
        • 2.5
        • 结果分析
      • 3. 场景3(纹理角点丰富)
        • 3.1
        • 3.2
        • 3.3
        • 3.4
        • 结果分析

一、harris算法简介

1.角点概述

角点是图像很重要的特征,对图像图形的理解和分析有很重要的作用。角点在保留图像图形重要特征的同时,可以有效地减少信息的数据量,使其信息的含量很高,有效地提高了计算的速度,有利于图像的可靠匹配,使得实时处理成为可能。从图像分析的角度来定义角点可以有以下两种定义:

a. 角点可以是两个边缘的角点;

b. 角点是邻域内具有两个主方向的特征点;

前者往往需要对图像边缘进行编码,这在很大程度上依赖于图像的分割与边缘提取,具有相当大的难度和计算量,且一旦待检测目标局部发生变化,很可能导致操作的失败。基于图像灰度的方法通过计算点的曲率及梯度来检测角点,
避免了第一类方法存在的缺陷,此类方法主要有Moravec算子、Forstner算子、Harris算子、SUSAN算子等。本文主要介绍的Harris角点检测的算法原理。

2.Harris角点检测基本原理

人眼对角点的识别通常是在一个局部的小区域或小窗口完成的。如果在各个方向上移动这个特征的小窗口,窗口内区域的灰度发生了较大的变化,那么就认为在窗口内遇到了角点。

如果这个特定的窗口在图像各个方向上移动时,窗口内图像的灰度没有发生变化,那么窗口内就不存在角点;

如果窗口在某一个方向移动时,窗口内图像的灰度发生了较大的变化,而在另一些方向上没有发生变化,那么,窗口内的图像可能就是一条直线的线段。如下图:
计算机视觉—— Harris角点检测_第1张图片

二、相关代码实现和结果分析

为了更好地对 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('D:\\python\images\Tower1.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()

1. 场景1(平坦区域)

首先在家中对一本书进行了测试。拍了不同角度和大小的五张图片。
五张原图如下:
计算机视觉—— Harris角点检测_第2张图片

1.1

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

1.2

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

1.3

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

1.4

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

1.5

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

结果分析

对于平坦区域,角点检测效果不尽如人意。而侧面图片在平面区域中角点更加明显。

并且由结果可以发现Harris角点检测算子具有旋转不变性。
在对同一物体不同角度图片进行检测时,Harris角点检测算子使用的是角点附近的区域灰度二阶矩矩阵。而二阶矩矩阵可以表示成一个椭圆,椭圆的长短轴正是二阶矩矩阵特征值平方根的倒数。当特征椭圆转动时,特征值并不发生变化,所以判断角点响应值也不发生变化,由此说明Harris角点检测算子具有旋转不变性。

2. 场景2(建筑物)

从网络上搜索到不同角度的巴黎铁塔进行测试。

2.1

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

2.2

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

2.3

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

2.4

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

2.5

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

结果分析

由第五张图与前几张的对比,可以发现,Harris角点检测算子不具有尺度不变性
当图片放大时被缩小时,在检测窗口尺寸不变的前提下,在窗口内所包含图像的内容是完全不同的。

3. 场景3(纹理角点丰富)

对不同角度不同远近和光照情况下的布达拉宫图片进行测试

3.1

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

3.2

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

3.3

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

3.4

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

结果分析

在该场景的测试中,通过白天和夜晚不同时间的布达拉宫的图片进行了Harris角点检测的对比。发现Harris角点检测算子对亮度和对比度的变化不敏感。
这是因为在进行Harris角点检测时,使用了微分算子对图像进行微分运算,而微分运算对图像密度的拉升或收缩和对亮度的抬高或下降不敏感。换言之,对亮度和对比度的仿射变换并不改变Harris响应的极值点出现的位置,但是,由于阈值的选择,可能会影响角点检测的数量。

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