Harris角点检测及其数据分析

文章目录

  • Harris角点检测及其数据分析
    • 一、针对角点的概述
    • 二、HARRIS角点检测思想
    • 三、HARRIS角点检测数学表达
    • 四、HARRIS角点计算流程
    • 五、HARRIS基础算法代码
    • 六、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是 22 矩阵,可由图像的导数求得:

窗口移动导致的图像变化量:实对称矩阵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 - harrisimfigure()
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, i+2)imshow(im)print im.shapeplot([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角点检测器可以给出图像中检测到兴趣点,但它并没有提供在图像间对兴趣点进行比较的方法,我们需要在每个角点添加描述子,以及对这些描述子进行比较。下面为代码:

# -*- coding: utf-8 -*-
from pylab import *
from PIL import Imagefrom PCV.localdescriptors import harris
from PCV.tools.imtools import imresize"""
This is the Harris point matching example in Figure 2-2.
"""# Figure 2-2上面的图
#im1 = array(Image.open("../data/crans_1_small.jpg").convert("L"))
#im2= array(Image.open("../data/crans_2_small.jpg").convert("L"))# Figure 2-2下面的图
im1 = array(Image.open("C:/Users/admin/Desktop/convert_images_format_test/d.1.jpg").convert("L"))
im2 = array(Image.open("C:/Users/admin/Desktop/convert_images_format_test/d.2.jpg").convert("L"))# resize加快匹配速度
im1 = imresize(im1, (im1.shape[1]/2, im1.shape[0]/2))
im2 = imresize(im2, (im2.shape[1]/2, im2.shape[0]/2))wid = 5
harrisim = harris.compute_harris_response(im1, 5)
filtered_coords1 = harris.get_harris_points(harrisim, wid+1)
d1 = harris.get_descriptors(im1, filtered_coords1, wid)harrisim = harris.compute_harris_response(im2, 5)
filtered_coords2 = harris.get_harris_points(harrisim, wid+1)
d2 = harris.get_descriptors(im2, filtered_coords2, wid)print 'starting matching'
matches = harris.match_twosided(d1, d2)figure()
harris.plot_matches(im1, im2, filtered_coords1, filtered_coords2, matches)
show()

可得到运行结果如下图:

正如你从上图所看到的,对于两只不同角度拍照的点,虽然我们匹配了大部分的对应点,但是这里依然有很多错配的。
同时在匹配对应点的时候,由于有的图片过于复杂,导致匹配速度极其缓慢,不得不换相对简单的图片。

六、HARRIS响应函数

在这里我们首先需要安装Open cv,由于之前的anaconda工具包里面没有opencv,我们需要进入cmd面板输入安装指令:
pip install opencv-contrib-python

安装成功后如图所示:

下面先使用网络上的cornerHarris()函数来进行Harris检测:

cornerHarris(src, blockSize, ksize,k[,dst[,borderType]]);

image:输入的单通道8位或者浮点图像;
blockSize:就是扫描时候窗口的大小。
ksize:cornerHarris函数会使用Sobel算子,该参数定义了Sobel算子的中孔。简单来说,该函数定义了角点检测的敏感度,其值必须介于3~31之间的奇数。
k:harris 计算响应公式中的k值,一般取0.04~0.06;
borderType:像素插值方法;

函数 cornerHarris 对输入图像进行 Harris 边界检测。输出是一幅浮点值图像,大小与输入图像大小相同,浮点值越高,表明越可能是特征角点(我们可以对图像进行阈值化)。
下面是实现代码:

# -*- coding: utf-8 -*-
"""
Created on Mon Aug 20 20:17:34 2018@author: lenovo
"""'''
Harris角点检测
'''
import cv2
import numpy as npimg = cv2.imread('C:/Users/admin/Desktop/convert_images_format_test/b.1.jpg')
img = cv2.resize(img,dsize=(600,400))
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#角点检测 第三个参数为角点检测的敏感度,其值必须介于3~31之间的奇数
dst = cv2.cornerHarris(gray,3,3,0.04)
print(dst.shape)  #(400, 600)
img[dst>0.01*dst.max()] = [0,0,255]
cv2.imshow('',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

可以注意到,第三个参数为角点检测的敏感度,其值必须介于3~31之间的奇数
dst = cv2.cornerHarris(gray,3,3,0.04)

当敏感度=3时:

当敏感度=29时

可得出角点检测灵敏度越低得出的越细小。

下面为角点检测代码:

cv2.cornerHarris(src, block_size, ksize, k)
''''''
import cv2
import numpy as np
from matplotlib import pyplot as pltimg = cv2.imread('C:/Users/admin/Desktop/convert_images_format_test/b.1.jpg')
gray = np.float32(gray)
dst_block9_k19 = cv2.cornerHarris(gray, 9, 19, 0.04)
img1 = np.copy(img)
img1[dst_block9_k19 > 0.01 * dst_block9_k19.max()] = [0, 0, 255]dst_block5_k19 = cv2.cornerHarris(gray, 5, 19, 0.04)
img2 = np.copy(img)
img2[dst_block5_k19 > 0.01 * dst_block5_k19.max()] = [0, 0, 255]dst_block9_ksize5 = cv2.cornerHarris(gray, 9, 5, 0.04)
img3 = np.copy(img)
img3[dst_block9_ksize5 > 0.01 * dst_block9_k5.max()] = [0, 0, 255]dst_block9_ksize31 = cv2.cornerHarris(gray, 9, 31, 0.04)
img4 = np.copy(img)
img4[dst_block9_ksize31 > 0.01 * dst_block9_ks31.max()] = [0, 0, 255]dst_block9_ksize19_k6 = cv2.cornerHarris(gray, 9, 19, 0.06)
img5 = np.copy(img)
img5[dst_block9_k19_k6 > 0.01 * dst_block9_ks19_k6.max()] = [0, 0, 255]dst_block9_k19_k6_1e_5 = cv2.cornerHarris(gray, 9, 19, 0.06)
img6 = np.copy(img)
img6[dst_block9_ks19_k6_1e_5 > 0.00001 * dst_block9_ks19_k6_1e_5.max()] = [0, 0, 255]titles = ["Original", "block9_ksize19", "dst_block5_ksize19", "dst_block9_ksize5", "dst_block9_ksize31","dst_block9_ksize19_k6", "dst_block9_ksize19_k6_1e_5"]
imgs = [img, img1, img2, img3, img4, img5, img6]
for i in range(len(titles)):plt.subplot(3, 3, i + 1), plt.imshow(imgs[i]), plt.title(titles[i])plt.xticks([]), plt.yticks([])
plt.show()

最终得出不同变量的不同图片:

对于cv2.cornerHarris(src, block_size, ksize, k)中
src 必须是float32
block_size 邻域大小,越大表示用更粗的点标记角点
ksize Sobel求导中的窗口大小
k 自由参数,取值[0.04, 0.06]

Harris角点检测的大致步骤是:
计算Harris角点响应值–图片阈值化–获取局部最大点值

Harris角点算子其稳定性高,尤其对L型角点的检测精确度高。缺点也是比较明显的,就是运算速度比较慢,对图片的大小及其敏感,很多时候由于图中要素过多而导致无法成功得出图片。

Harris角点检测及数据分析相关推荐

  1. 《OpenCV3编程入门》学习笔记10 角点检测(一)Harris角点检测

    第10章 角点检测 10.1 Harris角点检测 10.1.1 角点 1.图像特征类型: (1)边缘 (2)角点(感兴趣点) (3)斑点(感兴趣区域) 2.角点定义: (1) 一阶导数(灰度的梯度) ...

  2. 通俗易懂的Harris 角点检测

    Harris 角点检测 认为  特征点具有局部差异性. 如何描述"特征点具有局部差异性": 以每一个点为中心,取一个窗口,窗口大小为5*5或7*7像素大小. 这个窗口描述了这个特征 ...

  3. harris角点检测_角点检测(2) - harris算子 - 理论与Python代码

    数字图像,图像=矩阵,[m*n]从[0,255]的灰度值 角点检测:物体边缘的拐点 ->应用:图像匹配与检索.图像物体形变恢复(摄像机标定).三维重建 Harris角点检测(早期,原理简单,视频 ...

  4. OpenCV Harris角点检测

    Harris角点检测的思想是通过图像的局部的小窗口观察图像,角点的特征是窗口沿任意方向移动都会导致图像灰度的明显变化,如下图所示: .判断角点,如下图所示: 当R为大数值的正数时是角点 当R为大数值的 ...

  5. OpenCV角点检测之Harris角点检测

    本篇文章中,我们一起探讨了OpenCV中Harris角点检测相关的知识点,学习了OpenCV中实现Harris角点检测的cornerHarris函数的使用方法.此博文一共有两个配套的麻雀虽小但五脏俱全 ...

  6. OpenCV之feature2d 模块. 2D特征框架(1)Harris 角点检测子 Shi-Tomasi角点检测子 定制化创建角点检测子 亚像素级的角点检测 特征点检测

    Harris 角点检测子 目标 本教程中我们将涉及: 有哪些特征?它们有什么用? 使用函数 cornerHarris 通过 Harris-Stephens方法检测角点. 理论 有哪些特征? 在计算机视 ...

  7. OpenCV-图像特征harris角点检测/SIFT函数/特征匹配-05

    图像特征-harris角点检测 基本原理 R>0 角点 R≈0 平坦区域 R<0 边界 总结一下Harris算法流程 获取点数据后,计算Ix 和 Iy 整合矩阵,求特征值 比较特征值大小 ...

  8. 【机器视觉学习笔记】Harris 角点检测算法(C++)

    目录 原理 算法步骤 优缺点 源码 效果 原图 输出 平台:Windows 10 20H2 Visual Studio 2015 OpenCV 4.5.3 本文摘自2.Harris角点检测算法 -- ...

  9. OpenCV与图像处理学习十三——Harris角点检测(含代码)

    OpenCV与图像处理学习十三--Harris角点检测(含代码) 一.角点的概念 二.Harris角点检测的实现过程 三.Harris代码应用 一.角点的概念 角点: 在现实世界中, 角点对应于物体的 ...

最新文章

  1. python 函数 默认参数
  2. 学会python爬虫怎么赚钱-自学python爬虫赚钱经历
  3. Error: Visual Inheritance is currently disabled because the base … (NET CF)
  4. CCNA综合实验配置
  5. 1.多彩的幕布CCLayerColor,CCLayerGradient
  6. mysql之case_mysql存储过程之case语句
  7. 2009年3月28日四级网络工程师 试卷答案、点评及讨论
  8. 批量创建10个系统帐号tianda01-tianda10并设置密码
  9. linux下sublime安装目录在那,linux下sublime text 3安装到配置
  10. android如何开发ui服务,Android UI-对Activity工作流程的理解(一)
  11. Typescript 下 Mongoose 外键类型外键数组类型定义类型保护联合类型理解
  12. 解决安装Win 7后XP无法启动问题
  13. Windows下的发包工具推荐[Colasoft Packet Builder]含使用教程
  14. con和com开头单词规律_con和com的前缀区别。背单词时总是搞不清什么时候是con什么时候是com之后找到了不同之处,c...
  15. 为您创建完美商业标识的 10 款 Logo 设计软件 【已翻译100%】
  16. sass安装步骤、概述、基本语法等
  17. grant,revoke,deny 服务器权限控制命令
  18. 《Effective Modern C++》Item 6: Use the explicitly typed initializer idiom when auto deduces undesired
  19. Ant Design of Vue - 让 Message 组件支持手动点击关闭
  20. 通信系统原理[郭宇春]——二元数字频带传输——课后习题答案

热门文章

  1. 如何把root登陆的shell改为csh?
  2. 别再问我为什么你敲的代码很水了!
  3. 古琴入门篇|古琴指法及符号解析
  4. 微信公众号学习--点亮图片
  5. 在Xcode6中使用故事版来搭建你的工程
  6. 云服务器win10系统搭建ftp,win10系统搭建ftp服务器
  7. 【JS组件系列】——表格组件神器:bootstrap table(二:父子表和行列调序)
  8. mysql 立方根函数_Java实现牛顿迭代法求解平方根、立方根
  9. 内蒙古大学计算机考研892,893计算机考研真题分享
  10. 第三方士大夫士大夫士大夫士大夫士大夫