基于机器视觉的管制瓶检测技术关键问题剖析与实践_第1页
基于机器视觉的管制瓶检测技术关键问题剖析与实践_第2页
基于机器视觉的管制瓶检测技术关键问题剖析与实践_第3页
基于机器视觉的管制瓶检测技术关键问题剖析与实践_第4页
基于机器视觉的管制瓶检测技术关键问题剖析与实践_第5页
已阅读5页,还剩24页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于机器视觉的管制瓶检测技术关键问题剖析与实践一、引言1.1研究背景与意义在制药、食品等行业中,管制瓶作为重要的包装容器,其质量直接关乎产品的安全性与稳定性。以制药行业为例,药用管制瓶若存在质量问题,如瓶壁厚度不均、瓶口不平整、瓶身有裂纹或气泡等缺陷,可能导致药品污染、泄漏,甚至影响药品的药效,对患者的健康构成潜在威胁。在食品行业,管制瓶质量不达标可能致使食品变质、保质期缩短,损害消费者权益。因此,对管制瓶进行严格的质量检测至关重要。传统的管制瓶质量检测方法主要依赖人工目检。质检员凭借肉眼和简单工具,对管制瓶的外观、尺寸等进行逐一检查。这种方法存在诸多弊端:其一,检测效率低下,人工目检速度有限,难以满足大规模工业化生产的需求。在高速生产线中,人工检测往往成为生产瓶颈,制约生产效率的提升。其二,检测精度难以保证,人的视觉分辨能力存在极限,对于微小缺陷,如细微裂纹、微小气泡等,容易出现漏检或误检情况。而且,长时间的重复工作会使质检员产生视觉疲劳,进一步降低检测的准确性。其三,人工检测成本较高,需要大量的人力投入,且随着劳动力成本的不断上升,人工检测的成本劣势愈发明显。此外,人工检测还存在主观性强的问题,不同质检员的检测标准和判断能力存在差异,导致检测结果缺乏一致性和可靠性。随着工业自动化和智能化的快速发展,机器视觉检测技术应运而生,并在工业检测领域得到广泛应用。机器视觉检测技术是利用计算机视觉和图像处理技术,模拟人类视觉功能,对目标物体进行自动检测、识别和测量。相较于传统人工检测,机器视觉检测技术具有显著优势。它能够实现高速、高精度检测,可在短时间内对大量管制瓶进行全面检测,检测精度可达亚像素级,有效提高检测效率和准确性。同时,机器视觉检测系统具有高度的稳定性和可靠性,不受主观因素和疲劳影响,能够持续、稳定地工作,保证检测结果的一致性。而且,该技术还能实现自动化和智能化检测,可与生产线无缝对接,根据预设的检测标准和算法自动判断管制瓶是否合格,并对不合格产品进行分类和标记,大大提高生产自动化水平。在这样的背景下,开展管制瓶视觉检测技术的研究具有重要的现实意义和应用价值。从现实意义来看,它能够有效解决传统人工检测方法存在的弊端,提高管制瓶质量检测的效率和准确性,保障产品质量和消费者权益,推动相关行业的健康发展。从应用价值而言,研究成果可直接应用于制药、食品等行业的生产线,降低企业生产成本,提高生产效率和竞争力。此外,对管制瓶视觉检测技术的研究,有助于推动机器视觉检测技术在工业检测领域的深入应用和发展,促进相关技术的创新和进步,为其他产品的视觉检测提供技术参考和借鉴。1.2研究目的与主要内容本研究旨在设计并实现一套高精度、高效率、高稳定性的管制瓶视觉检测系统,以解决传统人工检测方法存在的效率低、精度差、成本高等问题。通过综合运用机器视觉技术、图像处理算法以及自动化控制技术,实现对管制瓶的全方位、实时在线检测,准确识别和测量管制瓶的各种缺陷和尺寸参数,为制药、食品等行业提供可靠的质量检测解决方案,推动相关行业的自动化生产进程。围绕上述研究目的,本研究将从以下几个方面展开:检测系统硬件设计:制定检测系统的总体设计方案,充分考虑系统的检测精度、速度、稳定性以及成本等因素。设计暗室加LED环形照明方法,以提供均匀、稳定的光照条件,减少环境光对检测结果的干扰,论证该方案在管制瓶检测中的可行性和实用性。根据检测需求,选择合适的图像采集设备,如工业相机的分辨率、帧率、灵敏度等参数,以及镜头的焦距、光圈、景深等参数,确保采集到的图像清晰、完整,满足后续图像处理和分析的要求。同时,对其他相关设备进行选型,如机械传动装置、运动控制卡等,搭建稳定可靠的检测系统硬件平台。图像预处理与边缘提取算法设计:针对采集到的管制瓶图像,设计有效的图像预处理算法,以去除图像中的噪声、干扰和不均匀光照等影响,提高图像质量。采用小波变换和数学形态学相结合的方法进行图像去噪和边缘提取。小波变换能够对图像进行多尺度分解,有效去除噪声的同时保留图像的细节信息;数学形态学则通过腐蚀、膨胀、开运算、闭运算等操作,对图像的边缘进行优化和增强,提取出符合检测标准的边缘图像。试验多套不同的算法,并结合管制瓶的图像特点进行改进和创新,详细介绍预处理中关键步骤的新算法,包括小波分解重构和数字形态学多结构法提取边缘等。将改进后的算法结果与一些经典算法进行比较,通过对比分析,论证本文算法在提高边缘提取精度、减少噪声干扰等方面的优越性。缺陷检测与尺寸测量算法设计:依据图像矩阵元素开展计算,根据提取的缺陷特征集合统计其对应的几何参数,如缺陷的面积、周长、长度、宽度等,从而实现对缺陷的检测和分类。针对不同类型的缺陷,如裂纹、气泡、划痕等,设计相应的特征提取和识别算法,提高缺陷检测的准确率和可靠性。根据管制瓶的外观规格和尺寸要求,采用合适的算法对管制瓶的尺寸参数进行测量,如瓶口内径、外径,瓶身高度、直径等。提出边缘像素扫描法进行瓶身检测、改进的Hough变换法对瓶口图像进行圆心定位和内外径测量等。对测量结果进行误差分析,找出可能存在误差的原因,并提出相应的改进措施,以提高尺寸测量的精度。检测系统软件设计与实现:根据系统的硬件架构和功能需求,设计基于DSP(DigitalSignalProcessor)的图像处理算法实现技术,开发高效实用的图像采集和处理程序。编写应用界面,针对不同用户,如生产线上的操作人员和工程技术人员,分别设计适合生产的主界面和适合工程人员的图像处理等分界面。主界面应简洁明了,操作方便,能够实时显示检测结果和报警信息;图像处理等分界面则应提供更详细的图像处理参数设置和分析功能,方便工程人员进行算法调试和优化。系统性能评估与优化:搭建实验平台,对设计的管制瓶视觉检测系统进行性能评估,包括检测精度、速度、稳定性等指标的测试。通过大量的实验数据,分析系统存在的问题和不足之处,针对这些问题,对系统的硬件和软件进行优化和改进,不断提高系统的性能和可靠性,使其能够满足实际生产中的应用需求。1.3国内外研究现状机器视觉检测技术作为工业自动化领域的重要研究方向,在管制瓶检测方面取得了显著进展。国内外学者和研究机构从硬件设计、算法优化到实际应用等多个层面展开研究,推动了管制瓶视觉检测技术的不断革新。在硬件方面,国内外都致力于构建高效稳定的检测系统。国外如德国的SICK公司,其研发的机器视觉检测设备在工业领域广泛应用,具备高精度的相机和先进的镜头系统,能够快速捕捉高质量的图像,且照明系统设计精良,可适应多种复杂检测环境,为管制瓶检测提供了可靠的硬件基础。国内研究同样成果丰硕,合肥工业大学的相关研究团队在管制瓶视觉检测系统硬件设计中,提出暗室加LED环形照明方法,通过精心设计照明系统,有效减少环境光干扰,为采集清晰的管制瓶图像创造了条件,同时合理选择采集设备和其他相关设备,搭建起稳定的检测平台,满足了实际生产中的检测需求。算法研究一直是机器视觉检测技术的核心。国外在图像处理算法领域处于前沿地位,一些先进的边缘检测算法,如Canny算法,凭借其在噪声抑制和边缘定位精度上的优势,在管制瓶边缘检测中得到广泛应用。在缺陷检测方面,机器学习算法如支持向量机(SVM)被用于对管制瓶的缺陷进行分类识别,通过对大量缺陷样本的学习,能够准确判断不同类型的缺陷。国内学者则结合管制瓶的图像特点,对传统算法进行改进和创新。例如,采用小波变换和数学形态学相结合的方法进行图像去噪和边缘提取,小波变换能够有效去除噪声并保留图像细节,数学形态学通过一系列运算对边缘进行优化,二者结合提高了边缘提取的精度。还有研究提出边缘像素扫描法进行瓶身检测、改进的Hough变换法对瓶口图像进行圆心定位和内外径测量等,这些算法在提高检测准确率和效率方面发挥了重要作用。从应用层面来看,国外的机器视觉检测技术在制药、食品等行业的生产线中应用成熟。以美国的制药企业为例,大量采用机器视觉检测系统对管制瓶进行质量检测,实现了生产过程的高度自动化和智能化,有效提高了生产效率和产品质量。国内在相关领域也积极推进机器视觉检测技术的应用,大恒图像在制药行业深耕多年,其视觉检测设备应用于药用玻璃等行业的包装车间,帮助企业在生产制造环节把控产品质量,通过提供“整线”解决方案,满足了制药企业对药品生产和包装的高质量检测需求。力诺药包研发的“一种管制瓶口部内径检测辅助装置”,通过巧妙的设计降低了检测误差,提高了产品合格率,为管制瓶尺寸检测提供了新的思路和方法。尽管国内外在管制瓶视觉检测技术上取得了诸多成果,但仍存在一些挑战。例如,在复杂生产环境下,如何进一步提高检测系统的稳定性和抗干扰能力;如何优化算法,以适应不同形状、尺寸管制瓶的检测需求;以及如何降低检测系统的成本,提高其性价比等。这些问题有待进一步深入研究和解决。1.4研究方法与创新点在本研究中,综合运用多种研究方法,从理论研究到实践验证,全面深入地探索管制瓶视觉检测技术,力求突破现有技术的局限,实现技术创新与应用拓展。在研究过程中,本研究首先采用文献研究法,广泛搜集和整理国内外关于机器视觉检测技术,特别是管制瓶视觉检测方面的学术论文、专利文献、技术报告等资料。通过对这些资料的系统分析,了解该领域的研究现状、发展趋势以及存在的问题,为研究提供坚实的理论基础和思路借鉴。例如,在研究硬件设计时,参考德国SICK公司的机器视觉检测设备相关文献,了解其先进的相机、镜头及照明系统设计理念,为搭建本研究的检测系统硬件平台提供参考。实验研究法也是本研究的重要方法之一。搭建实验平台,对设计的管制瓶视觉检测系统进行全面的实验测试。通过大量的实验,采集不同条件下的管制瓶图像数据,对系统的检测精度、速度、稳定性等性能指标进行评估。在图像预处理算法研究中,对小波变换和数学形态学相结合的算法进行多次实验,调整算法参数,对比不同算法组合下的图像去噪和边缘提取效果,以优化算法性能。在算法设计与改进方面,本研究具有显著的创新点。在图像预处理和边缘提取算法中,将小波变换和数学形态学相结合。小波变换能对图像进行多尺度分解,有效去除噪声并保留图像细节信息,而数学形态学通过腐蚀、膨胀、开运算、闭运算等操作,对图像边缘进行优化和增强。这种结合方式针对管制瓶图像特点,克服了传统单一算法的局限性,提高了边缘提取的精度和抗噪声能力。与经典的Canny算法相比,在处理含有噪声的管制瓶图像时,本算法能更好地保留边缘细节,减少噪声干扰,实验结果表明,本算法提取的边缘图像中,细节完整度提高了[X]%,噪声干扰降低了[X]%。在缺陷检测和尺寸测量算法上,也提出了创新方法。采用边缘像素扫描法进行瓶身检测,该方法依据图像矩阵元素计算,通过对瓶身边缘像素的扫描和分析,能够准确提取缺陷特征集合,并统计其对应的几何参数,实现对瓶身缺陷的有效检测。对于瓶口图像的圆心定位和内外径测量,提出改进的Hough变换法。通过对传统Hough变换法的优化,提高了算法在复杂背景下对瓶口特征的识别能力,降低了计算复杂度,提高了测量精度。实验数据显示,采用改进算法后,瓶口尺寸测量的平均误差降低了[X]%,有效提高了检测系统的准确性和可靠性。二、管制瓶视觉检测技术基础2.1机器视觉原理机器视觉作为一门融合了光学、机械、电子、计算机软硬件等多方面技术的交叉学科,在工业检测领域发挥着关键作用。其基本原理是借助图像摄取装置,将被摄取目标转化为图像信号,随后传送给专用的图像处理系统。该系统依据像素分布、亮度、颜色等信息,把图像信号转变为数字化信号,并通过各种运算抽取目标的特征,最终依据判别的结果来控制现场的设备动作,实现对目标物体的检测、识别与测量。一个典型的机器视觉系统主要由图像采集部分、图像处理部分和运动控制部分构成。在图像采集部分,工业相机与工业镜头是核心成像器件。工业相机依据应用需求,可输出标准的单色视频(RS-170/CCIR)、复合信号(Y/C)、RGB信号,也能输出非标准的逐行扫描信号、线扫描信号、高分辨率信号等。镜头的选择则需综合考虑焦距、目标高度、影像高度、放大倍数、影像至目标的距离、中心点/节点以及畸变等因素。例如,在管制瓶检测中,若要清晰捕捉瓶身的细微缺陷,就需选择高分辨率的工业相机和合适焦距的镜头,以确保采集到的图像能够准确反映管制瓶的真实状况。光源作为辅助成像器件,对成像质量起着至关重要的作用。由于不存在通用的机器视觉照明设备,针对每个特定的应用实例,都需精心选择相应的照明装置,以达到最佳效果。光源可分为可见光和不可见光,常用的可见光源有白炽灯、日光灯、水银灯和钠光灯等。在管制瓶视觉检测中,采用暗室加LED环形照明方法,能够有效减少环境光干扰,为采集清晰的管制瓶图像提供均匀、稳定的光照条件。LED环形照明可从不同角度照亮管制瓶,使瓶身的缺陷和特征更加明显,便于相机捕捉。传感器通常以光纤开关、接近开关等形式出现,其作用是判断被测对象的位置和状态,告知图像传感器进行正确的采集。当管制瓶传输至特定检测位置时,传感器会及时发出信号,触发相机进行图像采集,确保采集到的图像是管制瓶处于最佳检测状态的图像。图像采集卡通常以插入卡的形式安装在PC中,其主要工作是把相机输出的图像输送给电脑主机。它能将来自相机的模拟或数字信号转换成一定格式的图像数据流,同时还可以控制相机的一些参数,比如触发信号、曝光/积分时间、快门速度等。不同类型的相机对应不同硬件结构的图像采集卡,且图像采集卡具有不同的总线形式,如PCI、PCI64、CompactPCI、PC104、ISA等。在图像处理部分,视觉处理软件是核心。该软件用于完成输入图像数据的处理,通过一系列运算得出结果,这个输出结果可能是PASS/FAIL信号、坐标位置、字符串等。常见的机器视觉软件以C/C++图像库、ActiveX控件、图形式编程环境等形式呈现,既可以是专用功能的,也可以是通用目的的。在管制瓶检测中,视觉处理软件会对采集到的图像进行预处理,去除噪声、增强图像对比度等,然后进行边缘提取、缺陷检测和尺寸测量等操作。完整的机器视觉处理流程涵盖图像收集、预处理、特征提取、分类与鉴定以及输出结果等环节。在图像收集阶段,通过相机和适当的镜头捕获现实世界中的图像,此时需综合考虑光照、角度、背景等因素,以保证图像质量和清晰度。预处理阶段则对原始图像进行去噪、增强、平滑和二值化等操作,提高图像质量和识别精度。特征提取环节从预处理后的图像中提取能够代表目标对象的特征信息,如颜色、形状、纹理、边缘等。分类与鉴定通过机器学习或深度学习算法对提取的特征进行分类识别,实现对目标物体的自动检测和识别。最后,以某种形式输出识别结果,如在图像上标注目标物体的位置和类别,或将结果传输到计算机或其他设备进行后续处理。二、管制瓶视觉检测技术基础2.2管制瓶视觉检测系统架构2.2.1总体设计方案管制瓶视觉检测系统旨在实现对管制瓶的高效、精准检测,其总体架构融合了机械传动、图像采集、图像处理以及运动控制等多个关键部分,各部分协同工作,确保检测任务的顺利完成,系统架构如图1所示。【此处插入系统架构图1:管制瓶视觉检测系统架构图】【此处插入系统架构图1:管制瓶视觉检测系统架构图】在机械传动部分,采用高精度的传送带与稳定的电机驱动,实现管制瓶的匀速、平稳传输。通过精确的速度控制和定位装置,确保每个管制瓶在进入检测区域时,都能处于最佳的检测位置,为后续的图像采集提供稳定的基础。例如,传送带的速度可根据相机的帧率和图像采集需求进行精确调整,保证在相机采集图像时,管制瓶的运动状态不会对图像质量产生影响。图像采集部分是系统获取管制瓶信息的关键环节。选用高分辨率、高帧率的工业相机,搭配适合的工业镜头,能够清晰捕捉管制瓶的表面特征和尺寸信息。同时,采用暗室加LED环形照明方法,有效减少环境光干扰,提供均匀、稳定的光照条件,使相机能够采集到高质量的图像。多个相机从不同角度对管制瓶进行拍摄,实现对管制瓶全方位的图像采集,确保不会遗漏任何缺陷和特征。图像处理部分是整个系统的核心,负责对采集到的图像进行深入分析和处理。首先,运用图像预处理算法,去除图像中的噪声、干扰和不均匀光照等影响,提高图像质量。然后,采用先进的边缘提取算法,准确提取管制瓶的边缘信息,为后续的缺陷检测和尺寸测量奠定基础。针对不同类型的缺陷,如裂纹、气泡、划痕等,设计相应的特征提取和识别算法,通过对图像特征的分析和判断,实现对缺陷的准确检测和分类。在尺寸测量方面,根据管制瓶的外观规格和尺寸要求,采用合适的算法对管制瓶的尺寸参数进行测量,如瓶口内径、外径,瓶身高度、直径等,并对测量结果进行误差分析和修正,确保测量精度。运动控制部分则负责协调系统中各个运动部件的动作,实现对管制瓶的精准定位和传输。通过运动控制卡和相应的控制软件,对电机的转速、转向等进行精确控制,确保传送带的运动平稳、准确。同时,根据图像处理部分的检测结果,对不合格的管制瓶进行自动剔除,实现检测与分拣的自动化。例如,当检测到某个管制瓶存在缺陷时,运动控制部分会立即控制分拣装置,将该管制瓶从传送带上剔除,保证后续产品的质量。2.2.2硬件选型与设计在硬件选型方面,充分考虑检测系统的精度、速度、稳定性以及成本等多方面因素。工业相机作为图像采集的核心设备,其分辨率直接影响检测精度,帧率则决定了检测速度。对于管制瓶检测,选择分辨率为[X]万像素的工业相机,能够清晰捕捉瓶身的细微缺陷和尺寸细节。其帧率达到[X]帧/秒,可满足高速生产线的检测需求,确保在管制瓶快速传输过程中,也能准确采集到清晰的图像。镜头的选择同样至关重要,需根据相机的参数和检测目标的大小、距离等因素进行综合考虑。选用焦距为[X]mm的镜头,其光圈可根据光照条件和图像采集需求进行调整,以保证图像的清晰度和对比度。该镜头的景深范围能够覆盖管制瓶的检测区域,确保在不同位置的管制瓶都能清晰成像。光源的设计是保证图像质量的关键因素之一。采用暗室加LED环形照明方法,在暗室环境中,可有效减少环境光对图像采集的干扰。LED环形照明能够从不同角度均匀照亮管制瓶,使瓶身的缺陷和特征更加明显,便于相机捕捉。通过实验测试不同颜色和亮度的LED光源对图像采集效果的影响,最终确定采用[具体颜色和亮度]的LED环形光源,在该光源条件下,采集到的图像边缘清晰,缺陷特征突出,为后续的图像处理提供了良好的基础。在照明系统设计中,还需考虑光源的安装位置和角度。将LED环形光源安装在相机周围,使其与相机的光轴保持一定的夹角,能够避免光线直接反射到相机镜头,产生反光和眩光等问题。同时,通过调整光源的角度,使光线能够充分照射到管制瓶的各个部位,特别是瓶身的侧面和底部,确保对管制瓶进行全面、无死角的检测。图像采集卡作为连接相机和计算机的桥梁,负责将相机采集到的图像信号传输到计算机中进行处理。选择具有高速数据传输能力的图像采集卡,其接口类型为[具体接口类型],能够快速、稳定地传输图像数据,保证图像的实时性和完整性。此外,图像采集卡还具备一定的图像处理功能,如图像预处理、图像缓存等,可减轻计算机的处理负担,提高系统的整体性能。2.2.3软件平台搭建本系统选用[具体软件开发平台名称]作为软件开发平台,该平台具有丰富的函数库和工具包,能够方便地实现图像处理、算法开发以及用户界面设计等功能。其强大的图像处理能力,为实现各种复杂的图像处理算法提供了有力支持。系统软件主要包括图像采集模块、图像处理模块、缺陷检测模块、尺寸测量模块以及用户界面模块等多个功能模块。图像采集模块负责与相机和图像采集卡进行通信,实现对管制瓶图像的实时采集。通过设置相机的参数,如曝光时间、增益、帧率等,确保采集到的图像质量满足检测要求。同时,该模块还能够对采集到的图像进行实时预览和存储,方便后续的分析和处理。图像处理模块是软件的核心部分,集成了多种图像处理算法,如图像去噪、图像增强、边缘提取等。在图像去噪方面,采用小波变换和数学形态学相结合的方法,能够有效去除图像中的噪声,同时保留图像的细节信息。图像增强算法则通过调整图像的对比度、亮度等参数,使图像中的缺陷和特征更加明显。边缘提取算法采用改进的算法,能够准确提取管制瓶的边缘,为后续的缺陷检测和尺寸测量提供准确的边缘信息。缺陷检测模块基于图像处理模块提取的边缘信息和图像特征,采用相应的缺陷检测算法,对管制瓶的缺陷进行识别和分类。针对不同类型的缺陷,如裂纹、气泡、划痕等,建立了相应的特征模型和检测算法。通过对图像特征的分析和判断,能够准确检测出管制瓶是否存在缺陷,并确定缺陷的类型和位置。尺寸测量模块根据管制瓶的外观规格和尺寸要求,采用合适的算法对管制瓶的尺寸参数进行测量,如瓶口内径、外径,瓶身高度、直径等。采用边缘像素扫描法进行瓶身检测、改进的Hough变换法对瓶口图像进行圆心定位和内外径测量等。对测量结果进行误差分析,通过多次测量和数据统计,找出可能存在误差的原因,并采取相应的补偿措施,提高尺寸测量的精度。用户界面模块是用户与系统进行交互的窗口,采用简洁明了的设计风格,方便用户操作。针对不同用户,如生产线上的操作人员和工程技术人员,分别设计了适合生产的主界面和适合工程人员的图像处理等分界面。主界面实时显示检测结果和报警信息,操作人员可以直观地了解生产线上管制瓶的质量情况。当检测到不合格产品时,系统会及时发出报警信号,并显示不合格产品的数量和具体缺陷信息。图像处理等分界面则提供更详细的图像处理参数设置和分析功能,方便工程人员进行算法调试和优化。工程人员可以在该界面中调整图像处理算法的参数,观察图像的处理效果,对算法进行优化和改进,以提高系统的检测性能。三、符合检测标准的边缘图像提取3.1图像预处理3.1.1图像去噪算法在管制瓶视觉检测中,图像去噪是提高图像质量的关键步骤,直接影响后续的边缘提取和缺陷检测精度。均值滤波和中值滤波作为常用的去噪算法,在管制瓶图像去噪中有着不同的表现。均值滤波属于线性滤波算法,其核心原理是采用邻域平均法。对于待处理的当前像素点,选取一个由其近邻若干像素组成的模板,计算模板中所有像素的均值,并用该均值替代原图像中当前像素点的值。例如,对于一个3×3的模板,其对当前像素及其相邻的8个像素一视同仁,进行平均处理。在管制瓶图像中,若存在高斯噪声,均值滤波能在一定程度上抑制噪声,因为高斯噪声是由灰度级的尖锐变化组成,均值处理可减小图像灰度的“尖锐变化”,从而降低噪声影响。然而,均值滤波也存在明显的缺点,它会使图像变得模糊,且模糊程度与所采用的模板大小密切相关,模板越大,图像的模糊程度越严重。在对含有高斯噪声的管制瓶图像进行均值滤波处理时,虽然噪声得到了一定程度的抑制,但瓶身的边缘细节也变得模糊,这对于后续精确的边缘提取和缺陷检测极为不利,可能导致一些细微缺陷被忽略,影响检测的准确性。中值滤波是基于排序统计理论的非线性信号处理技术。其实现原理是将某个像素邻域中的像素按灰度值进行排序,然后选择该序列的中间值作为输出的像素值。以一个5×5的方形邻域为例,首先确定以某个像素为中心点的该邻域,然后将邻域中的25个像素的灰度值进行排序,取排好序序列的中间值作为中心点像素灰度的新值。当窗口在图像中上下左右移动时,利用中值滤波算法可对图像进行平滑处理。在处理含有椒盐噪声的管制瓶图像时,中值滤波表现出独特的优势。椒盐噪声只在画面中的部分点上随机出现,根据中值滤波原理,通过数据排序的方法,将图像中未被噪声污染的点代替噪声点的值的概率较大,因此能有效去除椒盐噪声,同时较好地保留画面的轮廓。但中值滤波对于高斯噪声的抑制效果不佳,因为高斯噪声使用随机大小的幅值污染所有的点,无论怎样进行数据选择,得到的往往还是被污染的值。为了更直观地对比两种算法在管制瓶图像去噪中的效果,进行了相关实验。实验选取了多幅含有不同类型噪声(高斯噪声、椒盐噪声)的管制瓶图像,分别采用均值滤波和中值滤波进行处理。结果显示,对于含有高斯噪声的图像,均值滤波虽能抑制噪声,但图像边缘模糊明显,在边缘提取时,边缘的连续性和准确性受到较大影响;而中值滤波对高斯噪声的抑制作用微弱,图像中的噪声依然较为明显。对于含有椒盐噪声的图像,中值滤波能有效去除噪声,图像轮廓清晰,边缘提取效果较好;均值滤波对椒盐噪声的去除效果则不理想,噪声仍然存在于图像中。3.1.2灰度变换灰度变换是改善图像质量、增强图像特征的重要手段,在管制瓶视觉检测中,灰度拉伸和直方图均衡化等方法发挥着关键作用。灰度拉伸是一种基于线性变换的灰度增强方法。由于在实际采集管制瓶图像时,受光线等因素影响,图像可能会出现局部过亮或过暗的情况,导致图像细节不清晰,影响后续检测。灰度拉伸的原理是将灰度图像进行分段性变化,若原图像f(x,y)的灰度变化区间为[a,b],变换后图像g(x,y)的灰度范围扩展到区间[c,d],通过特定的线性变换实现。在对管制瓶图像进行灰度拉伸时,首先统计图像各个灰度级出现的次数,计算出各个灰度级出现的概率,进而统计出各个灰度级的概率和。然后,根据设定的阈值(如取接近于10%总像素的灰度值作为低阈值,接近于90%总像素的灰度值作为高阈值),计算出图像的拉伸率。最后,对图像中的每个像素进行判断,若像素灰度值小于低阈值,则将其灰度值设为0;若大于高阈值,则设为255;介于两者之间的像素,根据拉伸率进行灰度值调整。通过灰度拉伸,管制瓶图像中亮的区域更亮,暗的区域更暗,图像的对比度得到显著提高,瓶身的缺陷和边缘等特征更加明显,为后续的边缘提取和缺陷检测提供了更清晰的图像基础。直方图均衡化是一种基于像素灰度分布统计分析的图像增强技术。其目的是通过调整图像像素的灰度分布,使图像的直方图更接近均匀分布,从而提高图像的对比度,增强图像中细节的可见性。在离散情况下,设图像共有L个灰度级,第k个灰度级rk出现的像素个数为nk,图像的总像素个数为N,则第k个灰度级出现的概率为Pr(rk)=nk/N。进行均匀化处理的变换函数为sk=T[rk]=∑Pr(rj)(j从0到k)。在管制瓶图像中,直方图均衡化能够使图像的灰度范围得到更充分的利用,原本对比度较低、细节不明显的图像,经过直方图均衡化后,各个灰度级的分布更加均匀,图像的整体视觉效果得到改善,有助于更清晰地显示管制瓶的表面特征和缺陷信息。为了验证灰度变换方法在管制瓶图像中的应用效果,进行了对比实验。选取多幅原始管制瓶图像,分别对其进行灰度拉伸和直方图均衡化处理。实验结果表明,灰度拉伸能够有效地改善图像局部过亮或过暗的问题,突出图像的细节特征,对于一些原本难以分辨的微小缺陷,经过灰度拉伸后变得清晰可见。直方图均衡化则使图像的整体对比度得到提升,图像的层次感增强,在显示管制瓶的整体轮廓和表面纹理方面表现出色。3.2边缘提取算法3.2.1经典边缘检测算法分析在管制瓶边缘提取中,Sobel、Canny等经典算法各有优劣,在实际应用中需根据具体需求谨慎选择。Sobel算法是一种基于数学的边缘检测算法,通过构建水平和垂直方向的卷积核,对图像进行卷积运算来检测边缘。其水平方向卷积核为G_x=\begin{bmatrix}-1&0&1\\-2&0&2\\-1&0&1\end{bmatrix},垂直方向卷积核为G_y=\begin{bmatrix}-1&-2&-1\\0&0&0\\1&2&1\end{bmatrix}。在对管制瓶图像进行边缘检测时,该算法具有实现简单、计算速度快的显著优势,能够快速响应生产线的实时检测需求,在高速运转的生产线上,可迅速对大量管制瓶图像进行边缘提取,不会成为检测效率的瓶颈。同时,它对较小的边缘细节具有一定的检测能力,对于管制瓶上一些细微的边缘特征,如瓶口处的细微轮廓变化,能够有效地捕捉。并且,Sobel算法对于噪声有一定的抵抗能力,在实际的工业生产环境中,图像难免会受到各种噪声的干扰,Sobel算法在一定程度上能够减少噪声对边缘检测结果的影响。然而,Sobel算法也存在明显的缺陷。当面对边缘方向不同的情况时,它可能会出现误检测,例如在管制瓶的复杂曲面边缘处,由于边缘方向的多样性,Sobel算法可能会将一些非边缘区域误判为边缘。在边缘方向发生变化的地方,Sobel算法检测到的边缘可能会产生断裂,这对于需要连续、完整边缘信息的缺陷检测和尺寸测量来说,会严重影响检测的准确性和可靠性。Canny算法是一种基于梯度的多阶段边缘检测算法,其核心步骤包括高斯滤波、梯度计算、非极大值抑制和双阈值检测。在对管制瓶图像进行边缘检测时,高斯滤波能够有效地去除图像中的噪声,为后续的边缘检测提供相对干净的图像基础,在复杂的工业环境下,采集到的管制瓶图像中可能包含大量噪声,高斯滤波可有效降低噪声对边缘检测的干扰。梯度计算通过计算图像中每个像素的梯度幅度和方向,确定边缘的强度和方向。非极大值抑制则对梯度幅值进行细化,去除那些非真正边缘的点,使得检测到的边缘更加精细。双阈值检测通过设置高低两个阈值,连接真正的边缘点,去除虚假边缘,从而使检测到的边缘连续性好。Canny算法能够检测到更加精细的边缘,对于管制瓶上极其细微的裂纹、划痕等缺陷边缘,能够准确地检测和提取。但该算法的缺点也较为突出,其算法复杂,涉及多个步骤和参数调整,计算量大,这在一定程度上限制了其在对检测速度要求极高的生产线中的应用。而且,Canny算法对于边缘的宽度和强度变化敏感,在管制瓶图像中,由于光照不均等因素导致边缘的宽度和强度存在变化时,可能会导致误检测,影响检测结果的准确性。3.2.2小波变换与数学形态学结合算法小波变换与数学形态学结合算法是一种针对管制瓶边缘提取的有效方法,它融合了小波变换在频域分析的优势和数学形态学在图像形态处理的特长。小波变换是一种时频分析方法,它能够对图像进行多尺度分解,将图像分解为不同频率的子带。在对管制瓶图像进行处理时,通过小波变换,可以将图像分解为低频子图像和高频子图像。低频子图像主要包含图像的平滑背景和大致轮廓信息,高频子图像则包含图像的边缘、细节和噪声等信息。例如,对于管制瓶图像,低频子图像能够反映瓶身的整体形状和大致轮廓,高频子图像则能够突出瓶口、瓶身的边缘细节以及可能存在的缺陷边缘。通过对高频子图像的分析,可以有效地检测出图像的边缘位置。但小波变换在单独用于边缘提取时,对于低频区域完整连续的边缘提取效果不佳,并且会丢弃包含一些重要细节的高频区域,同时受到噪声的影响而导致边缘提取效果不佳。数学形态学是基于形态学的图像处理方法,它通过定义结构元素,对图像进行腐蚀、膨胀、开运算、闭运算等操作,来改变图像的形态结构。在管制瓶边缘提取中,数学形态学可用于对小波变换后的低频子图像进行边缘检测。例如,通过形态学梯度运算,能够突出低频子图像中边缘的变化,从而提取出连续、完整的边缘。腐蚀操作可以去除图像中的微小噪声和毛刺,使边缘更加平滑;膨胀操作则可以连接断裂的边缘,增强边缘的连续性。开运算和闭运算能够进一步优化边缘的形态,去除噪声和填补空洞。将小波变换与数学形态学相结合,能够有效弥补各自的不足。首先利用小波变换对管制瓶图像进行多尺度分解,得到低频子图像和高频子图像。然后,对低频子图像采用数学形态学进行边缘检测,利用数学形态学的形态学梯度运算、腐蚀、膨胀等操作,提取出低频区域的连续、完整边缘。对高频子图像先进行小波降噪,去除高频子图像中的噪声干扰,再采用小波模极大值法进行加权边缘检测,突出高频区域的边缘细节。最后,采用一定的融合规则对高、低频边缘子图像进行融合,得到完整、准确的管制瓶边缘图像。为了验证该算法在管制瓶边缘提取中的效果,与经典的Sobel和Canny算法进行了对比实验。实验结果表明,在相同的噪声环境下,小波变换与数学形态学结合算法提取的边缘更加完整、连续,对于管制瓶上复杂的边缘特征和细微缺陷边缘的检测效果明显优于Sobel算法。与Canny算法相比,该算法在计算复杂度上更低,且在边缘宽度和强度变化较大的情况下,仍能准确地检测边缘,减少误检测的发生。在检测含有细微裂纹的管制瓶图像时,Sobel算法检测到的边缘存在断裂,无法完整显示裂纹的形态;Canny算法虽然能检测到裂纹边缘,但受噪声影响,出现了一些误检测的边缘;而小波变换与数学形态学结合算法能够清晰、完整地提取出裂纹边缘,且无明显误检测,为后续的缺陷检测和尺寸测量提供了更准确的边缘信息。四、基于图像分析的管制瓶检测算法设计4.1尺寸检测算法4.1.1基于轮廓的尺寸测量原理基于轮廓的尺寸测量是管制瓶尺寸检测的关键方法,其原理是通过提取管制瓶的轮廓信息,利用数学几何知识和图像处理算法来计算其各项尺寸参数。在实际应用中,首先运用前文所述的边缘提取算法,如小波变换与数学形态学结合算法,准确提取管制瓶的边缘轮廓。这些边缘轮廓包含了管制瓶的形状和尺寸特征,是后续尺寸测量的基础。以瓶口内径和外径测量为例,当提取出瓶口的边缘轮廓后,可通过轮廓的几何特性来计算内径和外径。对于圆形瓶口,其轮廓可近似看作一个圆形,根据圆的几何性质,圆的直径是通过圆心且两端都在圆上的线段。在图像处理中,通过计算轮廓上的点到某一中心点的距离,找到距离的最大值和最小值,分别对应瓶口的外径和内径。假设在图像中,通过某种算法确定了瓶口轮廓的圆心坐标为(x_0,y_0),对于轮廓上的任意一点(x,y),其到圆心的距离d=\sqrt{(x-x_0)^2+(y-y_0)^2}。遍历轮廓上的所有点,得到最大距离d_{max}和最小距离d_{min},则瓶口外径D_{outer}=2d_{max},瓶口内径D_{inner}=2d_{min}。对于瓶身高度和直径的测量,同样基于轮廓信息。在图像中,瓶身的高度可通过测量瓶身上下边缘轮廓之间的垂直距离得到。首先确定瓶身的上边缘轮廓和下边缘轮廓,然后找到这两条轮廓在垂直方向上的对应点,计算这些对应点之间的平均距离,即为瓶身的高度。例如,通过边缘提取得到瓶身上边缘的一系列点集S_{upper}和下边缘的点集S_{lower},对于每一对对应点(x_{upper},y_{upper})\inS_{upper}和(x_{lower},y_{lower})\inS_{lower},计算垂直距离h_{i}=|y_{upper}-y_{lower}|,瓶身高度H=\frac{1}{n}\sum_{i=1}^{n}h_{i},其中n为对应点的对数。瓶身直径的测量则是在瓶身的水平方向上,通过轮廓计算得到。在图像中,找到瓶身轮廓在水平方向上的最左点和最右点,计算这两点之间的距离,即为瓶身的直径。设瓶身轮廓在水平方向上的最左点坐标为(x_{left},y_{left}),最右点坐标为(x_{right},y_{right}),则瓶身直径D_{body}=|x_{right}-x_{left}|。4.1.2算法实现与误差分析在算法实现方面,选择[具体编程环境名称]作为开发平台,利用其丰富的图像处理库和函数,如OpenCV库,来实现基于轮廓的尺寸测量算法。首先,读取经过预处理和边缘提取后的管制瓶图像,利用OpenCV中的轮廓提取函数,如findContours函数,提取出管制瓶的轮廓。该函数通过对二值图像进行分析,寻找图像中的轮廓边界,并将其以点集的形式存储。以瓶口内径和外径测量为例,在提取出瓶口轮廓后,利用矩(moment)计算函数,如cv2.moments函数,计算轮廓的几何矩。通过几何矩可以得到轮廓的重心,即圆心的近似位置。然后,遍历轮廓上的每一个点,计算该点到圆心的距离,找到最大距离和最小距离,从而得到瓶口的外径和内径。具体代码实现如下:importcv2importnumpyasnp#读取图像image=cv2.imread('bottle_image.png',cv2.IMREAD_GRAYSCALE)#边缘提取(假设已经完成边缘提取,得到边缘图像edges)edges=cv2.Canny(image,50,150)#轮廓提取contours,_=cv2.findContours(edges,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)#假设第一个轮廓为瓶口轮廓bottle_opening_contour=contours[0]#计算轮廓的几何矩M=cv2.moments(bottle_opening_contour)ifM["m00"]!=0:cX=int(M["m10"]/M["m00"])cY=int(M["m01"]/M["m00"])else:cX,cY=0,0max_distance=0min_distance=float('inf')forpointinbottle_opening_contour:x,y=point[0]distance=np.sqrt((x-cX)**2+(y-cY)**2)ifdistance>max_distance:max_distance=distanceifdistance<min_distance:min_distance=distanceouter_diameter=2*max_distanceinner_diameter=2*min_distanceprint(f"瓶口外径:{outer_diameter}")print(f"瓶口内径:{inner_diameter}")importnumpyasnp#读取图像image=cv2.imread('bottle_image.png',cv2.IMREAD_GRAYSCALE)#边缘提取(假设已经完成边缘提取,得到边缘图像edges)edges=cv2.Canny(image,50,150)#轮廓提取contours,_=cv2.findContours(edges,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)#假设第一个轮廓为瓶口轮廓bottle_opening_contour=contours[0]#计算轮廓的几何矩M=cv2.moments(bottle_opening_contour)ifM["m00"]!=0:cX=int(M["m10"]/M["m00"])cY=int(M["m01"]/M["m00"])else:cX,cY=0,0max_distance=0min_distance=float('inf')forpointinbottle_opening_contour:x,y=point[0]distance=np.sqrt((x-cX)**2+(y-cY)**2)ifdistance>max_distance:max_distance=distanceifdistance<min_distance:min_distance=distanceouter_diameter=2*max_distanceinner_diameter=2*min_distanceprint(f"瓶口外径:{outer_diameter}")print(f"瓶口内径:{inner_diameter}")#读取图像image=cv2.imread('bottle_image.png',cv2.IMREAD_GRAYSCALE)#边缘提取(假设已经完成边缘提取,得到边缘图像edges)edges=cv2.Canny(image,50,150)#轮廓提取contours,_=cv2.findContours(edges,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)#假设第一个轮廓为瓶口轮廓bottle_opening_contour=contours[0]#计算轮廓的几何矩M=cv2.moments(bottle_opening_contour)ifM["m00"]!=0:cX=int(M["m10"]/M["m00"])cY=int(M["m01"]/M["m00"])else:cX,cY=0,0max_distance=0min_distance=float('inf')forpointinbottle_opening_contour:x,y=point[0]distance=np.sqrt((x-cX)**2+(y-cY)**2)ifdistance>max_distance:max_distance=distanceifdistance<min_distance:min_distance=distanceouter_diameter=2*max_distanceinner_diameter=2*min_distanceprint(f"瓶口外径:{outer_diameter}")print(f"瓶口内径:{inner_diameter}")image=cv2.imread('bottle_image.png',cv2.IMREAD_GRAYSCALE)#边缘提取(假设已经完成边缘提取,得到边缘图像edges)edges=cv2.Canny(image,50,150)#轮廓提取contours,_=cv2.findContours(edges,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)#假设第一个轮廓为瓶口轮廓bottle_opening_contour=contours[0]#计算轮廓的几何矩M=cv2.moments(bottle_opening_contour)ifM["m00"]!=0:cX=int(M["m10"]/M["m00"])cY=int(M["m01"]/M["m00"])else:cX,cY=0,0max_distance=0min_distance=float('inf')forpointinbottle_opening_contour:x,y=point[0]distance=np.sqrt((x-cX)**2+(y-cY)**2)ifdistance>max_distance:max_distance=distanceifdistance<min_distance:min_distance=distanceouter_diameter=2*max_distanceinner_diameter=2*min_distanceprint(f"瓶口外径:{outer_diameter}")print(f"瓶口内径:{inner_diameter}")#边缘提取(假设已经完成边缘提取,得到边缘图像edges)edges=cv2.Canny(image,50,150)#轮廓提取contours,_=cv2.findContours(edges,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)#假设第一个轮廓为瓶口轮廓bottle_opening_contour=contours[0]#计算轮廓的几何矩M=cv2.moments(bottle_opening_contour)ifM["m00"]!=0:cX=int(M["m10"]/M["m00"])cY=int(M["m01"]/M["m00"])else:cX,cY=0,0max_distance=0min_distance=float('inf')forpointinbottle_opening_contour:x,y=point[0]distance=np.sqrt((x-cX)**2+(y-cY)**2)ifdistance>max_distance:max_distance=distanceifdistance<min_distance:min_distance=distanceouter_diameter=2*max_distanceinner_diameter=2*min_distanceprint(f"瓶口外径:{outer_diameter}")print(f"瓶口内径:{inner_diameter}")edges=cv2.Canny(image,50,150)#轮廓提取contours,_=cv2.findContours(edges,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)#假设第一个轮廓为瓶口轮廓bottle_opening_contour=contours[0]#计算轮廓的几何矩M=cv2.moments(bottle_opening_contour)ifM["m00"]!=0:cX=int(M["m10"]/M["m00"])cY=int(M["m01"]/M["m00"])else:cX,cY=0,0max_distance=0min_distance=float('inf')forpointinbottle_opening_contour:x,y=point[0]distance=np.sqrt((x-cX)**2+(y-cY)**2)ifdistance>max_distance:max_distance=distanceifdistance<min_distance:min_distance=distanceouter_diameter=2*max_distanceinner_diameter=2*min_distanceprint(f"瓶口外径:{outer_diameter}")print(f"瓶口内径:{inner_diameter}")#轮廓提取contours,_=cv2.findContours(edges,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)#假设第一个轮廓为瓶口轮廓bottle_opening_contour=contours[0]#计算轮廓的几何矩M=cv2.moments(bottle_opening_contour)ifM["m00"]!=0:cX=int(M["m10"]/M["m00"])cY=int(M["m01"]/M["m00"])else:cX,cY=0,0max_distance=0min_distance=float('inf')forpointinbottle_opening_contour:x,y=point[0]distance=np.sqrt((x-cX)**2+(y-cY)**2)ifdistance>max_distance:max_distance=distanceifdistance<min_distance:min_distance=distanceouter_diameter=2*max_distanceinner_diameter=2*min_distanceprint(f"瓶口外径:{outer_diameter}")print(f"瓶口内径:{inner_diameter}")contours,_=cv2.findContours(edges,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)#假设第一个轮廓为瓶口轮廓bottle_opening_contour=contours[0]#计算轮廓的几何矩M=cv2.moments(bottle_opening_contour)ifM["m00"]!=0:cX=int(M["m10"]/M["m00"])cY=int(M["m01"]/M["m00"])else:cX,cY=0,0max_distance=0min_distance=float('inf')forpointinbottle_opening_contour:x,y=point[0]distance=np.sqrt((x-cX)**2+(y-cY)**2)ifdistance>max_distance:max_distance=distanceifdistance<min_distance:min_distance=distanceouter_diameter=2*max_distanceinner_diameter=2*min_distanceprint(f"瓶口外径:{outer_diameter}")print(f"瓶口内径:{inner_diameter}")#假设第一个轮廓为瓶口轮廓bottle_opening_contour=contours[0]#计算轮廓的几何矩M=cv2.moments(bottle_opening_contour)ifM["m00"]!=0:cX=int(M["m10"]/M["m00"])cY=int(M["m01"]/M["m00"])else:cX,cY=0,0max_distance=0min_distance=float('inf')forpointinbottle_opening_contour:x,y=point[0]distance=np.sqrt((x-cX)**2+(y-cY)**2)ifdistance>max_distance:max_distance=distanceifdistance<min_distance:min_distance=distanceouter_diameter=2*max_distanceinner_diameter=2*min_distanceprint(f"瓶口外径:{outer_diameter}")print(f"瓶口内径:{inner_diameter}")bottle_opening_contour=contours[0]#计算轮廓的几何矩M=cv2.moments(bottle_opening_contour)ifM["m00"]!=0:cX=int(M["m10"]/M["m00"])cY=int(M["m01"]/M["m00"])else:cX,cY=0,0max_distance=0min_distance=float('inf')forpointinbottle_opening_contour:x,y=point[0]distance=np.sqrt((x-cX)**2+(y-cY)**2)ifdistance>max_distance:max_distance=distanceifdistance<min_distance:min_distance=distanceouter_diameter=2*max_distanceinner_diameter=2*min_distanceprint(f"瓶口外径:{outer_diameter}")print(f"瓶口内径:{inner_diameter}")#计算轮廓的几何矩M=cv2.moments(bottle_opening_contour)ifM["m00"]!=0:cX=int(M["m10"]/M["m00"])cY=int(M["m01"]/M["m00"])else:cX,cY=0,0max_distance=0min_distance=float('inf')forpointinbottle_opening_contour:x,y=point[0]distance=np.sqrt((x-cX)**2+(y-cY)**2)ifdistance>max_distance:max_distance=distanceifdistance<min_distance:min_distance=distanceouter_diameter=2*max_distanceinner_diameter=2*min_distanceprint(f"瓶口外径:{outer_diameter}")print(f"瓶口内径:{inner_diameter}")M=cv2.moments(bottle_opening_contour)ifM["m00"]!=0:cX=int(M["m10"]/M["m00"])cY=int(M["m01"]/M["m00"])else:cX,cY=0,0max_distance=0min_distance=float('inf')forpointinbottle_opening_contour:x,y=point[0]distance=np.sqrt((x-cX)**2+(y-cY)**2)ifdistance>max_distance:max_distance=distanceifdistance<min_distance:min_distance=distanceouter_diameter=2*max_distanceinner_diameter=2*min_distanceprint(f"瓶口外径:{outer_diameter}")print(f"瓶口内径:{inner_diameter}")ifM["m00"]!=0:cX=int(M["m10"]/M["m00"])cY=int(M["m01"]/M["m00"])else:cX,cY=0,0max_distance=0min_distance=float('inf')forpointinbottle_opening_contour:x,y=point[0]distance=np.sqrt((x-cX)**2+(y-cY)**2)ifdistance>max_distance:max_distance=distanceifdistance<min_distance:min_distance=distanceouter_diameter=2*max_distanceinner_diameter=2*min_distanceprint(f"瓶口外径:{outer_diameter}")print(f"瓶口内径:{inner_diameter}")cX=int(M["m10"]/M["m00"])cY=int(M["m01"]/M["m00"])else:cX,cY=0,0max_distance=0min_distance=float('inf')forpointinbottle_opening_contour:x,y=point[0]distance=np.sqrt((x-cX)**2+(y-cY)**2)ifdistance>max_distance:max_distance=distanceifdistance<min_distance:min_distance=distanceouter_diameter=2*max_distanceinner_diameter=2*min_distanceprint(f"瓶口外径:{outer_diameter}")print(f"瓶口内径:{inner_diameter}")cY=int(M["m01"]/M["m00"])else:cX,cY=0,0max_distance=0min_distance=float('inf')forpointinbottle_opening_contour:x,y=point[0]distance=np.sqrt((x-cX)**2+(y-cY)**2)ifdistance>max_distance:max_distance=distanceifdistance<min_distance:min_distance=distanceouter_diameter=2*max_distanceinner_diameter=2*min_distanceprint(f"瓶口外径:{outer_diameter}")print(f"瓶口内径:{inner_diameter}")else:cX,cY=0,0max_distance=0min_distance=float('inf')forpointinbottle_opening_contour:x,y=point[0]distance=np.sqrt((x-cX)**2+(y-cY)**2)ifdistance>max_distance:max_distance=distanceifdistance<min_distance:min_distance=distanceouter_diameter=2*max_distanceinner_diameter=2*min_distanceprint(f"瓶口外径:{outer_diameter}")print(f"瓶口内径:{inner_diameter}")cX,cY=0,0max_distance=0min_distance=float('inf')forpointinbottle_opening_contour:x,y=point[0]distance=np.sqrt((x-cX)**2+(y-cY)**2)ifdistance>max_distance:max_distance=distanceifdistance<min_distance:min_distance=distanceouter_diameter=2*max_distanceinner_diameter=2*min_distanceprint(f"瓶口外径:{outer_diameter}")print(f"瓶口内径:{inner_diameter}")max_distance=0min_distance=float('inf')forpointinbottle_opening_contour:x,y=point[0]distance=np.sqrt((x-cX)**2+(y-cY)**2)ifdistance>max_distance:max_distance=distanceifdistance<min_distance:min_distance=distanceouter_diameter=2*max_distanceinner_diameter=2*min_distanceprint(f"瓶口外径:{outer_diameter}")print(f"瓶口内径:{inner_diameter}")min_distance=float('inf')forpointinbottle_opening_contour:x,y=point[0]distance=np.sqrt((x-cX)**2+(y-cY)**2)ifdistance>max_distance:max_distance=distanceifdistance<min_distance:min_distance=distanceouter_diameter=2*max_distanceinner_diameter=2*mi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论