图像处理中的角点检测Python-OpenCV 中的实现

news2025/1/20 20:13:02

马丁·亚当斯 (Martin Adams)在Unsplash上拍摄的照片

一、说明

        在图像处理的背景下,“特征”可以直观地理解为图像中易于识别并用于表示图像的独特或独特的部分。将特征视为图像中使其可区分的“地标”或“焦点”。为了使这一点更具关联性,请考虑一下您如何识别现实生活中熟悉的地方或物体。

照片由Cory Schadt在Unsplash上拍摄

        想象一下您正在看一张繁忙的城市街道的照片。什么首先引起您的注意?它可能是一座形状独特的建筑,一个色彩缤纷的广告牌,或者一个独特的街道标志。这些元素之所以引人注目,是因为它们在某种程度上与周围环境不同——也许是通过形状、颜色或纹理。在图像处理中,这些类似于特征。

功能是许多高级图像处理任务的构建块。它们就像算法用来“理解”并以有意义的方式处理图像的线索或关键点。

二、特征类型

  • 边缘是图像中强度或颜色的显着过渡。想象一下天空映衬下一座山的轮廓;山与天交界处形成边缘。

边缘。来源

  • 是两条或多条边相交的点。它们就像相框的角,两条边相交于一点。

角落。来源

  • 斑点是图像中与周围区域相比具有不同属性(例如亮度或颜色)的区域。将它们视为表面上的斑点或瑕疵。它们用于需要识别或计算对象的场景,例如计算图像中苹果的数量。

斑点。来源

  • 山脊是图像强度在多个方向上增加的线条,例如波浪的波峰或山脊。

山脊。来源

三、特征检测

        图像处理中的特征检测算法就像侦探在复杂场景中寻找重要线索的工具。这些算法旨在自动检测和识别图像的关键特征,例如边缘、角点和特定图案,这些特征对于理解和分析图像至关重要。

        角点可以被认为是两条边缘的交点,或者图像中梯度方向显着改变的点。它代表多个方向上局部强度变化较大的点。

  • 哈里斯角点检测
  • Shi-Tomasi角点检测

3.1 哈里斯角点检测

Harris 角点检测器是图像处理角点检测的基本算法。它可以识别图像中各个方向上强度发生显着变化的点。

        Harris 角点检测器背后的核心思想是识别图像中当您向任何方向移动时强度发生显着变化的区域。它基于这样的观察:在平坦区域(如晴朗的天空),强度保持相当恒定,而沿着边缘,强度在一个方向上发生巨大变化,但在垂直方向上变化不大。然而,在拐角处,各个方向的强度都会发生变化。

该算法使用一种数学方法,涉及计算图像中每个像素的矩阵(通常称为哈里斯矩阵)。该矩阵捕获该像素周围所有方向的梯度变化(即强度变化)。

它映射 X 和 Y 中采用的所有梯度。

来源

然后将椭圆拟合到分布中。

来源

该算法根据 lambda 值计算响应值。

来源

这是演示 Harris 角点检测器的基本脚本。

import cv2
import numpy as np

image = cv2.imread('image.jpeg')
if image is None:
    print("Error loading image")
    exit()

# Convert to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Convert to float32 for more precision
gray = np.float32(gray)

# Apply Harris Corner Detector
corners = cv2.cornerHarris(gray, blockSize=2, ksize=3, k=0.04)

# Dilate corner image to enhance corner points
corners = cv2.dilate(corners, None)

# Threshold to mark the corners on the image
threshold = 0.01 * corners.max()
image[corners > threshold] = [0, 0, 255]

# Display the result
cv2.imshow('Harris Corners', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.cornerHarris函数是 OpenCV 中用于图像角点检测的关键函数,基于 Harris 角点检测算法。该函数分析图像中强度的局部变化以识别角点。

  • src是输入图像。它必须是 类型的灰度图像float32
  • blockSize是考虑用于角点检测的邻域的大小。它指定将计算强度局部方差的窗口(即局部区域)的大小。
  • ksize是 Sobel 算子的孔径参数。Sobel 算子用于计算 Harris 角点检测算法中的图像梯度(x 和 y 导数)。ksize是用于 Sobel 算子的内核的大小。常见值为 3、5 或 7。较大的内核大小有助于平滑梯度,但可能会降低检测尖角点的准确性。
  • k是算法中使用的方程中的 Harris 检测器自由参数。它用于计算响应分数,确定某个区域是否被视为角点。的值k通常很小,通常在 0.04 到 0.06 的范围内。确切的值可以根据应用的具体要求进行调整。非常高的值可能会导致检测到更少的角点,而非常低的值可能会使检测器对噪声过于敏感。

哈里斯角点检测。图片由作者提供。

哈里斯角点检测器擅长区分边缘和角点。它不会错误地将边缘识别为角点。即使图像旋转,它仍然有效,因为角结构不会随着旋转而改变。虽然它不是完全尺度不变的,但在尺度的轻微变化和不同的照明条件下它的表现相当好。

检测器可能难以应对主要的尺度变化(例如,以不同尺寸出现的同一角),并且其本质上并不是为了处理照明或视角的显着变化而设计的。

它可用于特征提取、图像匹配、运动跟踪和 3D 建模等各种应用。

3.2 Shi-Tomasi角点检测

Shi-Tomasi 方法,也称为“良好特征跟踪检测器”,基于与 Harris 角点检测器相同的基本原理。然而,它引入了一种不同的方法来评估角点响应。

主要区别在于所使用的角响应函数。Harris 使用基于梯度协方差矩阵的两个特征值的组合得分,而 Shi-Tomasi 方法通过仅考虑两个特征值中较小的一个来简化此过程。

Shi-Tomasi 方法特别擅长检测更清晰且定义明确的角点。与 Harris 方法相比,它不太容易检测到平坦区域或沿边缘的假角。

import cv2
import numpy as np


image = cv2.imread('07.jpg')
if image is None:
    print("Error loading image")
    exit()

# Convert to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Shi-Tomasi corner detection parameters
maxCorners = 100
qualityLevel = 0.01
minDistance = 10

corners = cv2.goodFeaturesToTrack(gray, maxCorners, qualityLevel, minDistance)

# Draw corners on the image
if corners is not None:
    corners = np.int0(corners)  
    for i in corners:
        x, y = i.ravel()
        cv2.circle(image, (x, y), 3, (0, 255, 0), -1)  

# Display the result
cv2.imshow('Shi-Tomasi Corners', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

什托马西角。图片由作者提供。

Shi-Tomasi 角点检测需要灰度图像。cv2.cvtColor将图像从一种颜色空间转换为另一种颜色空间。

cv2.goodFeaturesToTrack是实现Shi-Tomasi角点检测算法的函数。

void cv::goodFeaturesToTrack ( InputArray  image,
OutputArray  corners,
int  maxCorners,
double  qualityLevel,
double  minDistance,
InputArray  mask = noArray(),
int  blockSize = 3,
bool  useHarrisDetector = false,
double  k = 0.04 
) 
  • image是要执行角点检测的源图像。
  • maxCorners指定要返回的最大角数。如果将其设置为负数,它将返回所有检测到的角点。
  • qualityLevel表征要考虑的拐角的最低质量。它是一种相对度量,基于图像中角点的最高质量得分。分数是根据 Shi-Tomasi 方法中的特征值或 Harris 中的响应函数确定的。
  • minDistance指定返回角点之间的最小欧氏距离。
  • mask是一个可选的二进制掩码,指定在哪里寻找角点。
  • blockSize是考虑用于角点检测的邻域的大小。

四、结论

 以上我们了解到Harris和Shit焦点检测方法,关于tezheng

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

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

相关文章

gitLab 和Idea分支合并

以下二选1即可完成分支合并建议第一种简单有效 Idea合并方式 切换到被合并的分支,如我想把0701的内容合并到dev,切换到dev分支,然后再点击merge然后选择要合并的分支,即可,此时git上的代码没有更新只是把代码合到本地需要pull才…

使用Java网络编程,窗口,线程,IO,内部类等实现多人在线聊天1.0

1.整体思路 思路图 整体思路如上: 涉及知识点:线程网络编程集合IO等 TCP 协议 2.代码实现过程 服务端 import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import jav…

管理和监控CentOS上的HTTP服务

CentOS作为一款稳定的开源服务器操作系统,为各种网络服务提供了优秀的支持。其中,HTTP服务是互联网上最常用的服务之一,它为人们提供了便捷的信息访问和交互方式。在CentOS上管理和监控HTTP服务是一项重要的任务,下面我们将介绍一…

华为数通---BFD多跳检测示例

定义 双向转发检测BFD(Bidirectional Forwarding Detection)是一种全网统一的检测机制,用于快速检测、监控网络中链路或者IP路由的转发连通状况。 目的 为了减小设备故障对业务的影响,提高网络的可靠性,网络设备需要…

前端“量子纠缠”:multipleWindow3dScene 来了

最近前端实现的量子纠缠在网络上火了起来,作者bgstaal的推文:效果如下: 量子纠缠 那我们一起来看下什么是量子纠缠,以及前端是如何实现的。 什么是量子纠缠? 在量子力学里,当几个粒子在彼此相互作用后&…

【Java】实现顺序表基本的操作(数据结构)

文章目录 前言顺序表1、打印顺序表2、增加元素3、在任意位置增加元素4、判断是否包含某个元素5、查找某个元素对于的位置6、获取任意位置的元素7、将任意位置的元素设为value8、删除第一次出现的关键字9、获取顺序表长度10、清空顺序表总结 前言 在了解顺序表之前我们要先了解…

rust高级 异步编程 二 pin

文章目录 定海神针 Pin 和 Unpin为何需要 PinUnpin深入理解 PinPin 在实践中的运用固定到堆上将固定住的 Future 变为 Unpin总结 定海神针 Pin 和 Unpin 在 Rust 中,所有的类型可以分为两类: 类型的值可以在内存中安全地被移动,例如数值、字符串、布尔…

OpenCV图像相似性比对算法

背景 在做图像处理或者计算机视觉相关的项目的时候,很多时候需要我们对当前获得的图像和上一次的图像做相似性比对,从而找出当前图像针对上一次的图像的差异性和变化点,这需要用到OpenCV中的一些图像相似性和差异性的比对算法,在O…

华为数通---配置端口安全案例

端口安全简介 端口安全(Port Security)通过将接口学习到的动态MAC地址转换为安全MAC地址(包括安全动态MAC、安全静态MAC和Sticky MAC),阻止非法用户通过本接口和交换机通信,从而增强设备的安全性。 组网需…

二百一十三、Flume——Flume拓扑结构介绍

一、目的 最近在看尚硅谷的Flume资料,看到拓扑结构这一块,觉得蛮有意思,于是整理一下Flume的4种拓扑结构 二、拓扑结构 (一)简单串联 1、结构含义 这种模式是将多个flume顺序连接起来了,从最初的sourc…

一键抠图|3个智能AI抠图软件实现抠图自由!

听说你对如何利用AI抠图技术去除白色背景感兴趣?设想一下,你有一张某人站在白色背景前的照片,而你只希望能留下这个人物。在过去,你可能需要花费大量时间和精力手动进行抠图。但现在,AI技术来拯救你了!AI可…

计网实验7

解决:路由器用rip连接,主机通过域名访问,主机之间发送电子邮件 实验步骤 1.搞好部件 2.配好两台主机的ip,掩码,网关 3.连接一下两台主机,由于两台路由器没有连接,所以两台主机也无法连通,丢包率…

搭建个人网盘应用Nextcloud

使用DNF管理软件包 1 使用winscp工具将openeuler-20.03-LTS-x86_64-dvd.iso上传至openeuler虚拟机的/root目录下,然后执行如下命令挂载ISO [rootopenEuler ~]# mount -o loop /root/openEuler-20.03-LTS-everything-x86_64-dvd.iso /mnt/2 添加软件源 [rootope…

智能优化算法应用:基于社交网络算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于社交网络算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于社交网络算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.社交网络算法4.实验参数设定5.算法结果6.参考…

ChatGPT,作为一种强大的自然语言处理模型,具备显著优势,能够帮助您在各个领域取得突破

2023年随着OpenAI开发者大会的召开,最重磅更新当属GPTs,多模态API,未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义,不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

vue2+typescript使用高德地图2.0版本

高德地图 webjs api 2.0官网教程 AMap.Driving使用说明 <div class"mmp"><div id"map" ref"mapcontainer"></div></div><script lang"ts"> //安全密钥 window._AMapSecurityConfig{securityJsCode: &qu…

【南京站-EI会议征稿中】第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024)

第三届网络安全、人工智能与数字经济国际学术会议&#xff08;CSAIDE 2024&#xff09; 2024 3rd International Conference on Cyber Security, Artificial Intelligence and Digital Economy 第三届网络安全、人工智能与数字经济国际学术会议&#xff08;CSAIDE 2024&…

〖大前端 - 基础入门三大核心之JS篇㊼〗- BOM基础之window对象

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

SpringBoot3-集成mybatis

1、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/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.…

编程过程中出现bug如何应对?

编程过程中出现bug如何应对&#xff1f; 1.找错误原因 如果完全不知道出错的原因&#xff0c;或者说存在着很多错误的有原因&#xff0c;----》控制变量法 例如&#xff0c;昨天我在使用torchrun 多卡并行一个程序的时候&#xff0c;出现了大量的bug, 于是我将报错信息放在网…