一键找出图像中物体的角点


✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨

🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。

我是Srlua小谢,在这里我会分享我的知识和经验。🎥

希望在这里,我们能一起探索IT世界的奥妙,提升我们的技能。🔮

记得先点赞👍后阅读哦~ 👏👏

📘📚 所属专栏:传知代码论文复现

欢迎访问我的主页:Srlua小谢 获取更多信息和资源。✨✨🌙🌙

​​

​​

目录

概述

算法原理

演示效果

核心逻辑

使用方式

基础镜像

配置环境

直接运行

更换图片运行

参考文献


 本文所有资源均可在该地址处获取。

概述

本文复现论文A COMBINED CORNER AND EDGE DETECTOR中提出的图像中的物体角点检测算法,也称Harris算法。原文连接https://citeseerx.ist.psu.edu/document?repid=rep1&type=pdf&doi=88cdfbeb78058e0eb2613e79d1818c567f0920e2

该论文所提出的角点检测算法是计算机视觉领域的经典算法,至今仍在计算机视觉领域有着广泛的应用。

该方法对算力几乎没有任何要求,依据图像邻域内灰度值的分布特点来对图像中各区域的角点进行判断。不像深度学习需要依靠大量数据的训练且对数据集分布有依赖性,所以时至今日依然在工业界有着很高的应用价值。

算法原理

正如边缘在灰度图像中在某一个方向上会出现明显的灰度变化,角点在图像中往往是在两个方向上都出现明显的灰度变化。


如在此图中,红点标注处的角点在两个箭头方向的垂直方向上都有明显的灰度变化,两个红色箭头标注出了它的两个灰度变换边缘。

假设我们现在要检测的图片为II,在图像处理中,能够充分体现图像灰度变化特征的是它的方向导数,IxIx​与IyIy​,分别代表图像II的水平方向导数与竖直方向导数。

Ix(i,j)=I(i,j+1)−I(i,j−1)2Ix​(i,j)=2I(i,j+1)−I(i,j−1)​

Iy(i,j)=I(i−1,j)−I(i+1,j)2Iy​(i,j)=2I(i−1,j)−I(i+1,j)​

Harris算法就是利用图像的方向导数制定了一个响应指标:

R=det(M)−k⋅trace(M)2R=det(M)−k⋅trace(M)2

个人感觉原文的公式不太好理解,以下我将按照我的理解对公式进行适当的改变。
对于R,实际上是一个R图,其尺寸与我们要检测的图像II一致,于是上面的相应指标实际上是每个像素都有一个相应指标,即:

R(i,j)=det(M(i,j))−k⋅trace(M(i,j))2R(i,j)=det(M(i,j))−k⋅trace(M(i,j))2

其中

M(i,j)=[A(i,j)B(i,j)B(i,j)C(i,j)]M(i,j)=[A(i,j)B(i,j)​B(i,j)C(i,j)​]

在用3X3邻域内的数据进行操作时,A(i,j)、B(i,j)、C(i,j)在原文中对应的定义应该是这样的:

A(i,j)=∑m=−11∑n=−11ω(m,n)Ix2(i+m,j+n)B(i,j)=∑m=−11∑n=−11ω(m,n)Ix(i+m,j+n)×Iy(i+m,j+n)C(i,j)=∑m=−11∑n=−11ω(m,n)Iy2(i+m,j+n)A(i,j)=m=−1∑1​n=−1∑1​ω(m,n)Ix2​(i+m,j+n)B(i,j)=m=−1∑1​n=−1∑1​ω(m,n)Ix​(i+m,j+n)×Iy​(i+m,j+n)C(i,j)=m=−1∑1​n=−1∑1​ω(m,n)Iy2​(i+m,j+n)

即对Ix2Ix2​、Iy2Iy2​和IxIyIx​Iy​三个方向导数图在3X3邻域内进行卷积得到A、B和C。
其中 ωω是高斯平滑核,主要是为了减少噪声对方向导数的影响。大多数情况下,ωω取一个全一矩阵就好。本方法也是采用了全一矩阵,所以以上定义可以修改为:

A(i,j)=∑m=−11∑n=−11Ix2(i+m,j+n)B(i,j)=∑m=−11∑n=−11Ix(i+m,j+n)×Iy(i+m,j+n)C(i,j)=∑m=−11∑n=−11Iy2(i+m,j+n)A(i,j)=m=−1∑1​n=−1∑1​Ix2​(i+m,j+n)B(i,j)=m=−1∑1​n=−1∑1​Ix​(i+m,j+n)×Iy​(i+m,j+n)C(i,j)=m=−1∑1​n=−1∑1​Iy2​(i+m,j+n)

所以RR指标的最终定义可以改为:

R(i,j)=Det⁡(M(i,j))−k(Tr⁡(M(i,j)))2=(A(i,j)C(i,j)−B(i,j)2)−k×(A(i,j)+C(i,j))2R(i,j)=Det(M(i,j))−k(Tr(M(i,j)))2=(A(i,j)C(i,j)−B(i,j)2)−k×(A(i,j)+C(i,j))2

其中k是一个经验参数,本算法中取0.02,当然也可以根据具体情况进行调整,通常来说k越大,算法对角点的判别就越严格,会有更少的点被判别为角点;k越小,算法的判别就越松一些,会有更多的点被判别为角点。

得到R图后,将R图中最大值RmaxRm​ax的0.2倍作为阈值。将R图中小于0.2Rmax0.2Rm​ax的像素坐标判别为是角点坐标,其余的则为非角点坐标,最终得到我们的结果图。

演示效果

Description

核心逻辑

def HarrisCornerDetector(image,k=0.02):
# 读取图像
    # 将图像转换为numpy数组
    I= image

    I=np.array(I)

    sobel_x = np.array([[0, 0, 0], [-0.5, 0, 0.5], [0, 0, 0]])
    sobel_y=np.array([[0,0.5,0],[0,0,0],[0,-0.5,0]])

    # 对图像进行水平方向的卷积
    I_x = convolve2d(I, sobel_x, mode="same", boundary="symm")
    I_y=convolve2d(I,sobel_y,mode='same',boundary='symm')


    I2_x=I_x**2
    I2_y=I_y**2
    Ix_Iy=I_x*I_y

    sobel=np.array([[1,1,1],[1,1,1],[1,1,1]])

    A=convolve2d(I2_x,sobel,mode="same",boundary="symm")
    B=convolve2d(Ix_Iy,sobel,mode="same",boundary="symm")
    C=convolve2d(I2_y,sobel,mode="same",boundary="symm")

    R=(A*C-B**2)-k*(A+C)**2

    R_max=np.max(R[1:-1,1:-1])

    C=R

    C[C<=(0.2*R_max)]=0
    C[C>(0.2*R_max)]=1

    return C

使用方式

基础镜像

python:3.9.7

配置环境

解压后进入HarrisCornerDetector项目路径
运行以下命令:

pip install -r requirements.txt

直接运行

python main.py

即可看到视频中示例图片的角点检测效果。

更换图片运行

修改main.py文件里的默认图片路径


将"data/rice.png"更改为你自己的图片路径即可。

同时,我也找了第二张示例图片放在了data路径下,将"data/rice.png"更换为"data/1.webp",就可以看到演示图片中棋盘的角点检测效果。

参考文献

[1] Harris C, Stephens M. A combined corner and edge detector[C]//Alvey vision conference. 1988, 15(50): 10-5244.

​​

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

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

相关文章

考研数学【线性代数基础box(数二)】

本文是对数学二线性代数基础进行总结&#xff0c;一些及极其简单的被省略了&#xff0c;代数的概念稀碎&#xff0c;不如高数关联性高&#xff0c;所以本文仅供参考&#xff0c;做题请从中筛选&#xff01; 本文为初稿&#xff0c;后面会根据刷题和自己的理解继续更新 第一章…

警惕!手动调整服务器时间可能引发的系统灾难

警惕&#xff01;手动调整服务器时间可能引发的系统灾难 1. 鉴权机制1.1 基于时间戳的签名验证1.2 基于会话的认证机制&#xff08;JWT、TOTP&#xff09; 2. 雪花算法生成 ID 的影响2.1 时间戳回拨导致 ID 冲突2.2 ID 顺序被打乱 3. 日志记录与审计3.1 日志顺序错误3.2 审计日…

【Linux】Systemtap在CentsOS9上测试成功了

在Ubuntu上测试没有成功&#xff0c;先看看运行成功的效果吧&#xff1a; 看到运行的效果&#xff0c;可以安心些&#xff0c;哈哈 指导操作来源于这里&#xff1a;SystemTap 主要来源于这里&#xff1a; https://sourceware.org/systemtap/SystemTap_Beginners_Guide/using-s…

【EthIf-03】 EthernetInterface软件栈的文件组织结构

上图为《AUTOSAR_SWS_EthernetInterface【v2.2.0 】》给出的EthernetInterface软件栈的文件组织结构,本文主要关注arccore代码中已存在的文件的功能和作用,不知道的小伙伴可以查看🔗EthIf的文件结构中的src和inc目录下的文件有哪些: 1. 文件结构 1.1 EthIf_Cbk.h 头文…

【LeetCode刷题之路】622.设计循环队列

LeetCode刷题记录 &#x1f310; 我的博客主页&#xff1a;iiiiiankor&#x1f3af; 如果你觉得我的内容对你有帮助&#xff0c;不妨点个赞&#x1f44d;、留个评论✍&#xff0c;或者收藏⭐&#xff0c;让我们一起进步&#xff01;&#x1f4dd; 专栏系列&#xff1a;LeetCode…

基于windows环境使用nvm安装多版本nodejs

目录 前言 一、卸载node 二、nvm是什么&#xff1f; 三、nvm安装 1.官网下载 nvm 包 2. 安装nvm-setup.exe 3. 配置路径和下载镜像 4. 检查安装是否完成 四、 使用nvm安装node 五、修改npm默认镜像源为淘宝镜像 六、环境变量配置 1. 新建目录 2. 设置环境变量 七…

Neo4j+Neovis+Vue3:前端连接数据库渲染

Neovis&#xff08;github&#xff09;&#xff1a;https://github.com/neo4j-contrib/neovis.js Neovis配置文档&#xff1a;neovis.js (neo4j-contrib.github.io) 一、安装Neo4j 参考文章&#xff1a;neo4j下载安装配置步骤-CSDN博客 二、Neovis使用 1.npm引入 ?npm ins…

《宇宙机器人》提示错误弹窗“找不到d3dx9_43.dll”是什么原因?“d3dx9_43.dll缺失”怎么解决?

电脑游戏运行时常见问题解析&#xff1a;《宇宙机器人》提示“找不到d3dx9_43.dll”的解决之道 TGA2024落幕&#xff0c;年度最佳游戏——《宇宙机器人》&#xff0c;作为一名在软件开发领域深耕多年的从业者&#xff0c;我深知电脑游戏在运行过程中可能会遇到的各种挑战&…

Cesium 限制相机倾斜角(pitch)滑动范围

1.效果 2.思路 在项目开发的时候&#xff0c;有一个需求是限制相机倾斜角&#xff0c;也就是鼠标中键调整视图俯角时&#xff0c;不能过大&#xff0c;一般 pitch 角度范围在 0 至 -90之间&#xff0c;-90刚好为正俯视。 在网上查阅了很多资料&#xff0c;发现并没有一个合适的…

28. Three.js案例-创建圆角矩形并进行拉伸

28. Three.js案例-创建圆角矩形并进行拉伸 实现效果 知识点 WebGLRenderer (WebGL渲染器) WebGLRenderer 是 Three.js 中用于渲染 3D 场景的主要渲染器。 构造器 WebGLRenderer( parameters : Object ) 参数类型描述parametersObject渲染器的配置参数&#xff0c;可选。 …

transformer学习笔记-自注意力机制(2)

经过上一篇transformer学习笔记-自注意力机制&#xff08;1&#xff09;原理学习&#xff0c;这一篇对其中的几个关键知识点代码演示&#xff1a; 1、整体qkv注意力计算 先来个最简单未经变换的QKV处理&#xff1a; import torch Q torch.tensor([[3.0, 3.0,0.0],[0.5, 4…

基于米尔全志T527开发板的OpenCV进行手势识别方案

本文将介绍基于米尔电子MYD-LT527开发板&#xff08;米尔基于全志T527开发板&#xff09;的OpenCV手势识别方案测试。 摘自优秀创作者-小火苗 米尔基于全志T527开发板 一、软件环境安装 1.安装OpenCV sudo apt-get install libopencv-dev python3-opencv 2.安装pip sudo apt…

arXiv-2024 | VLM-GroNav: 基于物理对齐映射视觉语言模型的户外环境机器人导航

作者&#xff1a; Mohamed Elnoor, Kasun Weerakoon, Gershom Seneviratne, Ruiqi Xian, Tianrui Guan, Mohamed Khalid M Jaffar, Vignesh Rajagopal, and Dinesh Manocha单位&#xff1a;马里兰大学学院公园分校原文链接&#xff1a;VLM-GroNav: Robot Navigation Using Phys…

Typora 修改默认的高亮颜色

shift F12 参考 怎么给typora添加颜色&#xff1f;

基于阿里云Ubuntu22.04 64位服务器Java及MySql环境配置命令记录

基于阿里云Ubuntu22.04 64位服务器Java及MySql环境配置命令记录 Java 23 离线环境配置MySql 环境配置MySQL常用命令 Java 23 离线环境配置 下载 Ubuntu环境下 Java 23 离线包 链接: java Downloads. 在Linux环境下创建一个安装目录 mkdir -p /usr/local/java将下载好的jdk压缩…

【树莓派4B】MindSpore lite 部署demo

一个demo&#xff0c;mindspore lite 部署在树莓派4B ubuntu22.04中&#xff0c;为后续操作开个门&#xff01; 环境 开发环境&#xff1a;wsl-ubuntu22.04分发版部署环境&#xff1a;树莓派4B&#xff0c;操作系统为ubuntu22.04mindspore lite版本&#xff1a;mindspore-li…

RK3576 Android14,内存大于4G时UVC应用无法申请内存

最近有个项目需要将Linux虚拟成UVC摄像头&#xff0c;开发过程中遇到一个奇怪的事情&#xff0c;通过V4l2框架接口申请内存时&#xff0c;相同的板子&#xff0c;只是内存一个4G一个8G。4G的内存可以申请成功&#xff0c;8G就不行。提示“内存不足” 内存更大反而内存不足&…

HarmonyOS-高级(四)

文章目录 应用开发安全应用DFX能力介绍HiLog使用指导HiAppEvent &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;HarmonyOS专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年12月11日11点18分 应用开发安全 应用隐私保护 隐私声明弹窗的作…

函数与结构体(入门6)

【深基7.例1】距离函数 #include <iostream> #include <iomanip> #include <cmath> using namespace std; int main() {double x1, x2, x3, y1, y2, y3;cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;double d1 pow(pow(…

质数的和与积

质数的和与积 C语言代码C 代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 两个质数的和是S&#xff0c;它们的积最大是多少&#xff1f; 输入 一个不大于10000的正整数S&#xff0c;为两个质数的和。 输出 一个整…