数字图像处理——亚像素边缘的轮廓提取
像素
像素是图像处理中的基本单位,一个像素是图像中最小的离散化单位,具有特定的位置和颜色信息。在数字图像中,每个像素都有一个特定的坐标,通常以行和列的形式表示。每个像素的颜色信息可以通过不同的表示方式,如灰度或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 调度到与之需求更匹配…...
llvm后端之指令选择源码分析
llvm后端之指令选择源码分析 引言1 主要流程1.1 参数降级1.2 构建DAG1.3 类型合法化1.4 向量合法化1.5 DAG合法化1.6 DAG合并 2 目标实现2.1 TargetLowering2.2 SelectionDAGISel 引言 llvm后端指令选择主要是class SelectionDAGISel的子类实现。整个过程将llvm IR转为有向无环…...
【消息中间件】Rabbitmq消息可靠性、持久化机制、各种消费
原文作者:我辈李想 版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、常见用法1.消息可靠性2.持久化机制3.消息积压批量消费:增加 prefetch 的数量,提高单次连接的消息数并发消费:…...
aws-sdk-cpp通过bazel构建的S3_client轮子
感觉时间过得很快,又是很久没有更新了 哎,主要原因还是很久都没有学什么东西了,进入社会后不知不觉间倦怠了许多 没什么办法,上班了之后做的很多东西都是调用api,越来越像一个工具人了,虽然说本身也大差不…...
关于WPF MVVM 的详细使用过程以及注意的问题
WPF MVVM 是一种常用的设计模式,在 WPF 应用程序中使用它可以更好地分离界面逻辑和业务逻辑,并且更容易进行单元测试和重构。下面是深入理解 WPF MVVM 的详细使用过程以及注意的问题。 一、MVVM 的基本概念 MVVM 是 Model-View-ViewModel 的缩写&#…...
计算机视觉 全教程目录
1、OpenCV 图像处理框架 实战系列 总目录 OpenCV 图像处理框架 实战系列 总目录 2、现代卷积网络实战系列 总目录 现代卷积网络实战系列 总目录 3、YOLO 物体检测 系列教程 总目录 YOLO 物体检测 系列教程 总目录 4、图像分割实战-系列教程 总目录 图像分割实战-系列教程 总目录…...
油猴脚本开发,之如何添加html和css
简介 油猴是一个脚本管理器,让我们能够方便的使用js脚本,以实现对页面内容的修改、功能增强或其他定制化操作。 常见脚本管理器 Tampermonkey 应该是各位见得最多的也是最知名的,好用又稳定,多浏览器支持Greasemonkey 用户脚本始祖&#x…...
【MATLAB】BiGRU神经网络时序预测算法
有意向获取代码,请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 BiGRU神经网络时序预测算法是一种基于双向门控循环单元(GRU)的多变量时间序列预测方法。该方法结合了双向模型和门控机制,旨在有效地捕捉时间序列数据中…...
57.0/初识 PhotoShopCS4(详细版)
目录 57.1 PhotoShop 概要 57.2.1 像素和分辨率 57.2.2 色彩模式 57.2.3 位图和矢量图 57.3 PhotoShop 基本操作 57.3.1 PhotoShop 界面的认识 57.3.2 PhotoShop 基本界面工具 57.3.3 移动选择工具(V) 57.3.4 选框工具(M)编辑 编辑57.3.5 套索工具(L) 57.3…...
[C#]opencvsharp进行图像拼接普通拼接stitch算法拼接
介绍: opencvsharp进行图像拼一般有2种方式:一种是传统方法将2个图片上下或者左右拼接,还有一个方法就是融合拼接,stitch拼接就是一种非常好的算法。opencv里面已经有stitch拼接算法因此我们很容易进行拼接。 效果: …...
《妙趣横生的算法》(C语言实现)-第10章算法设计与数据结构面试题精粹
【10-1】输入一个字符串并将它输出,以ctrlz组合键表示输入完毕,要求将输入的字符串中多于1个的连续空格符合并为1个。 //10-1 2023年12月30日17点11分-17点18分 # include <stdio.h> int main() {char c;c getchar();//scanf("%c", &a…...
做网站找个人还是找公司/品牌推广和营销推广
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#定义一个密码,列表属性,可以修改password_list [reset, 12345]#定义一个函数,设定输入次数def user_login():tries 3#输入密码while tries > 0 :password input(请输入密码:)#定义密码正确…...
企业网站建设前网站目的需明确/系统优化
网上说 PHP 5 开始集成 SQLite 数据库操作,但是我 $db sqlite_open("db.db"); 打不开数据库。我用下面的方法成功了:<?php class SQLite{function __construct($file){try{$this->Connectionnew PDO(sqlite2:.$file);}catch(PDOExcept…...
网站建设比较合理的流程/郑州纯手工seo
参考: https://github.com/mqyqingfeng/Blog深入系列 https://www.bilibili.com/video/BV14s411E7qf 原型与原型链 1.理解 1.每个函数都有2条属性,显式原型属性prototype和隐式原型属性—proto— 2.函数的实例对象f1,f2,01,02与函数的原型对象Foo.…...
广东专业做网站/百度客服24小时人工服务在线咨询
平时写代码的时候多少会依赖编辑器里面的代码补全,敲几个字母就能补全一整个词。可是这么多年过去了,为什么代码补全还是像最开始那样,只能限定于一个词,而且毫无意义地按照字典表顺序排列呢?传统的代码补全࿰…...
哪公司建设网站/提升关键词
2016年马上过去了,这一年没什么好的,该不好的也经历过了,动了一次大手术,在家里呆了3个月。 手术后去了几家公司面试,效果不好,虽说经验有10年,职位也到了技术经理,但一般公司需要的…...
选择佛山顺德网站设计/优量汇广告平台
不废话: 把最重要最有用的知识列写如下: 1 订单表的特点 订单表中每一行对应一个订单 一个订单对应一种商品 2 订单表中的SUM统计 说明: sum统计就是总计 总计 单计1 单计2 单计3 .... 单计n (1)返回订单表中所有订单中对应的每一商品的数量的总…...