数字图像处理——亚像素边缘的轮廓提取

像素

像素是图像处理中的基本单位,一个像素是图像中最小的离散化单位,具有特定的位置和颜色信息。在数字图像中,每个像素都有一个特定的坐标,通常以行和列的形式表示。每个像素的颜色信息可以通过不同的表示方式,如灰度或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=ymaxexp(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(x1))2ln(f(x))+ln(f(x+1))ln(f(x1))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(x1)f(x)f(x1)=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(x1)f(x+1)f(x1)

下图中蓝色点即为插值出来的边缘点:
在这里插入图片描述

亚像素边缘检测的注意事项

摄像机几何标定的重要性: 若未对摄像机进行几何标定,即确定摄像机的内部和外部参数,对图像进行亚像素级准确度的边缘提取将毫无意义。摄像机的畸变和偏移可能导致边缘位置的偏差,尤其是在边缘位置偏移多个像素的情况下,这对于需要高精度测量的应用来说是不可接受的。

图像透视失真的影响: 由于摄像机不垂直于被测物体,可能产生图像透视失真。通过进行摄像机标定,明确摄像机内外参数,可以将图像中的测量结果转换为世界坐标上的测量结果,从而校正透视失真引入的影响。

随着对精度要求的不断提高,提高硬件分辨率是一种直接的方法,但这往往伴随着昂贵的代价。亚像素技术的应用成为解决这一问题的关键方法,因为它能够在相同或更高级别的硬件水平下实现更高的精度。该技术通过进行摄像机几何标定以及处理透视失真等步骤,弥补硬件分辨率不足的缺陷,使得在相同硬件水平下也能获得更高的测量和配准精度。

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

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

相关文章

大数据- Hadoop入门

目录 &#x1f436;2.1 hadoop的简介 1. 概述 2. 什么是分布式&#xff1f; 3. Hadoop的指代 &#x1f436;2.2 hadoop的发展历程 &#x1f436;2.3 hadoop的版本介绍 &#x1f436;2.4 hadoop的常用端口号 &#x1f436;2.5 hadoop的设计目的 &#x1f436;2.6 hadoo…

使用vmware,在ubuntu18.04中使用笔记本的摄像头

步骤1&#xff1a;在windows中检查相机状态 win10系统中&#xff0c;在左下的搜索栏&#xff0c;搜索“相机”&#xff0c;点击进入即可打开相机&#xff0c;并正常显示图像。 注意&#xff1a;如果相机连接到了虚拟机&#xff0c;则不能显示正常。 步骤2&#xff1a;在ubuntu…

轻松调整视频时长,创意与技术的新篇章

传统的视频剪辑工具往往难以精确控制时间&#xff0c;而【媒体梦工厂】凭借其先进的算法和界面设计&#xff0c;让视频时长的调整变得简单而精确&#xff0c;助你释放无限的创意&#xff0c;用技术为你的创意插上翅膀&#xff0c;让每一秒都有意义。 所需工具&#xff1a; 一…

【Matlab】BP 神经网络时序预测算法

资源下载&#xff1a; https://download.csdn.net/download/vvoennvv/88681507 一&#xff0c;概述 BP 神经网络是一种常见的人工神经网络&#xff0c;也是一种有监督学习的神经网络。其全称为“Back Propagation”&#xff0c;即反向传播算法。BP 神经网络主要由输入层、隐藏层…

1、aigc图像相关

aigc图像相关 一、Diffusion webui 在autodl上部署一些问题二、lora和kohyass&#xff08;1&#xff09;角色模型&#xff08;2&#xff09;风格模型&#xff08;3&#xff09;dreambooth&#xff08;4&#xff09;模型合并&#xff08;5&#xff09;Lora加Adetail其他 三、sd …

数模混合SoC芯片中LEF2Milkyway的golden flow

在数模混合芯片中的项目中&#xff0c;特别是数字模块很少甚至只有一个简单的数字控制逻辑时&#xff0c;我们要做数字模块的后端实现时&#xff0c;通常模拟那边会问我们实现需要他们提供哪些数据。 通常来说&#xff0c;我们可以让模拟设计提供数字模块的GDS或LEF文件即可。…

【LeetCode每日一题】1185.一周中的第几天(模拟+调用库函数:三种方法)

2023-12-30 文章目录 一周中的第几天方法一&#xff1a;模拟思路步骤 方法二&#xff1a;调用库函数方法三&#xff1a;调用库函数 一周中的第几天 ​ 提示&#xff1a;给出的日期一定是在 1971 到 2100 年之间的有效日期。 方法一&#xff1a;模拟 思路 1.可以根据1970年的…

WPF+Halcon 培训项目实战(11):HS组件封装

文章目录 前言相关链接项目专栏运行环境匹配图片封装组件新增类库项目选择依赖顺序并添加Nuget修改原本矩形方法运行结果&#xff1a; 对矩形进行抽象封装抽象基类矩形抽象改造 圆形抽象封装代码运行结果 前言 为了更好地去学习WPFHalcon&#xff0c;我决定去报个班学一下。原…

2023 搞懂git 工作目录---暂存区---本地仓库---版本库

最近了解了下git的底层原理&#xff08;大神录制的视频放在最下方&#xff09;&#xff0c;记录下&#xff1a; 工作区 就是存放待提交文件的目录&#xff08;下图图解标注&#xff09;比如pyhon_test目录暂存区 .git目录下的index文件 对应的指令 git add本地仓库 .gi…

数据库的学习笔记——第一篇

SQL通用语法 SQL语句 DDL 数据定义 数据库、表字段 DML 数据操作 增删改 DQL 数据查询 查询表中记录 DCL 数据控制 创建用户、控制用户权限 DLL语句——数据库操作 SHOW DATABASES; # 查询数据库SELECT DATABASE(); # 查询当前数据库CREATE DATABASE [IF …

链表的一些典型问题

求链表的中间节点/倒数第K个节点 等类似的随机访问&#xff0c;可以考虑用快慢指针 例 求链表的中间节点 可以定义两个指针&#xff0c;一个一次走两步一个一次走一步&#xff0c;当走的快的走到NULL时&#xff0c;走的慢的就是链表的中间节点。&#xff08;此法求出的偶数个…

uni-app uni-app内置组件

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

Oracle OCP怎么样线上考试呢

大家好&#xff01;今天咱们就来聊聊Oracle OCP这个让人又爱又恨的认证。为啥说又爱又恨呢&#xff1f;因为它既是IT界的“金字招牌”&#xff0c;又是一块硬骨头&#xff0c;不是那么容易啃下来的。好了&#xff0c;废话不多说&#xff0c;我们直奔主题&#xff0c;来看看关于…

Android Studio下载gradle失败

1、打开Android Studio设置Gradle的地方&#xff0c;点击左上角的File->Settings查看gradle存放路径 C:\Users\Administrator.gradle\wrapper\dists\gradle-5.4.1-all\3221gyojl5jsh0helicew7rwx 2、找到正在下载的gradle版本&#xff0c;Android Studio取消下载gradle&…

Spark编程实验四:Spark Streaming编程

目录 一、目的与要求 二、实验内容 三、实验步骤 1、利用Spark Streaming对三种类型的基本数据源的数据进行处理 2、利用Spark Streaming对Kafka高级数据源的数据进行处理 3、完成DStream的两种有状态转换操作 4、把DStream的数据输出保存到文本文件或MySQL数据库中 四…

利用 IntelliJ IDEA 整合 GitHub 实现项目版本控制与协作管理

目录 前言1 设置GitHub登录账号2 将项目分享到GitHub3 IntelliJ IDEA 中导入Github项目4 往GitHub推送代码4.1 Commit Change&#xff08;提交到本地库&#xff09;4.2 Git -> Repository -> Push&#xff08;推送到远程库&#xff09; 5 拉取远程库代码到本地6 克隆远程…

CSS之元素转换

我想大家在写代码时有一个疑问&#xff0c;块级元素可以转换成其他元素吗&#xff1f; 让我为大家介绍一下元素转换 1.display:block(转换成块元素) display&#xff1a;block可以把我们的行内元素或者行内块元素转换成块元素 接下来让我为大家演示一下&#xff1a; <!DO…

sklearn 中matplotlib编制图表

代码 # 导入pandas库&#xff0c;并为其设置别名pd import pandas as pd import matplotlib.pyplot as plt# 使用pandas的read_csv函数读取名为iris.csv的文件&#xff0c;将数据存储在iris_data变量中 iris_data pd.read_csv(data/iris.txt,sep\t)# 使用groupby方法按照&quo…

gitlab 11.11.8的备份与恢复及500错误的修复

gitlab已经集成了非常方便的备份和恢复命令&#xff0c;只要我们执行这些命令就能完成gitlab的备份与恢复了。 我想gitlab备份与恢复的目的无非就是将已经运行了很久的旧的gitlab服务&#xff0c;迁移到新的服务器上。如果你旧的gitlab上项目很少&#xff0c;就需要考虑迁移服…

Spring知识02

1、这边是做单元测试的 2、项目部署上线的时候需要把Test那里注解掉 3、pom.xml的坐标系&#xff0c;用来导出包给别人用 4、项目名称&#xff0c;artifactId&#xff0c;name属性名保持一致 5、maven中央仓库那里可以看到导包之后会随着附加的内容 6、class.getSingleName获取…