数字图像处理——亚像素边缘的轮廓提取
像素
像素是图像处理中的基本单位,一个像素是图像中最小的离散化单位,具有特定的位置和颜色信息。在数字图像中,每个像素都有一个特定的坐标,通常以行和列的形式表示。每个像素的颜色信息可以通过不同的表示方式,如灰度或RGB(红绿蓝)颜色模型来表示。在灰度图像中,每个像素只包含亮度信息,而在RGB图像中,每个像素包含红、绿、蓝三个颜色通道的信息。
原图:
放大后可以看到像素的排列:
分辨率是通过图像中的像素数量来描述的,通常以水平像素数和垂直像素数表示(例如,1920x1080表示水平有1920个像素,垂直有1080个像素)。更高的分辨率通常表示图像有更多的细节。
在面阵相机中,感光元件(如CCD或CMOS传感器)捕捉到的光信号通过模数转换被转换成数字值,这些数字值被映射到图像中的像素。这个离散化的过程允许以数字形式存储和处理图像,使得计算机可以对图像进行分析、编辑和显示。
假设CMOS摄像芯片像素间距为5.2微米。当摄像机捕捉物理世界中连续的图像时,这些图像经过离散化处理,即被分成离散的像素。每个成像面上的像素点在宏观上看似连续,代表了其附近的颜色或亮度。尽管在宏观尺度上两个相邻像素之间的距离为5.2微米,但在微观尺度上,认识到它们之间可能存在更小的结构或信息,通过在两个物理像素之间引入虚拟像素,从而更细致地描述图像中的变化,这个虚拟引入的像素被称之为亚像素。
亚像素
亚像素是在数字成像领域,由于物理上已经无法在相邻像素之间增加更多实际的感光单元,通过插值算法引入虚拟像素以在图像中提高测量的精度。
插值是一种通过已知数据点来估算未知位置的方法。在图像处理中,二次或多次插值算法可以在相邻像素的位置之间插入虚拟像素,从而得到更丰富和细致的图像信息。这些虚拟像素的值是通过对相邻实际像素值的计算获得的。
常见的插值算法包括双线性插值、双三次插值等。这些算法通过考虑相邻像素之间的灰度或颜色变化,以及它们的空间关系,生成更精确的图像表示。通过引入亚像素,可以在图像中捕捉到更多的细节,提高测量的精度。
方点是物理像素,圆点为引入虚拟的亚像素:
亚像素精度在对相邻物理像素之间间隔进行更细致划分的程度。这一精度通常通过将相邻像素间隔分成二等分、三等分、四等分等来实现。例如,考虑一张5×5像素的图像,如果将相邻像素的间隔划分为四等分,就相当于创建了一个16×16的离散点阵。在这个点阵中,大正方形的点表示物理像素,而小点表示新生成的亚像素。
这种细分允许在更精细的层面上表示图像,为进行插值运算提供了更多的数据点。在实际应用中,现代机器视觉组件已经能够可靠估算至1/25的亚像素精度。这意味着系统能够以相当高的准确度测量图像中的细微特征,为各种应用领域,包括目标跟踪、图像识别和计算机视觉任务,提供更可靠的性能。高亚像素精度有助于系统更精确地捕捉和处理图像细节,提高整体性能水平。
基于亚像素的边缘检测
边缘检测
图像中的目标边缘是由一组相连的像素组成的,这些像素位于灰度不连续的两个区域的交界处。目标边缘是图像中基本的特征之一,通常表现为灰度的跳变。然而,由于各种噪声的存在,机器视觉系统采集到的图像中,目标边缘处的像素灰度变化通常并非理想的阶跃式跳变,而更倾向于渐进的变化方式。因此,可以使用模型来表示这种渐进变化,如图中所示。
在大多数情况下,基于图像自身的像素分辨率,可以找到满足机器视觉检测需求的边缘点位置。然而,在一些特殊情况下,由于传感器尺寸或成本的限制,即使相机系统的镜头与传感器匹配并且光照条件较好,采集到的图像可能很难满足对最小分辨率的需求。在这种情况下,可以采用亚像素(subpixel)边缘定位方法,以提高边缘点位置的准确度。
亚像素边缘检测
处理图像的过程中,首先进行像素级边缘提取,然后利用曲面拟合来提取亚像素级别的边缘。为了抵抗噪声,对数据进行平滑处理,接着通过梯度图像中的边缘点梯度方向,找到亚像素级别的最大值,这一最大值通常位于梯度方向所在的直线上。通过曲面拟合,将拟合后的曲面与梯度方向所在的直线相交,然后求解这些交点的极值,就能得到该点的亚像素级别的表示。这一过程有助于提高对图像边缘的精确定位,特别是在面临噪声和低分辨率图像的情况下。
像素级边缘:
亚像素级边缘:
计算方法
给定一组离散值,设观测到的极值点位置为 x,其对应的值为 f(x),而其左右相邻位置的值分别为 f(x-1) 和 f(x+1)。真实的极值点位置为 x+δ,令 δ^ 为 δ 的估计值。假设 x 的邻域可以通过某个模型进行近似,比如高斯近似或抛物线近似,那么可以根据 x 的邻域信息,利用模型对极值进行估计。
高斯近似
高斯近似一维高斯函数 y = y m a x ⋅ e x p ( − ( x − μ ) 2 2 σ 2 ) y=y_{m a x}\cdot e x p(-{\frac{(x-\mu)^{2}}{2\sigma^{2}}}) y=ymax⋅exp(−2σ2(x−μ)2) 当 y m a z = 1 2 σ π y_{m a z}={\frac{1}{\sqrt{2\sigma\pi}}} ymaz=2σπ1 时:
假设x邻域可用高斯近似,用 (x,f(x))、 (x−1,f(x−1))、 (x+1,f(x+1))三点对高斯函数进行拟合,获得模型参数μ即为峰值位置, δ ^ = μ − x {\hat{\delta}}=\mu-x δ^=μ−x 时,将三点带入上面的高斯函数两边同时取对数求得:
δ ^ = 1 2 ln ( f ( x − 1 ) ) − ln ( f ( x + 1 ) ) ln ( f ( x − 1 ) ) − 2 ln ( f ( x ) ) + ln ( f ( x + 1 ) ) {\hat{\delta}}={\frac{1}{2}}{\frac{\ln(f(x-1))-\ln(f(x+1))}{\ln(f(x-1))-2\ln(f(x))+\ln(f(x+1))}} δ^=21ln(f(x−1))−2ln(f(x))+ln(f(x+1))ln(f(x−1))−ln(f(x+1))
线性插值
假设在极值两侧是线性增长和线性下降的,且上升和下降的速度相同,即y=kx+b,上升侧k>0,下降侧k<0,两者绝对值相同,可以利用这个性质求解极值位置。若f(x+1)>f(x−1)则极值位于 (x,x+1)之间,可列等式:
f ( x ) − f ( x − 1 ) x − ( x − 1 ) = f ( x + δ ) − f ( x ) x + δ − x = f ( x + δ ) − f ( x + 1 ) x + 1 − ( x + δ ) {\frac{f(x)-f(x-1)}{x-(x-1)}}={\frac{f(x+\delta)-f(x)}{x+\delta-x}}={\frac{f(x+\delta)-f(x+1)}{x+1-(x+\delta)}} x−(x−1)f(x)−f(x−1)=x+δ−xf(x+δ)−f(x)=x+1−(x+δ)f(x+δ)−f(x+1)
可示得:
δ ^ = 1 2 f ( x + 1 ) − f ( x − 1 ) f ( x ) − f ( x − 1 ) {\hat{\delta}}={\frac{1}{2}}{\frac{f(x+1)-f(x-1)}{f(x)-f(x-1)}} δ^=21f(x)−f(x−1)f(x+1)−f(x−1)
下图中蓝色点即为插值出来的边缘点:
亚像素边缘检测的注意事项
摄像机几何标定的重要性: 若未对摄像机进行几何标定,即确定摄像机的内部和外部参数,对图像进行亚像素级准确度的边缘提取将毫无意义。摄像机的畸变和偏移可能导致边缘位置的偏差,尤其是在边缘位置偏移多个像素的情况下,这对于需要高精度测量的应用来说是不可接受的。
图像透视失真的影响: 由于摄像机不垂直于被测物体,可能产生图像透视失真。通过进行摄像机标定,明确摄像机内外参数,可以将图像中的测量结果转换为世界坐标上的测量结果,从而校正透视失真引入的影响。
随着对精度要求的不断提高,提高硬件分辨率是一种直接的方法,但这往往伴随着昂贵的代价。亚像素技术的应用成为解决这一问题的关键方法,因为它能够在相同或更高级别的硬件水平下实现更高的精度。该技术通过进行摄像机几何标定以及处理透视失真等步骤,弥补硬件分辨率不足的缺陷,使得在相同硬件水平下也能获得更高的测量和配准精度。
相关文章:

数字图像处理——亚像素边缘的轮廓提取
像素 像素是图像处理中的基本单位,一个像素是图像中最小的离散化单位,具有特定的位置和颜色信息。在数字图像中,每个像素都有一个特定的坐标,通常以行和列的形式表示。每个像素的颜色信息可以通过不同的表示方式,如灰…...

【六袆 - Framework】vue3入门;vue框架的特点矩阵列举;Vue.js 工作原理
vue框架的特点 Vue.js的特点展开叙述Vue.js的工作原理展开叙述 官方文档: https://cn.vuejs.org/guide/introduction.html Vue.js的特点 ┌────────────────────┬────────────────────────────────────…...

GO学习记录 —— 创建一个GO项目
文章目录 前言一、项目介绍二、目录介绍三、创建过程1.引入Gin框架、创建main2.加载配置文件3.连接MySQL、redis4.创建结构体5.错误处理、返回响应处理 前言 代码地址 下载地址:https://github.com/Lee-ZiMu/Golang-Init.git 一、项目介绍 1、使用Gin框架来创建项…...
C语言中的goto语句:使用、争议与最佳实践
各位少年: 引言: 在C语言编程中,goto语句是一个历史悠久且颇具争议的控制流结构。作为无条件跳转指令,它允许程序执行从当前点直接跳转到同一函数内的任意位置,由一个标签(label)来指定目标。尽…...
wpf-动态设置组件【按钮为例】样式
文章速览 解决方案具体实现Converter 部分创建样式Binding样式 坚持记录实属不易,希望友善多金的码友能够随手点一个赞。 共同创建氛围更加良好的开发者社区! 谢谢~ 解决方案 创建一个Converter,返回对应的style实现对应的修改 创建多个样式…...

40道MyBatis面试题带答案(很全)
1. 什么是MyBatis (1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接…...
python:PyCharm更改.PyCharm配置文件夹存储位置
关联账号文章:另外的账号 在启动 PyCharm 后选择 Help -> Edit Custom Properties 的选项,弹出: 选择 Create ,之后在文件中添加配置文件新的存储位置即可,例如: idea.config.pathD:/Program Files/.Py…...

Centos安装Kafka(KRaft模式)
1. KRaft引入 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。其核心组件包含Producer、Broker、Consumer,以及依赖的Zookeeper集群。其中Zookeeper集群是Kafka用来负责集群元数据的管理、控制器的选举等。 由…...

学习笔记13——Spring整合Mybatis、junit、AOP、事务
学习笔记系列开头惯例发布一些寻亲消息 链接:https://baobeihuijia.com/bbhj/ Mybatis - Spring(使用第三方包new一个对象bean) 原始的Mybatis与数据库交互【通过sqlmapconfig来配置和连接】 初始化SqlSessionFactory获得连接获取数据层接口…...
【12月比赛合集】4场可报名的「创新应用」、「数据分析」和「程序设计」大奖赛,任君挑选!
CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…)比赛。本账号会推送最新的比赛消息,欢迎关注! 以下信息仅供参考,以比赛官网为准 目录 数据分析赛(1场比赛)程序设计赛&#…...

Cisco模拟器-企业网络部署
某企业园区网有:2个分厂(分别是:零件分厂、总装分厂)1个总厂网络中心 1个总厂会议室; (1)每个分厂有自己的路由器,均各有:1个楼宇分厂网络中心 每个楼宇均包含&#x…...

WPF+Halcon 培训项目实战(12):WPF导出匹配模板
文章目录 前言相关链接项目专栏运行环境匹配图片WPF导出匹配模板如何了解Halcon和C#代码的对应关系逻辑分析:添加截取ROI功能基类矩形圆形 生成导出模板运行结果:可能的报错你的文件路径不存在你选择的区域的内容有效信息过少 前言 为了更好地去学习WPF…...

uniapp中uview组件库的丰富Upload 上传上午用法
目录 基础用法 #上传视频 #文件预览 #隐藏上传按钮 #限制上传数量 #自定义上传样式 API #Props #Methods #Slot #Events 基础用法 可以通过设置fileList参数(数组,元素为对象),显示预置的图片。其中元素的url属性为图片路径 <template>…...

Unity关于动画混合树(Blend Tree)的使用
在动画与动画的切换过程中,常因为两个动画之间的差距过大,而显得动画的切换很不自然。 这时候就需要动画混合树Blend Tree这个功能。使用混合树可以将多个动画混合在一起,例如在处理角色的移动中,走动画与跑动画切换的时候&#x…...

怎么下载landsat 8影像并在ArcGIS Pro中进行波段组合
Landsat 8(前身为Landsat数据连续性任务,或 LDCM)于2013年2月11日由 Atlas-V火箭从加利福尼亚州范登堡空军基地发射升空,这里为大家介绍一下该数据的下载的方法,希望能对你有所帮助。 注册账号 如果之前已经注册过的…...
编程新手IDE
身为一个前端开发者,我深知一个好的开发环境对于编程体验的重要性。对于新手来说,选择一个合适的IDE(集成开发环境)更是至关重要。一个好的IDE可以提高编程效率,减少错误,让新手更专注于学习编程本身。 今…...
如何将一个JSON字符串解析为JavaScript对象或值
JSON.parse(JSON.stringify(data)) 将后端传入的JSON数据data放入该方法的参数中,返回的结果就是JavaScript对象 比如将后端传入的对象key作为对象,而不是字符串双引号格式 {"path": "/home","name": "home",…...

idea配置docker推送本地镜像到远程私有仓库
目录 1,搭建远程Docker 私有仓库 Docker registry 2,Windows10/11系统上安装Docker Desktop 3,idea 配置远程私有仓库地址 4,idea 配置Docker 5,idea在本地构建镜像 6,推送本地Docker镜像到远程 Dock…...

Spring Boot学习随笔- 集成MyBatis-Plus(二)条件查询QueryWrapper、聚合函数的使用、Lambda条件查询
学习视频:【编程不良人】Mybatis-Plus整合SpringBoot实战教程,提高的你开发效率,后端人员必备! 查询方法详解 普通查询 // 根据主键id去查询单个结果的。 Test public void selectById() {User user userMapper.selectById(1739970502337392641L);System.out.print…...
十二、K8S之污点和容忍
污点和容忍 一、概念 k8s 集群中可能管理着非常庞大的服务器,这些服务器可能是各种各样不同类型的,比如机房、地理位置、配置等,有些是计算型节点,有些是存储型节点,此时我们希望能更好的将 pod 调度到与之需求更匹配…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...