Harris角点检测原理及其在python-opencv的调用

news2024/10/6 16:31:17

文章目录

    • 原理
    • 测试

原理

Harris 角点检测的基本思路如下:考虑一个局部的区域,将其作为一个窗口四处移动,若窗口灰度发生了较大的变化,那么,就认为窗口内存在角点,否则窗口内就不存在角点。

对于图像 I ( p ⃗ ) I(\vec p) I(p ),当在点 p ⃗ = ( x , y ) \vec p=(x,y) p =(x,y)处平移 Δ p ⃗ = ( Δ x , Δ y ) \Delta\vec p=(\Delta x, \Delta y) Δp =(Δx,Δy)后的自相似性,可以通过下面的自相关函数给出

S W ( Δ x , Δ y ) = ∑ x i ∈ W ∑ y i ∈ W w ( p ⃗ i ) ( I ( p ⃗ i + Δ p ⃗ ) − I ( p ⃗ i ) ) 2 S_W(\Delta x, \Delta y)=\sum_{x_i\in W}\sum_{y_i\in W}w(\vec p_i)(I(\vec p_i + \Delta\vec p)-I(\vec p_i))^2 SW(Δx,Δy)=xiWyiWw(p i)(I(p i+Δp )I(p i))2

其中, W W W是以点 ( x , y ) (x,y) (x,y)为中心的窗口, w ( p ⃗ i ) w(\vec p_i) w(p i)是点 p ⃗ i \vec p_i p i处的加权函数,一般取高斯函数 e − ( x i − x ) 2 + ( y i − y ) 2 2 σ 2 e^{-\frac{(x_i-x)^2+(y_i-y)^2}{2\sigma^2}} e2σ2(xix)2+(yiy)2。当 Δ p ⃗ \Delta\vec p Δp 取不同值时,若 S W S_W SW都有较大变化,则可认为 p ⃗ \vec p p 是一个角点,此即Harris角点检测的基本思路。

对平移后的图像进行泰勒展开,可得

I ( p ⃗ i + Δ p ⃗ ) ≈ I ( p ⃗ i ) + I x ( p ⃗ i ) Δ x + I y ( p ⃗ i ) Δ y I(\vec p_i+\Delta\vec p)\approx I(\vec p_i)+I_x(\vec p_i)\Delta x+I_y(\vec p_i)\Delta y I(p i+Δp )I(p i)+Ix(p i)Δx+Iy(p i)Δy

其中 I x , I y I_x, I_y Ix,Iy为偏导数,将其带入 S W S_W SW,有

S W ( Δ x , Δ y ) ≈ ∑ x i ∈ W ∑ y i ∈ W w ( p ⃗ i ) ( I x ( p ⃗ i ) Δ x + I y ( p ⃗ i ) Δ y ) 2 = ∑ x i ∈ W ∑ y i ∈ W w ( p ⃗ i ) [ I x 2 ( p ⃗ i ) Δ x 2 + I y 2 ( p ⃗ i ) Δ y 2 + 2 I x ( p ⃗ i ) I y ( p ⃗ i ) Δ x Δ y ] = ∑ x i ∈ W ∑ y i ∈ W w ( p ⃗ i ) [ Δ x Δ y ] [ I x 2 ( p ⃗ i ) I x ( p ⃗ i ) I y ( p ⃗ i ) I x ( p ⃗ i ) I y ( p ⃗ i ) I y 2 ( p ⃗ i ) ] [ Δ x Δ y ] \begin{aligned} S_W(\Delta x, \Delta y)&\approx\sum_{x_i\in W}\sum_{y_i\in W}w(\vec p_i)(I_x(\vec p_i)\Delta x+I_y(\vec p_i)\Delta y)^2\\ &=\sum_{x_i\in W}\sum_{y_i\in W}w(\vec p_i)\left[I_x^2(\vec p_i)\Delta x^2+I_y^2(\vec p_i)\Delta y^2+2I_x(\vec p_i)I_y(\vec p_i)\Delta x\Delta y\right]\\ &=\sum_{x_i\in W}\sum_{y_i\in W}w(\vec p_i)\begin{bmatrix}\Delta x&\Delta y\end{bmatrix}\begin{bmatrix} I_x^2(\vec p_i)&I_x(\vec p_i)I_y(\vec p_i)\\ I_x(\vec p_i)I_y(\vec p_i)&I_y^2(\vec p_i) \end{bmatrix}\begin{bmatrix}\Delta x\\ \Delta y\end{bmatrix}\\ \end{aligned} SW(Δx,Δy)xiWyiWw(p i)(Ix(p i)Δx+Iy(p i)Δy)2=xiWyiWw(p i)[Ix2(p i)Δx2+Iy2(p i)Δy2+2Ix(p i)Iy(p i)ΔxΔy]=xiWyiWw(p i)[ΔxΔy][Ix2(p i)Ix(p i)Iy(p i)Ix(p i)Iy(p i)Iy2(p i)][ΔxΔy]

将其记作

S W ( Δ x , Δ y ) = [ Δ x Δ y ] M ( x , y ) [ Δ x Δ y ] S_W(\Delta x, \Delta y)=\begin{bmatrix}\Delta x&\Delta y\end{bmatrix}M(x,y)\begin{bmatrix}\Delta x\\ \Delta y\end{bmatrix} SW(Δx,Δy)=[ΔxΔy]M(x,y)[ΔxΔy]

其中 M ( p ⃗ ) M(\vec p) M(p )只与当前点 p ⃗ \vec p p 有关,可记作

M ( p ⃗ ) = ∑ x i ∈ W ∑ y i ∈ W w ( p ⃗ i ) [ I x 2 ( p ⃗ i ) I x ( p ⃗ i ) I y ( p ⃗ i ) I x ( p ⃗ i ) I y ( p ⃗ i ) I y 2 ( p ⃗ i ) ] = [ ∑ x i ∈ W ∑ y i ∈ W w ( p ⃗ i ) I x 2 ( p ⃗ i ) ∑ x i ∈ W ∑ y i ∈ W w ( p ⃗ i ) I x ( p ⃗ i ) I y ( p ⃗ i ) ∑ x i ∈ W ∑ y i ∈ W w ( p ⃗ i ) I x ( p ⃗ i ) I y ( p ⃗ i ) ∑ x i ∈ W ∑ y i ∈ W w ( p ⃗ i ) I y 2 ( p ⃗ i ) ] \begin{aligned} M(\vec p) &=\sum_{x_i\in W}\sum_{y_i\in W}w(\vec p_i)\begin{bmatrix} I_x^2(\vec p_i)&I_x(\vec p_i)I_y(\vec p_i)\\ I_x(\vec p_i)I_y(\vec p_i)&I_y^2(\vec p_i) \end{bmatrix}\\ &=\begin{bmatrix} \sum_{x_i\in W}\sum_{y_i\in W}w(\vec p_i)I_x^2(\vec p_i)& \sum_{x_i\in W}\sum_{y_i\in W}w(\vec p_i)I_x(\vec p_i)I_y(\vec p_i)\\ \sum_{x_i\in W}\sum_{y_i\in W}w(\vec p_i)I_x(\vec p_i)I_y(\vec p_i)& \sum_{x_i\in W}\sum_{y_i\in W}w(\vec p_i)I_y^2(\vec p_i) \end{bmatrix}\\ \end{aligned} M(p )=xiWyiWw(p i)[Ix2(p i)Ix(p i)Iy(p i)Ix(p i)Iy(p i)Iy2(p i)]=[xiWyiWw(p i)Ix2(p i)xiWyiWw(p i)Ix(p i)Iy(p i)xiWyiWw(p i)Ix(p i)Iy(p i)xiWyiWw(p i)Iy2(p i)]

M ( p ⃗ ) M(\vec p) M(p )有四项,可写作

M ( p ⃗ ) = [ A C C B ] M(\vec p)=\begin{bmatrix}A&C\\C&B\end{bmatrix} M(p )=[ACCB]

从而自相关函数可近似为

S W ( Δ x , Δ y ) ≈ [ Δ x Δ y ] [ A C C B ] [ Δ x Δ y ] = A Δ x 2 + 2 C Δ x Δ y + B Δ y 2 \begin{aligned} S_W(\Delta x, \Delta y)&\approx\begin{bmatrix}\Delta x&\Delta y\end{bmatrix}\begin{bmatrix}A&C\\C&B\end{bmatrix}\begin{bmatrix}\Delta x\\ \Delta y\end{bmatrix}\\ &=A\Delta x^2+2C\Delta x\Delta y+B\Delta y^2 \end{aligned} SW(Δx,Δy)[ΔxΔy][ACCB][ΔxΔy]=AΔx2+2CΔxΔy+BΔy2

Δ x , Δ y \Delta x, \Delta y Δx,Δy分别作为横轴与纵轴,则 A , B , C , S W A, B, C, S_W A,B,C,SW固定时,上式构成一个椭圆方程,其短轴和长轴分别为 S W λ M , S W λ m \sqrt{\frac{S_W}{\lambda_M}}, \sqrt{\frac{S_W}{\lambda_m}} λMSW λmSW λ M , λ m \lambda_M, \lambda_m λM,λm M ( p ⃗ ) M(\vec p) M(p )的大小两个特征值。

参数一经固定,那么 Δ x , Δ y \Delta x, \Delta y Δx,Δy就只能在椭圆上取值,才能使等式成立。而若换一种思路,点 Δ p ⃗ = ( Δ x , Δ y ) \Delta\vec p=(\Delta x, \Delta y) Δp =(Δx,Δy),将存在三种位置,即椭圆内部、椭圆上和椭圆外部。对于角点来说,应该让 Δ p ⃗ \Delta\vec p Δp 挪动尽量小的情况下,从椭圆内部跳到椭圆外部,换言之,小窗移动因其较大变化。因此,椭圆的轴越短,则这种变化越明显。从而,当矩阵 M ( x ) M(x) M(x)的特征值较大时,可以认为 p ⃗ = ( x , y ) \vec p=(x,y) p =(x,y)是角点。

由于求特征值比较耗时,Harris定义了响应值 R R R

R = det ⁡ M − k ( trace ⁡ M ) 2 R=\det M-k(\operatorname{trace}M)^2 R=detMk(traceM)2

其中trace表示迹,det为行列式, k k k为常数,一般取 0.04 → 0.06 0.04\to0.06 0.040.06 R R R值与点的关系如下

  • ∣ R ∣ \vert R\vert R很小时,两个特征值都很小,对应区域为平面。
  • R < 0 R<0 R<0时,两个特征值相差较大,对应区域为直线
  • R R R较大时,两个特征值都很大,且近似相等,对应区域为角点。

测试

python-opencv中提供了Harris角点检测函数,其 R R R值计算结果以及角点检测结果如下

在这里插入图片描述

代码为

import cv2
import numpy as np
import matplotlib.pyplot as plt

path = 'lena.jpg'
img = plt.imread(path)
gray = img[:,:,0]

harris = cv2.cornerHarris(gray, 2, 3, 0.04)

fig = plt.figure()
ax = fig.add_subplot(121)
ax.imshow(harris)

ax = fig.add_subplot(122)
dst = cv2.dilate(harris, None) # 腐蚀harris结果
im1 = img + 0

im1[dst > 0.1 * dst.max()] = [255, 0, 0]
ax.imshow(im1)
plt.tight_layout()
plt.show()

【cornerHarris】即为harris角点计算函数,其输入的四个参数分别是待检测图像;角点检测时的移动范围;Sobel导数的尺寸(为奇数)以及 k k k值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1859449.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FruitJuice for Mac:智能优化电池寿命,Mac持久续航不再难!

FruitJuice for Mac 是一款专为Mac用户设计的电池优化管理工具。它拥有智能的电池健康监测功能&#xff0c;可以实时显示Mac电池的当前状态&#xff0c;并提供个性化的优化建议&#xff0c;帮助用户更好地管理电池使用。 通过FruitJuice&#xff0c;Mac用户可以轻松查看电池的…

240621_昇思学习打卡-Day3-余弦退火+周期性重启+warm up

240621_昇思学习打卡-Day3-余弦退火周期性重启warm up 先展示一个完整的余弦退火周期性重启warm up调整学习率的流程&#xff08;横轴为epoch&#xff0c;纵轴为学习率&#xff09;&#xff1a; 我们换一个收敛较慢的图进行详细说明&#xff1a; Warm up 在神经网络刚开始训练…

若依框架下拉单选框根据js动态加载,如何使select2的下拉搜素功能同时生效(达到select下拉框的样式不变的效果)

直接上代码&#xff0c;不废话 $(select[name"sealType"]).change(function (event) {let value event.target.valuequeeryDeptListBySealType(value)})// 获取科目信息function queeryDeptListBySealType(value){$.ajax({type: "post",url: prefix &quo…

【Linux】Linux基础开发工具(yum)

Linux 软件包管理器 yum 什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安 装程序)放在一个服务器上, 通过包管理器可以很方便…

__FILE__ 一个非常实用的宏

经常在VS和QtCreator这两个开发环境之间切换的同志肯定会发现这两个开发环境生成的可执行程序的文件路径不一样&#xff0c;VS是在项目文件目录里面&#xff0c;而qt creator是在和项目文件夹同一目录下。如下图所示&#xff1a; QtCreator: VS: 这就导致了一个问题,若要获取项…

面向对象的编程思想

面向对象的编程思想 一、什么是面向对象&#xff1f; 面向对象编程的核心思想是把构成问题的各个事物分解成各个对象&#xff0c;建立对象的目的不是为了完成一个步骤&#xff0c;而是为了描述一个事物在解决问题的过程中经历的步骤和行为。对象作为程序的基本单位&#xff0…

如何开发、使用 Starter

开发 第一步&#xff1a;创建starter工程hello-spring-boot-starter并配置pom.xml文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchem…

达梦(DM8)数据库表空间的备份与还原(联机备份) 四

一、表空间的备份 1、备份表空间的命令操作 backup tablespace main backupset /home/dmdba/dmdata/DAMENG/bak/full_back_01 ; 2、检查表空间的备份文件 select sf_bakset_check(disk,/home/dmdba/dmdata/DAMENG/bak/full_back_01); 二、表空间的还原 1、修改表空间位脱机…

[MySql]两阶段提交

文章目录 什么是binlog使用binlog进行恢复的流程 什么是redolog缓冲池redologredolog结构 两阶段提交 什么是binlog binlog是二进制格式的文件&#xff0c;用于记录用户对数据库的修改&#xff0c;可以作用于主从复制过程中数据同步以及基于时间点的恢复&#xff08;PITR&…

Java如何设置Map过期时间的的几种方法

一、技术背景 在实际的项目开发中&#xff0c;我们经常会使用到缓存中间件&#xff08;如redis、MemCache等&#xff09;来帮助我们提高系统的可用性和健壮性。 但是很多时候如果项目比较简单&#xff0c;就没有必要为了使用缓存而专门引入Redis等等中间件来加重系统的复杂性…

【uniapp】HBuilderx中uniapp项目运行到微信小程序报错Error: Fail to open IDE

HBuilderx中uniapp项目运行到微信小程序报错Error: Fail to open IDE 问题描述 uniapp开发微信小程序&#xff0c;在HBuilderx中运行到微信开发者工具时报错Error: Fail to open IDE 解决方案 1. 查看微信开发者工具端服务端口是否开放 打开微信开发者工具选择&#xff1…

艺术家电gorenje x 设计上海丨用设计诠释“生活的艺术”

2024年6月19日—22日&#xff0c;艺术家电gorenje亮相“设计上海”2024&#xff0c;以“gorenje是家电更是艺术品”为题&#xff0c;为人们带来融入日常的艺术之美。设计上海2024不但汇集了国内外卓越设计品牌和杰出独立设计师的家具设计作品&#xff0c;还联合国内外多名设计师…

【linux学习十六】网络管理

网络管理器(NetworkManager)是一个动态网络的控制器与配置系统&#xff0c;它用于当网络设备可用时保持设备和连接开启并激活 默认情况下&#xff0c;CentOS/RHEL7已安装网络管理器&#xff0c;并处于启用状态。 认识网卡 ens32 ens33 ens34 ens35 一.ip相关 查询网络状态 sy…

数据结构——二分算法

二分查找 1. 在排序数组中查找元素的第一个和最后一个位置 代码实现&#xff1a; /*** Note: The returned array must be malloced, assume caller calls free().*/int binarySearch(int *nums, int numsSize, int target) {int l 0, r numsSize - 1; while (l <…

viper:一款中国人写的红队服务器——记一次内网穿透练习

1. viper Viper 是中国人自主编写的一款红队服务器&#xff0c;提供图形化的操作界面&#xff0c;让用户使用浏览器即可进行内网渗透&#xff0c;发布在语雀官方地址 提供了很全面的官方文档&#xff0c;包括四大部分&#xff0c;分别是使用手册、模块文档、博客文章、开发手册…

高中数学:数列-错位相减法与裂项相消法求数列的和

一、错位相减法 设&#xff0c;an是等差数列&#xff0c;bn是等比数列&#xff0c;那么{an*bn}构成一个新的数列 这个新数列的求和公式&#xff0c;就可以用错位相减法求解。 练习 例题1 解析&#xff1a; 第一问 第二问 二、裂项相消法 1、裂项的几种常见形式 形式1…

Junit4测试基本应用(白盒测试)

Junit4测试基本应用&#xff08;白盒测试&#xff09; 一、实验目的 掌握Junit的基本操作&#xff0c;进行较简单的单元测试。 二、Junit4测试的使用 1. 创建java项目JUnitText 我使用的Eclipse&#xff0c;在左侧Package Explorer(包资源管理器)右键&#xff0c;新建Java …

物联网 IoT 收录

物联网IoT日常知识收录 thingsboard, nodered是国际大品牌&#xff0c; iotgateway是国内的&#xff0c; 几个scada, pyscada, json-scada都还不错&#xff0c;比较一下。thingsboard-gateway是python系的&#xff0c;如果你愿意&#xff0c;可以用这个作为公司的物联网网关。…

全网最强剖析Spring AOP底层原理

相信各位读者对于Spring AOP的理解都是一知半解&#xff0c;只懂使用&#xff0c;却不懂原理。网上关于Spring AOP的讲解层出不穷&#xff0c;但是易于理解&#xff0c;让人真正掌握原理的文章屈指可数。笔者针对这一痛点需求&#xff0c;决定写一篇关于Spring AOP原理的优质博…

视频监控解决方案:视频平台升级技术方案(下)

目录 1 项目概况 2 项目需求 2.1 视频感知资源扩充 2.2 视频支撑能力升级 2.3 视频应用能力升级 3 技术设计方案 3.1系统总体架构 3.2视频感知资源扩充设计 3.3 视频支撑能力升级设计 3.4 视频应用能力升级设计 3.4.1视频资源目录管理 3.4.2标签管理 3.4.3设备智能…