在这里插入图片描述

一.角点检测介绍

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

二.Harris角点检测原理

2.1基本原理

使用一个固定窗口在图像上进行任意方向上的滑动,比较滑动前后的两种情况,窗口像素灰度值的变化程度可以判断出是否存在角点。

  • 平坦区域:任意方向,灰度值无变化
  • 边缘区域:沿着边缘方向移动,灰度值无变化
  • 角点:沿任意方向移动,明显灰度变化
    在这里插入图片描述
    将函数平移将产生 [ u , v ] [u,v] [u,v]产生灰度变化 E ( u , v ) E(u,v) E(u,v)
    在这里插入图片描述
    其中窗口函数(权重矩阵)可以是平坦的,也可以是高斯的如下图(权重矩阵 W W W(通常为高斯滤波器 G σ Gσ Gσ):
    在这里插入图片描述
    I ( x + u , y + v ) I(x+u,y+v) I(x+u,y+v)函数在 ( x , y ) (x,y) (x,y)根据泰勒展开后:
    在这里插入图片描述
    在这里插入图片描述
    于是对于局部微小的移动量 [ u , v ] [u,v] [uv],可以近似得到以下表达式:
    在这里插入图片描述
    其中 M M M 2 ∗ 2 2*2 22矩阵,可由图像的导数求得:
    在这里插入图片描述

2.2Harris检测:数学表达

M M M的特征值为 λ 1 , λ 2 λ1,λ2 λ1λ2
在这里插入图片描述
定义:角点响应函数 R R R
在这里插入图片描述
式中, d e t M detM detM为矩阵 M = M= M=的行列式; t r a c e M traceM traceM为矩阵M的直径; K K K为常数系数。
在这里插入图片描述
在这里插入图片描述

三.算法实现与分析

3.1算法流程

1. 计算图像 I ( x , y ) I(x,y) I(x,y) X X X Y Y Y两个方向的梯度 I x , I y Ix,Iy Ix,Iy
在这里插入图片描述
2. 计算两个方向梯度的乘积
在这里插入图片描述
3. 使用高斯函数对 I x 2 , I y 2 Ix^2,Iy^2 Ix2,Iy2 I x y Ixy Ixy进行高斯加权,生成矩阵M的元素 A , B A,B A,B C C C
在这里插入图片描述

4. 计算每个像素的Harris响应值 R R R,并对小于某一阈值t的 R R R值设置为零
在这里插入图片描述
5. 3 ∗ 3 3*3 33 5 ∗ 5 5*5 55的领域内进行非最大值抑制,局部最大值点即位图像中的角点

3.2算法代码

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('Harris_Data/4.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')
show()

3.3具体实验

本次实验测试三组数据分别为 1. 1. 1.纹理平坦区域 2. 2. 2. 垂直,水平边缘较多的区域 3. 3. 3.纹理角点比较丰富的区域。每组图片分别进行旋转,正面,侧面,尺度以及光照变化的实验,记录实验结果用以讨论对Harris算法性能的评估与检测

3.3.1场景一:纹理平坦区域

数据准备:
在这里插入图片描述
实验结果如下:
正面图像运行结果:
在这里插入图片描述
侧面图像运行结果:
在这里插入图片描述
光照变化图像运行结果:
在这里插入图片描述

尺度变化图像运行结果:
在这里插入图片描述

旋转图像运行结果:
在这里插入图片描述
小结:从上诉结果可以看出正面的实验结果没有侧面以及进尺度的效果好,很大程度是因为博主照片像素不够清晰,导致算法在寻找特征值时不够精确。在光照效果比较好的条件下,特征值搜索到了很多,这并不是我们想要的结果,所以这一组没有达到我们的预期效果继续实验。

3.3.2场景二:垂直区域

数据准备:
在这里插入图片描述
正面图像运行结果:
在这里插入图片描述
侧面图像运行结果:
在这里插入图片描述
尺度图像运行结果:
在这里插入图片描述
旋转图像运行结果:
在这里插入图片描述
光照变化图像运行结果:
在这里插入图片描述

小结:这一组经过比较便可以看出无论是侧面还是尺度光照的变化,图像的角点都不会有太大的变化。同时因为Harris算法的特性,对垂直或边缘比较多的区域会有比较明显的梯度变化,所以可以更好的检测出角点,再比对正面与光照变化的图片可以看出,Harris对光照不敏感,这是因为Harris使用了微分算子对图像进行了微分运算,而微分运算对图像密度的拉升或收缩和对亮度的抬高或下降不敏感。

3.3.3场景三:纹理角点丰富区域

数据准备:
在这里插入图片描述
正面图像运行结果:
在这里插入图片描述
侧面图像运行结果:
在这里插入图片描述
尺度图像运行结果:
在这里插入图片描述
旋转图像运行结果:
在这里插入图片描述

光照变化图像运行结果:
在这里插入图片描述
小结:这一组同样也可以观察出,正面角点的检测与侧面,尺度,旋转以及光照强度均无太大联系,唯一导致角点的多少在于阈值的大小。阈值的大小主要影响着R值得范围。增大α的值,将减小角点响应值R,降低角点检测的灵性,减少被检测角点的数量;减小α值,将增大角点响应值R,增加角点检测的灵敏性,增加被检测角点的数量。

四.算法总结

经过这三组数据得实验可以了解到:

  • Harris角点检测算子对亮度的变化不敏感
  • Harris角点检测算子具有旋转不变性
  • Harris角点检测算子不具有尺度不变性
  • 阈值影响角点的多少
    其中亮度不敏感可以理解为,对亮度的变化并不改变Harris响应的极值点出现的位置。旋转不变性是因为Harris算子使用的是角点附近的区域灰度二阶矩阵。而二阶矩阵可以表示成一个椭圆,椭圆的长短轴正是二阶矩阵特征值平方根的倒数。当特征椭圆转动时,特征值并不发生变化,所以判断角点效应值R也不会发生变化
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐