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 pltpath = '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 + 0im1[dst > 0.1 * dst.max()] = [255, 0, 0]
ax.imshow(im1)
plt.tight_layout()
plt.show()

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

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

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

相关文章

力扣随机一题 位运算/滑动窗口/数组

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 3191.使二进制数组全部等于1的最少操作次数I【中等】 题目&#xff1a; 给…

bable 【实用教程】

简介 bable 用于将 ES6 的语法编译为 ES5 只关心语法&#xff0c;不关心 API 是否正确。不处理模块化&#xff08;webpack 会处理&#xff09; 搭建开发环境 安装相关的包 npm i babel/cli babel/core babel/preset-env新建文件 .babelrc&#xff0c;内容为 { "presets…

盛水问题解决

力扣上承水问题有11和42题 一、承最多水的容器 解决思路&#xff1a; 要得到存储最大水量&#xff0c;得到max(长度 * 高度)&#xff0c;使用双指针解决这类问题 先判断左指针还是右指针谁大&#xff0c;找最大值&#xff0c;保留最大值&#xff0c;让最小值向中间移动&#…

大模型的一个有前途的应用

大型语言模型 (LLM) 通常被描述为生成人工智能 (GenAI)&#xff0c;因为它们确实具有生成文本的能力。LLM 的第一个流行应用是聊天机器人&#xff0c;其中 ChatGPT 处于领先地位。然后我们将其视野扩展到其他任务&#xff0c;例如语义搜索和检索增强生成 (RAG)。今天&#xff0…

每日一题——Python实现蓝桥杯1. 坤坤的破译任务(举一反三+思想解读+逐步优化)三千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 时间复杂度&#xff1a; 空间复杂度&#xff1a; 我要更强 时间复杂度分析…

嵌入式Linux系统编程 — 4.4 memset、bzero函数内存填充

目录 1 memset 函数 2 bzero函数 在编程中&#xff0c;经常需要将某一块内存中的数据全部设置为指定的值&#xff0c;譬如在定义数组、结构体这种类型变量时&#xff0c;通常需要对其进行初始化操作&#xff0c;而初始化操作一般都是将其占用的内存空间全部填充为 0。 1 me…

Pytorch课程论文设计参考

Pytorch下基于卷积神经网络的手写数字识别 论文格式 利用wps初步美化论文格式教程 wps论文格式变的的原因 格式变的根本原因是word为流式文件&#xff0c;就算同是word同一个版本不同电脑也会有可能变&#xff0c;字体变是因为没有嵌入字体然后观看的那台没有这个字体。 一、…

Redis和PHP的Bitmap于二进制串的相互转换

Redis和PHP的Bitmap于二进制串的相互转换 场景 错题集的存储&#xff0c;需要有正确的题号id集合&#xff0c;错误的题号id集合&#xff0c;两者并集后在全量题的集合中取反就是未答题号id 选型 基于场景的数据结构设计&#xff0c;有试过列表等&#xff0c;测试结果&#xff1…

confluence集成LDAP

一、confluence的权限管理 在集成前&#xff0c;我们必须得知道confluence自身的权限管理是如何做的。 用户组对应空间权限&#xff0c;用户组可以是一个项目&#xff0c;也可以是一个部门或组。 一个用户组里的用户&#xff0c;可以读写本空间的页面&#xff0c;而把其他组隔离…

力扣随机一题 6/28 数组/矩阵

&#x1f4dd;个人主页&#x1f339;&#xff1a;誓则盟约⏩收录专栏⏪&#xff1a;IT 竞赛&#x1f921;往期回顾&#x1f921;&#xff1a;6/27 每日一题关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d…

真实案例解析!企业如何做好安全生产管理工作?

很多企业都有相对应的安全管理制度&#xff0c;安全管理系统&#xff0c;安全管理人员等等&#xff0c;但这都仅限于企业“做了”安全生产管理&#xff0c;并不能“做好”安全生产管理。其实做好安全生产管理需要安全管理系统的配合。 听说过EHS系统吗&#xff1f;这系统能帮企…

百元平价蓝牙耳机哪款好?揭秘百元高性价比蓝牙耳机推荐

如今&#xff0c;市面上的耳机种类繁多&#xff0c;有线、无线、降噪等功能让人眼花缭乱。而对于那些预算有限、但又希望享受无线便捷和高性价比的朋友们来说&#xff0c;百元左右的蓝牙耳机无疑是一个不错的选择。这类耳机不仅能够提供不错的音质体验&#xff0c;同时价格也十…

安宝特分享 | 数字化革命,AR技术打造智慧城市的未来

随着城市化进程的加速和科技创新的不断推进&#xff0c; AR技术正逐步融入智慧城市建设的方方面面&#xff0c;为城市居民提供更智能、便捷、舒适的生活体验&#xff0c;开启了智慧城市的新时代。 01 优化城市规划与建设 AR技术在城市规划和建设中发挥着重要作用。城市规划师和…

可以在Mac电脑玩的拳皇97 for Mac(KOF97) 支持M1

《拳皇97》&#xff08;The King of Fighters 97&#xff09;是一款由SNK公司制作的拳击格斗游戏&#xff0c;于1997年在Arcade平台发布&#xff0c;随后在多个游戏平台上推出。该游戏是《拳皇》系列的第三个作品&#xff0c;继承了前作《拳皇96》的“adius”系统&#xff0c;并…

chrome 配置允许跨域

目录 1.Chrome跨域插件配置 1.1启动插件 1.2. 设置本地调试跨域 2 Firefox跨域插件 2.1. 安装插件 CORS Everywhere 2.2. 启动插件 3 工具下载链接 1.Chrome跨域插件配置 使用chrome插件“Allow CORS: Access-Control-Allow-origin ”来解决跨域问题。 点击pin图标&…

东兴市金顺心贸易有限公司联合越南名厨研发的阿吉贡河粉灵魂汤底料

东兴市金顺心贸易有限公司联合越南名厨研发的阿吉贡河粉灵魂汤底料&#xff0c;一包汤底料竟然就能撑起一家店的灵魂&#xff01;&#x1f372; 简单的食材&#xff0c;却散发出不平凡的美味&#xff0c;仿佛带我穿越千里之外。每一口都是满满的幸福与满足&#xff0c;真心推荐…

element ui 的 el-date-picker 日期选择组件设置可选日期范围

有时候&#xff0c;在使用日历控件的时候&#xff0c;我们需要进行定制&#xff0c;控制用户只能在指定日期范围内进行日期选择&#xff0c;在这里&#xff0c;我使用了 element ui 的 el-date-picker 日期选择控件&#xff0c;控制只能选择当前月及往前的2个月&#xff0c;效果…

java 笔记 第十二章 集合(部分整理细化)

集合概述 &#xff08;1&#xff09;集合是存储其他对象的特殊对象。可以将集合当做一个容器。 &#xff08;2&#xff09;集合的相关接口和类位于java.util包中 &#xff08;3&#xff09;集合中的接口和类是一个整体、一个体系。 集合接口 接口定义了一组抽象方法&#x…

98%企业竟存N日漏洞超5年,新漏洞利用攻击时长极速缩短!

专注推动网络与安全融合的全球网络安全领导者 Fortinet&#xff08;NASDAQ&#xff1a;FTNT&#xff09;&#xff0c;近日发布 FortiGuard Labs&#xff08;Fortinet全球威胁情报响应与研究团队&#xff09;《2023 下半年全球威胁态势研究报告》。本次新发布的半年度研究报告&a…

使用Python进行Socket接口测试

大家好&#xff0c;在现代软件开发中&#xff0c;网络通信是不可或缺的一部分。无论是传输数据、获取信息还是实现实时通讯&#xff0c;都离不开可靠的网络连接和有效的数据交换机制。而在网络编程的基础中&#xff0c;Socket&#xff08;套接字&#xff09;技术扮演了重要角色…