基于对偶二次曲线的快速椭圆检测

1、对偶二次曲线原理

二次曲线也称圆锥曲线,其几何定义是一个平面与两个顶点相对的圆锥相交所产生的交线。

image-20250323201226200

通常二次曲线指的是点二次曲线,它是定义在曲线点上的方程。而在射影几何中,齐次点和齐次线存在着可以互换的二元关系,因此也相应地存在着一个定义在直线(即曲线的切线)上而非点上的对偶二次曲线。如下图所示:

image-20250323201618851

在非齐次坐标系下,设点 \(p=[u,v]^T\) 为二次曲线上的一点,则其二次曲线方程为:

\[Au^2 + Buv + Cv^2 + Du + Ev+F = 0 \]

其中,\(A\)\(B\)\(C\)\(D\)\(E\)\(F\) 为二次曲线 \(C\) 的参数。

那么相应地,在齐次坐标系下,若存在满足 \(p_i^TQp_i = 0\) 的点 \(p_i = [u, v, 1]^T\) ,则该点位于二次曲线 \(Q\) 上,其二次曲线方程矩阵形式的表达式为:

\[Q = \begin{bmatrix} A & \frac{B}{2} & \frac{D}{2}\\ \frac{B}{2} & C & \frac{E}{2}\\ \frac{D}{2} & \frac{E}{2} & F\\ \end{bmatrix} \]

由此可知,过(非退化)二次曲线 \(Q\) 上的点 \(p\) 的切线由 \(l=Qp\) 确定。类似地,存在对偶(也即线)二次曲线可由一个 \(3 \times 3\) 的矩阵 \(Q^*\) 表示:

\[Q^* = \begin{bmatrix} A^* & \frac{B^*}{2} & \frac{D^*}{2}\\ \frac{B^*}{2} & C^* & \frac{E^*}{2}\\ \frac{D^*}{2} & \frac{E^*}{2} & F^*\\ \end{bmatrix} \]

\(l_i = [a_i, b_i,c_i]^T\) 满足 \(l_i^T = C^*l_i = 0\) 时, \(l_i\) 为二次曲线 \(Q\) 的切线。其中 \(Q^{*}\)\(Q\) 的伴随矩阵(或者逆矩阵),\(Q\) 为满秩。

根据定义,二次曲线的中心为无穷远处关于二次曲线的极点。若将直线 \(l\) 的极点定义为 \(p_0\) ,则有 \(p_0 = Q^{*} l\),那么对偶二次曲线 \(Q^{*}\) 的中心 \(e_c = (u_c,v_c)\) 可以直接从参数中获得:

\[\lambda[u_c,v_c,1]^{T} = [\frac{D^{*}}{2}, \frac{E^{*}}{2}, F^{*}]^T = Q^{*}l_{\infin} \]

其中, \(\lambda\) 为比例因子,\(l_{\infin}\) 为无穷远处直线。根据上式可知,求得对偶二次曲线参数后便可直接得到椭圆的中心坐标。而对偶二次曲线 \(Q^{*}\) 的参数向量 \(\theta = [A^{*}, B^{*}, C^{*}, D^{*}, E^{*}, F^{*}]^T\) 的求取则需要借助其切线方程来获取。若给定一组切线方程 \(l_i\) 则可通过最小二乘法对参数进行估计。

2、对偶椭圆检测公式推导

在图像的某个椭圆边界像素 \(p=(u_i,v_i)\) 处的梯度为 \(\nabla{G_i} = [G_{ui},G_{vi}]^T \neq 0\),此时梯度方向垂直于轮廓,即该方向为法线方向,那么该位置对应的切线为:

\[l_i = \begin{bmatrix} \frac{G_{ui}}{\Vert \nabla{G_i} \Vert}, \frac{G_{vi}}{\Vert \nabla{G_i} \Vert}, -\frac{\nabla{G_i}^{T}}{\Vert \nabla{G_i} \Vert}p_i, \end{bmatrix}^T \]

由此,通过获得椭圆轮廓边缘周围像素的梯度信息,即可获得确定椭圆参数所需的切线集合。

对获取到的某个椭圆区域内所有梯度非零位置的像素计算得到一系列切线方程系数\(l_i\),若将对偶二次曲线 \(Q^{*}\) 的参数向量设置为 \(\theta = [A^{*}, B^{*}, C^{*}, D^{*}, E^{*}, F^{*}]^T\),则通过最小化 \(J(\theta)\) 可以估算出 \(Q^{*}\) 的参数:

\[J(\theta) = \sum\limits_{i \in W}^{} \omega_i(l_i^TQ^{*}l_i)^2 \]

其中,\(W\) 为所有切线的总数量。 \(\omega_i\) 是每条切线所在像素点处的梯度强度,即 \(\omega_i = \Vert \nabla{G_i} \Vert\) , 一般对于梯度强度大的位置,其对参数估计的贡献也就越大。

将所有切线代入上式后,转换成 \(Ax=B\) 形式,通过最小二乘法推导即可求得 \(Q^{*}\) 的参数。

\(Q^{*}\) 求逆后,即可得到椭圆方程参数 \(Q\) 中的各系数。于是可得椭圆圆心坐标\((x_0,y_0)\)

\[x_0 = \frac{BE-2CD}{4AC-B^2}\\ y_0 = \frac{BD-2AE}{4AC-B^2} \]

参考文献

  • 王若瑾,张旭,张学昌.基于对偶二次曲线的快速椭圆检测[J].计算机时代,2023,(07):6-10.DOI:10.16644/j.cnki.cn33-1094/tp.2023.07.002.

  • 李兆鹏.基于圆模式平面标靶的相机标定方法研究[D].江南大学,2022.DOI:10.27169/d.cnki.gwqgu.2022.000877.

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【程设の旅】Python速通作业三

这节课老师讲了Python的面向对象部分 速度比较快 但是结合前面cpp的大部分知识可以弄懂 最后一道题估计是py特性了 可以理解但是那两个函数不知道是什么鬼 01:运算符的实现 描述 程序填空class A:def __init__(self,x):self.x = x // 在此处补充你的代码 a,b,c = map(int,input…

C/C++开发文档和常用的输入方式汇总

前几天复习的几种输入方式和帮助文档C/C++开发文档获取 之前下载过应该开发文档,今天push到了Gitee上了。可以随时获取,链接字符串操作 C 字符串 | 菜鸟教程 输入输出【包含字符串】 C 输入 & 输出 | 菜鸟教程 #include<stdio.h> int main() {char s[20];int i = 0…

Eino overview

一段话总结 Eino 是基于Golang的大模型应用开发框架,通过组件抽象(如ChatModel、Tool、Retriever)和图编排能力(Chain/Graph/Workflow)简化LLM应用开发。其核心优势包括类型安全的流处理、并发管理、切面注入以及开箱即用的最佳实践,支持构建复杂智能体(如ReAct)和多模…

llm 量化技术综述

综述: LLM 量化 1. Intro 低比特量化主要是减少tensor的bit-width,可以有效减少内存以及计算需求;主要可以压缩权重, 激活值, 和梯度,使得可以在受限资源的设备上使用。 2. 低比特LLM的基础 在这一届,我们主要引入从以下三个方面讨论:low-bit 数值格式 量化粒度 动态或者静…

Top 出海 AI 公司招技术!HIX.AI Pollo.ai | 深圳

HIX.AI & Pollo.ai 招聘高级海外 AI 产品经理 (25-45K) 岗位职责:负责Web 端海外 AI 产品的规划与策划,负责产品需求分析及原型设计,并制定方案推动产品研发落地; 进行产品/竞品调研,了解用户需求,分析、发现需求本质,并给出对应的解决方案; 有效对接开发、测试、运…

2、切片

一:字符串的下标(索引)--重点 ​ Ⅰ:字符串的特性,被称为下标或者 sequence(序列) ​ Ⅱ:一个序列。若干元素组成 ​ Ⅲ:字符串的下标从0开始》标记每个元素的位置,用来获取元素》从左到右,从0开始> a[0],a[1] ,a[3]》可以用正数表示,也可以用负数表示》最…

WEBGL 学习使用代码

目录杂七杂八第一节 绘制出了一个点第二节 动态传递点数据第三节 缓冲区和画线第四节 彩色线段第五节 单个 buffer 渲染颜色第六节 抽离代码 & 画彩色三角形第七节 图元的七种绘制方式第八节 uniform 传值变换数据第九节 旋转矩阵三角函数矩阵的计算推导代码实现第十节 线框…

Kettle 版本这么多,到底该怎么选?

Kettle(Pentaho Data Integration)作为一款功能强大的开源 ETL(Extract, Transform, Load,即数据抽取、转换和加载)工具,拥有众多版本,这让许多用户在选择时犯了难。 1、提出问题 经常有群友提出使用kettle版本的问题,如下图所示:2、kettle版本 有许多的的历史版本,…

C++实验二

实验一#include <stdio.h>#include <stdlib.h>#include <time.h>#define N 5int main() {int number;int i;srand(time(0)); // 以当前系统时间作为随机种子for(i = 0; i < N; ++i) {number = rand() % 100 + 1;printf("20490042%04d\n", n…

ESP32 Audino 驱动12864点阵屏 自定义中文字库

一.安装u8g2 #include <Arduino.h> #include <U8g2lib.h>U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE, /* clock=*/22, /* data=*/21); // ESP32 Thing, HW I2C with pin remappingvoid setup(void) {u8g2.begin();u8g2.enableU…

Linux 离线安装 lz4

前言:本文操作是在 CentOS-7 下执行的,不确定在其他 Linux 发布版是否能同样正常执行。1、检查前置依赖组件在安装 lz4 之前,需要确认已安装了相关依赖组件: gcc 。 rpm -qa | grep gcc前置依赖组件的具体离线安装方法请参考:CentOS-7离线安装gcc 2、下载lz4安装包 官方下…