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

马丁·亚当斯 (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

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

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

相关文章

JFrog Artifactory二进制文件管理工具部署使用

1.简介 JFrog Artifactory二进制文件管理工具,目前已经在使用的公司有很多,足见他的方便好用。 2.下载安装包 点击下载地址 这里我下载的是7.9.2版本 3. 安装 (1)在安装JFrog Artifactory之前需要安装好jdk(需…

持续集成交付CICD:Sonarqube自动更新项目质量配置

目录 一、实验 1.Sonarqube手动自定义质量规则并指定项目 2.Sonarqube自动更新项目质量配置 一、实验 1.Sonarqube手动自定义质量规则并指定项目 (1)自定义质量规则 ①新配置 ②更多激活规则③根据需求激活相应规则④已新增配置 ⑤ 查看 &#x…

梯度下降(批量梯度下降、随机梯度下降、小批量梯度下降)

在上一篇中我们推导了损失函数 J ( θ ) 1 2 m ∑ i 1 m ( y i − h θ ( x i ) ) 2 J(\theta) \frac{1}{2m} \sum_{i1}^{m} (y^{i} - h_{\theta}(x^{i}))^2 J(θ)2m1​∑i1m​(yi−hθ​(xi))2的由来,结尾讲到最小化这个损失函数来找到最优的参数 θ \theta θ&…

【C++】简单工厂模式

2023年12月6日,周三下午 今天又学习了一次简单工厂模式 每多学习一次,都会加深对设计模式的理解 目录 什么是简单工厂模式简单工厂模式的优缺点举例说明 什么是简单工厂模式 简单工厂模式(Simple Factory Pattern)是一种创建型…

uni-app 微信小程序之加载行政区图

文章目录 1. 实现效果2. 实现步骤 1. 实现效果 2. 实现步骤 使用三方组件 ucharts echarts 高性能跨全端图表组件页面导入引入的三方组件 组件demo代码 <template><view class"qiun-columns"><view class"cu-bar bg-white margin-top-xs"…

管理和监控CentOS上的HTTP服务

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

华为配置风暴控制示例

组网需求 如下图所示&#xff0c;SwitchA作为二层网络到三层路由器的衔接点&#xff0c;需要防止二层网络转发的广播、未知组播或未知单播报文产生广播风 配置思路 用如下的思路配置风暴控制。 通过在GE0/0/1接口视图下配置风暴控制功能&#xff0c;实现防止二层网络转发的…

轻快小miniconda3在linux下的安装配置-centos9stream-Miniconda3 Linux 64-bit

miniconda与anaconda的区别&#xff1a; Miniconda 和 Anaconda 是用于管理环境和安装软件包的 Python 发行版。它们之间的主要区别在于以下几点&#xff1a; 1. 安装内容和大小&#xff1a; Anaconda&#xff1a; Anaconda 是一个完整的 Python 数据科学平台&#xff0c;包含…

10-tornado项目部署

1. python3的安装和配置 1.1 安装系统依赖包 sudo dnf install wget yum-utils make gcc openssl-devel bzip2-devel libffi-devel zlib-devel -y1.2 下载Python wget https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tgz1.3 解压 tar xzf Python-3.9.5.tgz 1.4 安装…

Java实现TCP一对一通信,UDP协议实现群聊

实现服务端对话框&#xff1a; 其中可自行更改对话框大小样式等配置。 package com.ex.controller;import javax.servlet.http.HttpServletRequest; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; public class …

Centos服务器上根据端口号查询jar包,根据jar包查端口号

在开发springboot服务器时&#xff0c;经常会遇到其他人部署的java服务&#xff0c;需要自己维护&#xff0c;留下的信息又非常少。经常面临找不到jar包位置&#xff0c;或者不知道占用端口&#xff0c;不知道启动命令的问题。这里记录一下常用的centos服务器上的命令&#xff…

【桑基图】绘制桑基图

绘制桑基图 一、绘制桑基图&#xff08;1&#xff09;方法一&#xff1a;去在线网站直接绘制&#xff08;2&#xff09;方法二&#xff1a;写html之后在vscode上运行 二、遇到的问题&#xff08;1&#xff09;当导入一些excel的时候&#xff0c;无法绘制出桑基图 一、绘制桑基图…

ROS-ROS通信机制-参数服务器

文章目录 一、基础理论知识二、C实现三、Python实现 一、基础理论知识 参数服务器在ROS中主要用于实现不同节点之间的数据共享。参数服务器相当于是独立于所有节点的一个公共容器&#xff0c;可以将数据存储在该容器中&#xff0c;被不同的节点调用&#xff0c;当然不同的节点…

【LeetCode刷题】-- 79.单词搜索

79.单词搜索 方法&#xff1a;使用回溯 使用dfs函数表示判断以网格的(i.j)位置出发&#xff0c;能否搜索到word(k)&#xff0c;其中word(k)表示字符串word从第k个字符开始的后缀子串&#xff0c;如果能搜索到&#xff0c;返回true,反之返回false 如果board[i][j]≠word[k]&am…

李宏毅gpt个人记录

参考&#xff1a; 李宏毅机器学习--self-supervised&#xff1a;BERT、GPT、Auto-encoder-CSDN博客 用无标注资料的任务训练完模型以后&#xff0c;它本身没有什么用&#xff0c;GPT 1只能够把一句话补完&#xff0c;可以把 Self-Supervised Learning 的 Model做微微的调整&am…

分享一个Python网络爬虫数据采集利器

前言 你是否曾为获取重要数据而感到困扰&#xff1f;是否因为数据封锁而无法获取所需信息&#xff1f;是否因为数据格式混乱而头疼&#xff1f;现在&#xff0c;所有这些问题都可以迎刃而解。让我为大家介绍一款强大的数据收集平台——亮数据Bright Data。 作为世界领先的数据…

【Qt】QLineEdit显示输入十六进制,位数不足时按照规则填充显示及每两个字符以空格填充

问题 在实际开发中&#xff0c;有时候需要对输入进行限制&#xff0c;一是更加合理&#xff0c;二是防止出现误操作。 比如&#xff1a; 使用Qt进行应用程序开发时&#xff0c;对单行编辑框QLineEdit控件&#xff0c;设置只可输入十六进制。 限制输入的方式常用且经典的是使用…

限流算法,基于go的gRPC 实现的

目录 一、单机限流 1、令牌桶算法 3、固定窗口限流算法 4、滑动窗口 二、集群限流 1、分布式固定窗口 &#xff08;基于redis&#xff09; 2、分布式滑动窗口 一、单机限流 1、令牌桶算法 令牌桶算法是当流量进入系统前需要获取令牌&#xff0c;没有令牌那么就要进行限…

Docker+jenkins+gitlab实现持续集成

1.安装环境 服务器ip虚拟机版本192.168.5.132centos7.6192.168.5.152centos7.6 2. 安装docker 安装必要的一些系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2添加软件源信息&#xff0c;要确保centos7能上外网 yum-config-manager --add-repo http:…

什么是数据清洗、特征工程、数据可视化、数据挖掘与建模?

1.1什么是数据清洗、特征工程、数据可视化、数据挖掘与建模&#xff1f; 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解1.1节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。内容涵…