热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

圆心坐标的提取

用OpenCV的话,这样的活儿也就那么两三行代码,而且灵活可靠。但是,玩图像处理只懂玩成这样就悲哀了,就如同游戏引擎之于计算机图形学,太依赖图像库是不利于自己的成长和知识的提升的。

       用OpenCV的话,这样的活儿也就那么两三行代码,而且灵活可靠。但是,玩图像处理只懂玩成这样就悲哀了,就如同游戏引擎之于计算机图形学,太依赖图像库是不利于自己的成长和知识的提升的。

       圆心提取的本质是从一张含有圆形/椭圆标志物的图片(见下图1,现实图片经各种处理到达这种圆与背景分明的样态)中,选择一定坐标系,提取出各个标志圆的圆心在这个坐标系中的坐标。

       因此这个坐标系的选择将是影响最终结果的形式的关键。一般来说选择图像坐标系,以像素为单位。本实验图片的格式是BMP,因此可以按照BMP自身的坐标特点,以图片左下角为坐标原点,向右为X轴,向上为Y轴。当然若想与WINDOWS窗口坐标系一致(以左上角为原点),直接用图片高度减上坐标系的结果就行了。

       关于结果的精度是很值得考究的事情。事实上,若考虑到素材图片是相机所拍成像的,某个圆的圆心与坐标原点的距离应该是一个含一定精度的浮点实数。但是计算机图像的结构限定了坐标系只能以像素为单位,因此其可能达到的最高精度只有0. 5像素。在此以上的精度在本素材图像中是没有意义的。因为相机会自动对物理场景(连续)的采样点(离散采样)进行向输出图像的一一映射,形成像素(一个像素只包含一款颜色)。相邻像素的值是非连续(离散)的,注定图像坐标系中每个“值”(坐标)都只能与像素相容。这样,圆心位置也就只能存在于某个像素上或某2个或4个像素之间,因此实际中最高只有0.5的精度。

 

 提取圆心坐标 www.zwqxin.com
(图1  圆心提取素材图片)


提取圆心坐标 www.zwqxin.com

数字图像本质——被离散化采样,导致精度最高仅0.5

但是,如果圆心不是通过直接寻找的,而是采用数值计算得到(譬如本实验中用到的径向误差判断结合法),那么计算结果就会存在比较高的精度的可能性。这是理论可得结果与实际可得结果的差别。但就“计算机图像”这层意义来说,高于0.5的精度意义不大。

算法的设计:

在分析之后对算法的设计和选择就清晰了——立足于图像的本质上的话,只需要把圆心所在的像素位置找到,或者把包围圆心位置的几个像素找到即可。

参见图2,可知,图像中的参照物为一个圆或椭圆。在把它看作理想的圆/椭圆的话,可以认为圆点必然是在X方向横跨最多像素点的那一行中。因此算法设计上,针对每个圆,首先找出满足这个条件的一行(或几行,取中间行或中间两行),然后在Y方向上找到该像素行的中间位置,即为圆心——综合来说,圆心位置可能是落在某一个像素上,或X方向两个像素之间,或Y方向两个像素之间,或XY方向的4个像素之间。算法必须考虑这几种情况,算出精度为0.5的圆心位置。

算法的实现重点在于怎样分离出一个一个的圆,我采用的是逐像素法,先处理完最开头的一个圆(底部坐标靠近左下角原点),然后把这个圆从图像中去除(对二值化图像,就是把该圆的白色像素变黑),之后再处理下一个圆(寻得条件同样是,底部坐标靠近左下角原点)……直到处理完。怎么判断处理完呢?具体就是当该图像完全黑化的时候停止继续寻觅圆。

圆心坐标用一个容器链表保存起来,作为输出——输出到文件或作为一个/几个白像素涂入被完全黑化的图像上。

该算法为自主设计,自称为逐像素处理。应用条件是:
(1) 图片为二值化黑白图片,8BIT。(可以通过简单的预处理达到)
(2) 图片中仅含圆形。(本实验素材满足,若不满足可进行一定的预处理,如形态学处理,空间模板处理)

上方法另外作出的一个假设:该圆为理想的圆/椭圆。但是从图2这个放大图来说,事实上并不理想——虽然也可满足以上算法能找到圆心。把该圆规范化成一个标准的圆,这样可使找出的圆心具有更高的可信度。

按照某文献资料(图像处理中圆心算法研究 - 雷家勇,达飞鹏,孟广猛,东南大学自动化研究所)中所叙述的方法,可采用“径向误差预处理的最小二乘”进行拟合计算。

算法可分为三部分:
1. 找出初始圆心(此圆心作为径向误差判断的基准,在本实验中可直接取用逐像素处理法所得的结果)。
2. 找出拟合用的像素坐标。首先这些像素必须是圆形的边缘单像素(即八邻域内最多3个像素);然后进行筛选,这主要通过径向误差范围判断,去除无效的边界点和误差大的边界点。
3. 根据上述处理后的边界点,用最小二乘法拟合圆心。

因为经历了数值计算,因此结果将具有高精度,但不一定有意义(见4.1)。本方法结合了“逐像素法找初始圆心”——“径向误差筛选出拟合数据”——“最小二乘法拟合、修正圆心”,得到可信度更高的圆心方位。

该算法(径向误差最小二乘法)的适用条件为:
(1) 处理的图像元素必须是严格的圆或近似圆。如果是椭圆且偏心太厉害的话,全部基于圆的拟合算法会不适用,径向误差方法也变得无效。
(2) 因为采用了逐像素处理,因此也必须满足之前所述该算法的条件。

有此设计的处理结果是:

提取圆心坐标 www.zwqxin.com
3  程序界面,圆心提取对话框)
提取圆心坐标 www.zwqxin.com
(图4  结果
提取圆心坐标 www.zwqxin.com
(5  直观一点)

提取圆心坐标 www.zwqxin.com
(图6  另一张测试图片
提取圆心坐标 www.zwqxin.com
(图7  处理结果

最后这里只是说明对于这种杂乱排布的圆也能检测出而已。不过扫描算法里的递归终结条件就得好好掂量了~

程序内嵌进LVideoCapture .ver 1.5里了。(1.0版的功能见[VFW视频捕获之尝试] )在后面的1.8版本,涉及了摄象机标定的功能。

 

 


推荐阅读
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍如何通过注册表编辑器自定义和优化Windows文件右键菜单,包括删除不需要的菜单项、添加绿色版或非安装版软件以及将特定应用程序(如Sublime Text)添加到右键菜单中。 ... [详细]
  • 帝国CMS多图上传插件详解及使用指南
    本文介绍了一款用于帝国CMS的多图上传插件,该插件通过Flash技术实现批量图片上传功能,显著提升了多图上传效率。文章详细说明了插件的安装、配置和使用方法。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 本文介绍如何使用Python进行文本处理,包括分词和生成词云图。通过整合多个文本文件、去除停用词并生成词云图,展示文本数据的可视化分析方法。 ... [详细]
  • 深入了解 Windows 窗体中的 SplitContainer 控件
    SplitContainer 控件是 Windows 窗体中的一种复合控件,由两个可调整大小的面板和一个可移动的拆分条组成。本文将详细介绍其功能、属性以及如何通过编程方式创建复杂的用户界面。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 如何高效创建和使用字体图标
    在Web和移动开发中,为什么选择字体图标?主要原因是其卓越的性能,可以显著减少HTTP请求并优化页面加载速度。本文详细介绍了从设计到应用的字体图标制作流程,并提供了专业建议。 ... [详细]
  • 本文介绍如何使用 Python 提取和替换 .docx 文件中的图片。.docx 文件本质上是压缩文件,通过解压可以访问其中的图片资源。此外,我们还将探讨使用第三方库 docx 的方法来简化这一过程。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 本文探讨了如何在 PHP 的 Eloquent ORM 中实现数据表之间的关联查询,并通过具体示例详细解释了如何将关联数据嵌入到查询结果中。这不仅提高了数据查询的效率,还简化了代码逻辑。 ... [详细]
author-avatar
雪恝1988_757
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有