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

文章目录

    • 原理
    • 测试

原理

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值。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HBase与Hive数据交互

一、hbase数据导入hive hive通过建立外部表和普通表加载hbase表数据到hive表中。 两种方式加载hbase中的表到hive中&#xff0c;一是hive创建外部表关联hbase表数据&#xff0c;是hive创建普通表将hbase的数据加载到本地。 1.创建外部表 hbase中创建test表&#xff0c;且插入…

没有思考过 Embedding,不足以谈 AI

在当今的人工智能&#xff08;AI&#xff09;领域&#xff0c;Embedding 是一个不可或缺的概念。如果你没有深入理解过 Embedding&#xff0c;那么就无法真正掌握 AI 的精髓。接下来&#xff0c;我们将深入探讨 Embedding 的基本概念。 1. Embedding的基本概念 1.1 什么是 Emb…

ET实现游戏中邮件系统逻辑思路(服务端)

ET是一个游戏框架&#xff0c;用的编程语言是C#&#xff0c;游戏引擎是Unity&#xff0c;框架作者&#xff1a;熊猫 ET社区 在游戏中我们通常都会看到有邮件系统&#xff0c;邮件系统的作用有给玩家通知、发放奖励等 下面小编使用ET框架带大家看一下邮件系统的一种实现方…

远程过程调用RPC实现原理

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

深度挖掘数据资产,洞察业务先机:利用先进的数据分析技术,精准把握市场趋势,洞悉客户需求,为业务决策提供有力支持,实现持续增长与创新

在当今日益激烈的商业竞争环境中&#xff0c;企业想要实现持续增长与创新&#xff0c;必须深入挖掘和有效运用自身的数据资产。数据不仅是企业运营过程中的副产品&#xff0c;更是洞察市场趋势、理解客户需求、优化业务决策的重要资源。本文将探讨如何通过利用先进的数据分析技…

多行业预约门店服务小程序源码系统 支持多门店预约 带完整的安装代码包以及搭建教程

系统概述 该系统基于先进的云计算和大数据技术&#xff0c;采用模块化设计&#xff0c;具有高度的可扩展性和可定制性。无论是餐饮、美容美发、健身房还是其他服务行业&#xff0c;都可以通过该系统轻松实现多门店预约功能。同时&#xff0c;我们还提供了丰富的接口和插件&…

stylelint 配置

1.vscode 安装插件Stylelint 2.项目安装插件 pnpm i stylelint stylelint-config-standard stylelint-config-recommended-scss stylelint-config-recommended-vue postcss postcss-html postcss-scss stylelint-config-recess-order stylelint-config-html -D 依赖 说明 备…

如何判断一个Repo是否是Private还是Internal?

Github的Repository分为三种类型&#xff0c;主要是用于决定谁可以访问、查看和克隆该仓库。GitHub 提供了几种不同的可见性选项&#xff0c;包括 Private、Public 和 Internal。 Private 只有仓库的拥有者和被明确邀请为协作者&#xff08;Collaborator&#xff09;的用户才能…

VMware虚拟机移植保姆级教程

文章目录 前言:一、打包与备份二、VMware移植1. 文件介绍2. 移植过程总结:前言: 前几日对电脑做了一个大的更新升级,不仅将硬件进行了升级,还对电脑的软件进行了升级也就是我从Win10今家庭版升级到Win11专业版啦,之前没有升级是因为数据量很多,怕升级后找不到自己需要的…

Windows和Linux C++判断磁盘空间是否充足

基本是由百度Ai写代码生成的&#xff0c;记录一下。实现此功能需要调用系统的API函数。 对于Windows&#xff0c;可调用函数GetDiskFreeSpaceEx&#xff0c;使用该函数需要包含头文件windows.h。该函数的原型&#xff1a; 它的四个参数&#xff1a; lpDirectoryName&#xff0…

基于SpringBoot养老院管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还…

基于改进天鹰优化算法(IAO)优化RBF神经网络数据回归预测 (IAO-RBF)的数据回归预测(多输入多输出)

改进天鹰优化算法(IAO)见&#xff1a;【智能优化算法】改进的AO算法(IAO)-CSDN博客 代码原理 基于改进天鹰优化算法&#xff08;IAO&#xff09;优化RBF神经网络数据回归预测&#xff08;IAO-RBF&#xff09;的多输入多输出&#xff08;MIMO&#xff09;数据回归预测&#xf…

CVPR24已开源:刷新监督学习SOTA,无监督多目标跟踪时代来临!

论文标题&#xff1a; Matching Anything by Segmenting Anything 论文作者&#xff1a; Siyuan Li, Lei Ke, Martin Danelljan, Luigi Piccinelli, Mattia Segu, Luc Van Gool, Fisher Yu 导读&#xff1a; 在计算机视觉的征途中&#xff0c;多目标跟踪&#xff08;MOT&…

Centos安装redis(附:图形化管理工具)

第一步&#xff1a;下载redis wget http://download.redis.io/releases/redis-6.2.7.tar.gz 第二步&#xff1a;解压 tar zxvf redis-6.2.7.tar.gz 第三步&#xff1a;安装依赖环境 yum -y install gcc-c第四步&#xff1a;安装依赖环境 make install第五步&#xff1a;修…

开源项目-商城管理系统

哈喽&#xff0c;大家好&#xff0c;今天主要给大家带来一个开源项目-商城管理系统 商城管理系统分前后端两部分。前端主要有商品展示&#xff0c;我的订单&#xff0c;个人中心等内容&#xff1b;后端的主要功能包括产品管理&#xff0c;门店管理&#xff0c;会员管理&#x…

C++之STL(十)

1、适配器 2、函数适配器 #include <iostream> using namespace std;#include <algorithm> #include <vector> #include <functional>bool isOdd(int n) {return n % 2 1; } int main() {int a[] {1, 2, 3, 4, 5};vector <int> v(a, a 5);cou…

外贸人该怎么进行客户分类,怎么找出那20%的重要客户?

更多外贸干货及开发见客户的方法&#xff0c;尽在微信【千千外贸干货】 我们往往只是知道这个规则&#xff0c;却不懂怎么去进行客户分类&#xff0c;怎么找出这20%的重要客户&#xff1f; 具体而言&#xff0c;有8个指标来衡量&#xff1a; 1 利润率高 不以盈利为目的的企业…

使用python基于经纬度获取高德地图定位地址【逆地址解析】

一、高德地图api申请 1. 高德开放平台注册&#xff0c;登录 进入网址&#xff1a;高德开放平台 | 高德地图API 注册 -- 支付宝扫码认证 -- 完善个人信息 -- 登录 2. 申请API &#xff08;1&#xff09;点击头像 -- 应用管理 -- 我的应用 -- 创建新应用 &#xff08;2&…

对于恒指你了解够多吗?

不少人进入股市选择投资哪种哪种期货&#xff0c;都是因为听别人说利润大&#xff0c;于是也不管三七二十一&#xff0c;就盲目的跟着投资了&#xff0c;认为所有的期货都应该应用一样的操作办法&#xff0c;随机应变就是了&#xff0c;其实不然&#xff0c;每种期货都有着自己…

springboot3.x的优势在哪里,我们是否要选择springboot3.x

Spring Boot 3.x的优势主要体现在以下几个方面&#xff0c;这些优势使得它成为了一个值得考虑的选择&#xff1a; Java 17支持&#xff1a;Spring Boot 3.x 支持 Java 17&#xff0c;这是一个长期支持&#xff08;LTS&#xff09;版本&#xff0c;带来了许多新特性和性能改进。…