版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机视觉应用第7章图像分割基础目录CONTENT7.1阈值分割:基于灰度差异017.2轮廓分割:基于物体轮廓027.3分水岭算法:处理重叠物体03任务实践04拓展实训05本章小结06课后习题07工业质检中,分割出产品的缺陷区域,如零件上的划痕“图像分割”是连接“特征提取”与“目标分析”的关键环节它不像目标检测那样用矩形框粗略标记目标,而是从像素级别将图像分成不同的“有意义区域”。农业领域中,分割农田图像里的作物与土壤医学影像中,分割CT图里的器官与病变组织引言引言掌握传统分割方法(阈值分割、轮廓分割、分水岭算法)即可解决多数简单场景的需求;无需掌握复杂的深度学习分割模型入门学习者通过递进的例子掌握分割的核心逻辑,为后续复杂分割任务打下基础。从“像素灰度差异”和“物体轮廓特征”入手工作情境“精准化”升级工作情境制药厂要数清重叠的药片汽车厂要测准零件的缺陷面积医院要分清CT图里的病灶和正常组织用Otsu阈值能快速分开零件和缺陷,用分水岭能处理重叠的药片。不管你是想做质检、医疗影像辅助,还是零售商品分析。这些技术都能帮你“把目标区域拆清楚、算准确”,直接应对岗位里的“精准处理”需求。阈值分割、轮廓分割和分水岭算法能帮助你:工作情境我国推进新型工业化、发展新质生产力的进程中其技术精度直接决定下游应用的可靠性,这与职业教育倡导的“工匠精神”高度契合。图像分割作为计算机视觉的“基础手术刀”工作情境从高端芯片缺陷检测到医疗影像病灶识别,从智慧农业杂草精准分割到卫星遥感灾害区域划分,图像分割技术已成为产业升级的关键支撑。企业导师强调“像素级的误差可能引发工程级的风险”每一次阈值调整、每一次轮廓提取的严谨态度,既是技能素养的体现,更是对“专业即责任”职业担当的践行。学习目标知识目标3.熟悉OpenCV中分割相关核心函数(cv2.threshold、cv2.findContours、cv2.watershed等)的参数含义与调用规范。2.掌握阈值分割(全局阈值、Otsu自动阈值)的原理,熟悉轮廓提取与填充的核心流程,理解分水岭算法“前景-背景-不确定区域”的划分逻辑。1.理解图像分割的核心定义与产业价值,明确阈值分割、轮廓分割、分水岭算法的适用场景差异。能力目标3.能够综合运用三种分割方法,完成复杂场景任务(如重叠物体分割、多物体计数与面积统计、古碑文修复),并实现结果可视化与保存。2.具备参数调优能力,能通过调整滤波核大小、阈值、面积阈值等参数,解决分割中的噪声干扰、漏分割、误分割问题。1.能够根据图像特征(灰度差异、是否重叠、边缘清晰度)选择合适的分割方法,独立完成简单场景(如米粒分割、单个物体提取)的代码实现。素养目标3.培养场景适配的思维方式,面对不同图像数据时,能有条理地分析特征、选择方法、排查问题,提升技术落地能力。2.养成严谨的技术实践习惯,如预处理去噪的必要性、参数调整的逻辑性、代码注释与资源释放的规范性,提升程序的可靠性。1.认识图像分割技术在工业质检、医疗影像、文化遗产保护等领域的应用价值,树立“技术服务产业、赋能社会”的职业理念。7.1阈值分割:基于灰度差异阈值分割是最基础、最快速的分割方法,核心思想是“利用前景与背景的灰度差异,设定一个阈值,将图像分为黑白两部分”——灰度值大于阈值的为前景(或背景),小于等于阈值的为背景(或前景),本质是二值化的延伸,但更注重“分割出完整区域”。全局阈值分割手动设定阈值7.1.1示例7-1:全局阈值分割黑色背景上的米粒OpenCV核心库1.新建一个Python文件。2.先导入必要的库:处理数组手动设定阈值第一步:读取图像+格式检查表示直接读灰度图添加判断命令图片路径错了读不出来,能及时提示"图像读取失败",实际项目中这种容错很重要手动设定阈值第二步:图像预处理(高斯去噪)参数里"(5,5)"是高斯核大小,必须是奇数;"sigmaX=1"控制高斯函数在X方向的标准差手动设定阈值第三步:全局阈值分割核心表示二值化模式设置为127是因为,这是0-255的中间值适合前景背景对比明显的图像手动设定阈值第四步:多窗口对比显示显示原图显示去噪图显示分割结果多窗口显示:直观看到从原图到去噪再到分割的完整处理流程手动设定阈值等待按键第五步:结果保存关闭所有窗口手动设定阈值运行结果如图7-1所示,左窗口为原图,中间为去噪图,右窗口为分割图(白色米粒、纯黑背景,无噪声),米粒区域完整分离。图7-1全局阈值分割米粒效果Otsu自动阈值分割7.1.2若图像光照不均、前景背景灰度差异小,如灰色背景上的浅色米粒,手动设定阈值易导致“分割不完整”或“误分割”,此时需用Otsu自动阈值——算法会自动计算出“最优阈值”,使前景与背景的类间方差最大,分割效果最好。Otsu自动阈值分割运行原理参数设为01.Otsu阈值只需在cv2.threshold()的type参数中加cv2.THRESH_OTSU即可;2.格式:ret,img_binary=cv2.threshold(img_blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)无意义,算法自动计算阈值,结果存在ret中新建文件OpenCV核心库1.新建一个Python文件。2.先导入必要的库:Otsu自动阈值分割第一步:读取图像+格式检查表示直接读灰度图添加判断命令图片路径错了读不出来,能及时提示"图像读取失败",实际项目中这种容错很重要Otsu自动阈值分割第二步:图像预处理(高斯去噪)参数里"(5,5)"是高斯核大小,"sigmaX=1"控制标准差高斯滤波因为噪声会影响Otsu算法计算最优阈值的准确性Otsu自动阈值分割第三步:Otsu自动阈值分割核心"0"是占位符,无实际意义;"255"是前景像素值算法原理:Otsu通过遍历所有可能的阈值,计算前景与背景的类间方差,选择使类间方差最大的阈值作为最优分割阈值。因为类间方差最大意味着前景和背景的区分最明显。Otsu自动阈值分割第四步:手动阈值对比实验直观展示Otsu自动阈值的优势"150"是经验值Otsu自动阈值分割第五步:多窗口对比显示显示原图显示去噪图显示Otsu分割结果显示手动分割结果Otsu自动阈值分割第六步:结果保存与信息输出Otsu自动计算的最优阈值,便于后续分析输出最优阈值Otsu自动阈值分割运行结果手动阈值图可能存在“部分米粒未分割”或“背景噪声被误判为米粒”,证明Otsu自动阈值更适应灰度差异小的场景Otsu分割图中,米粒边缘完整,无漏分割或背景残留如图7-2所示,4个窗口依次显示原图、去噪图、Otsu分割图、手动分割图图7-2Otsu与手动阈值对比7.2轮廓分割:基于物体轮廓轮廓分割是“先提取物体轮廓,再通过轮廓填充实现区域分割”的方法,适合“物体边缘清晰、无严重重叠”的场景,如单个苹果、杯子核心流程:图像预处理(灰度化→去噪→边缘检测)→提取轮廓→轮廓填充→分割出物体区域运行原理1.轮廓提取后,需用cv2.drawContours()或cv2.fillPoly()填充轮廓内部,实现区域分割,常用cv2.drawContours()(更简洁)。2.填充轮廓:cv2.drawContours(fill_img,contours,-1,(255),-1)fill_img:空白图像(全黑),用于绘制填充后的轮廓;contours:提取的轮廓列表;-1:绘制所有轮廓(第一个-1),填充轮廓内部(第二个-1,线宽设为-1表示填充);(255):填充颜色(灰度图为255,白色)。轮廓填充函数例7-3:提取苹果区域OpenCV核心库1.新建一个Python文件。2.先导入必要的库:处理数组单物体轮廓分割第一步:读取图像+格式检查读彩色图添加判断命令图片路径错了读不出来,能及时提示"图像读取失败",实际项目中这种容错很重要单物体轮廓分割第二步:颜色空间预处理(HSV过滤)HSV颜色空间更适合基于颜色的分割,对光照变化不敏感因为红色在HSV色环中分布在0°和180°附近用cv2.bitwise_or合并两个掩码单物体轮廓分割第三步:边缘检测预处理"9"是滤波核大小;"75,75"分别是颜色空间和坐标空间的标准差"20"是低阈值;"80"是高阈值只关注红色区域先膨胀cv2.dilate连接断裂边缘再腐蚀cv2.erode恢复原始形状为边缘检测做准备单物体轮廓分割第四步:轮廓提取与筛选轮廓筛选:遍历所有轮廓,过滤面积小于500的小轮廓计算圆度circularity=4*np.pi*area/(perimeter*perimeter)只保留圆度大于0.5的轮廓压缩轮廓点只提取单物体轮廓分割第四步:轮廓提取与筛选选择最佳轮廓:从有效轮廓中选择面积最大的作为苹果轮廓单物体轮廓分割第五、六步:轮廓填充与生成分割结果"-1"表示填充轮廓内部填充轮廓创建空白图像形态学闭运算将填充掩码应用到原图单物体轮廓分割第七步:多窗口显示与保存显示原图显示边缘图显示填充图显示分割图单物体轮廓分割第八步:保存分割结果单物体轮廓分割运行结果示例7-3实现了单个物体的轮廓分割,但实际应用中常遇到多个独立物体(满足“边缘清晰、无严重重叠”条件),如棋盘上的棋子、桌面上的硬币等。在窗口4分割结果图中,苹果区域为原灰度值,背景为纯黑,苹果轮廓完整,无背景残留;窗口3填充图为“黑底白苹果”,清晰体现轮廓填充效果。如图7-3所示,4个窗口依次显示原图、边缘图、填充图、分割图,可以明显看出“分割后苹果与背景完全分离”。图7-3苹果轮廓分割流程这类场景的核心逻辑与单个物体分割一致,仅需在“轮廓筛选”后对多个有效轮廓逐个填充、标记,即可实现多物体的分别分割。多物体轮廓分割例7-4:分割多个棋子OpenCV核心库1.新建一个Python文件。2.先导入必要的库:处理数组第一步:读取图像+灰度转换读彩色图灰度转换轮廓提取在灰度图上更稳定,减少颜色干扰多物体轮廓分割第二步:图像预处理与二值化"(7,7)"是较大的高斯核"sigmaX=2"增大标准差表示反二值化,让棋子变成白色、背景变成黑色,便于轮廓提取多物体轮廓分割第三步:轮廓提取与筛选压缩轮廓点,减少内存占用过滤掉小噪声点,只保留真正的棋子轮廓多物体轮廓分割第四步:逐个分割与颜色标记多物体轮廓分割第四步:逐个分割与颜色标记多物体轮廓分割第五步:显示结果显示原图显示二值图显示分割结果多物体轮廓分割第六步:保存结果等待按键关闭所有窗口多物体轮廓分割运行结果如图7-4所示,3个窗口依次显示原图、二值图、彩色分割图。在分割结果图中,每个棋子用不同颜色的轮廓标记,中心标注序号,棋子区域保留原彩色,背景为黑,实现多物体分别分割。图7-4多棋子轮廓分割结果7.3分水岭算法处理重叠物体当物体存在严重重叠,如一堆重叠的硬币、重叠的药片,阈值分割和轮廓分割会将“多个重叠物体”误判为“一个物体”,此时需用分水岭算法——它基于“地形学”原理,将图像视为“地形”,灰度值低的区域为“山谷”,高的为“山峰”,通过“注水”将不同山谷(不同物体)分开,实现重叠物体的分割。处理流程预处理:灰度化→去噪→阈值分割(得到二值图)→形态学开运算(去除小噪声,平滑边缘);1.确定前景与背景:背景:用cv2.dilate()膨胀二值图,扩大背景区域,确保背景包围所有物体;前景:用cv2.erode()腐蚀二值图,得到“确定的前景”,即物体中心区域,无重叠;不确定区域(边界):背景-前景,即待分割的重叠边界;2.处理流程标记(Markers):创建标记图像,给背景、前景、不确定区域分配不同的标记值(背景=0,前景=1,2,3...,不确定区域=-1);3.应用分水岭:cv2.watershed(),算法根据标记分割不确定区域;4.绘制分割结果:根据算法返回的标记值,给不同物体上色。5.运行原理1.核心函数:cv2.watershed()2.语法格式:markers=cv2.watershed(src,markers)src:输入彩色图像,要求为uint8类型的BGR格式(不可直接输入灰度图,分水岭算法基于彩色图像进行区域分割可视化)markers:输入/输出型标记图像,要求为int32类型,尺寸与输入图像src完全一致。输入时需手动标记:确定的背景区域标记为0,确定的前景(目标)区域标记为正整数(不同目标可标记为不同的正整数,如1、2、3...),未知待分割区域标记为-1;该参数同时作为输出载体,算法会更新其值返回最终分割结果;返回值:markers,int32类型的二维数组,尺寸与输入图像src一致。返回的标记图中包含三种核心值:正整数对应不同的分割目标区域(与输入标记的前景对应)、-1对应各区域之间的边界(分水岭算法分割出的精准边界)、0对应未被成功分割的未知区域(通常由预处理不到位导致)。核心函数分水岭算法例7-5:分水岭算法分割重叠硬币OpenCV核心库1.新建一个Python文件。2.先导入必要的库:处理数组第一步:读取图像+图像备份读彩色图添加判断命令分水岭算法会直接修改输入图像备份可以保留原始图像用于对比显示分水岭算法第二步:预处理流程(去噪→阈值→开运算)表示反二值化,让硬币变成白色,背景变成黑色灰度转换:为后续处理做准备"(3,3)"是较小的核为了去除小噪声,平滑物体边缘分水岭算法第三步:确定前景、背景与不确定区域确保背景包围所有物体阈值筛选重叠边界区域分水岭算法第四步:创建标记唯一标记分水岭算法第五步:应用分水岭算法分水岭算法第六步:多窗口流程展示#显示二值图#显示开运算#显示前景#显示背景#显示分水岭可以清晰看到分水岭算法的每个关键步骤分水岭算法第七步:保存分割结果记录最终的分割效果分水岭算法运行结果对比阈值分割图(重叠硬币为一个整体),分水岭实现了重叠物体的有效分割分水岭结果图中,重叠的硬币被蓝色边界分开,每个硬币视为独立区域,无重叠误判如图7-5所示,6个窗口依次显示原图、二值图、开运算图、前景图、背景图、分割结果图图7-5分水岭分割重叠硬币流程任务实践基于Otsu阈值的米粒分割与计数任务实践准备工作准备"灰色背景上的米粒图像"素材方面操作步骤
用cv2.imread()以灰度图模式读取“rice_gray_bg.jpg”Otsu自动阈值分割:调用cv2.threshold(),参数设为cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU(反色让米粒为白色),打印算法自动计算的阈值(ret_otsu)预处理:调用cv2.GaussianBlur()做去噪(核大小(5,5),sigmaX=1),对应课文“Otsu对噪声敏感,必须去噪”的要求轮廓提取与噪声过滤:用cv2.findContours()提取最外层轮廓(cv2.RETR_EXTERNAL)过滤面积小于50的小噪声,参照课文实验一的min_area设置结果处理与保存结果处理:统计有效米粒数量(len(valid_contours)),在彩色图(灰度图转BGR)上用绿色轮廓,线宽2,标记米粒,每个米粒旁标注序号,如“#1”,顶部添加“TotalRice:X”的文字;3.验证与保存:用cv2.imshow()显示“原图→去噪图→Otsu分割图→计数结果图”,保存计数结果图为“rice_otsu_count.jpg”。4.拓展实训基于图像预处理、阈值分割与形态学操作的古碑文数字化修复实训1实训目标(1)掌握
“去噪→阈值分割→形态学修复→结果保存”的古碑文修复完整流程;(2)学会使用高斯模糊去噪、形态学闭/开运算,解决碑文笔画断裂与背景噪点问题;(3)提升古碑文图像的可读性,实现修复结果的可视化展示与数字化永久保存;(4)理解计算机视觉技术在文化遗产保护中的实际应用价值。
实训准备准备一张"一张古碑文灰度图像"素材方面确保实训代码和素材在同级文件夹。明确实训流程读取图像(灰度化)检查图像有效性高斯模糊去噪开运算清理背景噪点闭运算修复笔画断裂Otsu自动阈值分割可视化对比处理前后图像保存数字化修复结果实训步骤步骤2:编写实训代码OpenCV核心库1.新建一个Python文件。2.先导入必要的库:处理数组实训步骤步骤2:编写实训代码实训步骤步骤2:编写实训代码实训步骤第三步:闭运算与开运算实训步骤步骤2:编写实训代码OpenCV核心库1.新建一个Python文件。2.先导入必要的库:处理数组实训步骤步骤2:编写实训代码实训步骤步骤3:运行与验证实训步骤调整参数:若噪点未清除干净,可增大高斯模糊核大小(如(7,7));若笔画断裂未修复完整,可增大形态学核大小(如(4,4))或添加迭代次数(iterations=2);验证结果:窗口显示两幅图像,对比原图与修复图,确认碑文背景噪点减少、断裂笔画连接完整、文字边缘清晰,可读性显著提升;保存结果:确认项目目录下生成“ancient_inscription_restored.jpg”,打开文件验证修复结果已成功数字化保存,无图像损坏或内容缺失;问题排查:若图像读取失败,检查文件名拼写(区分大小写)、文件路径是否正确,或确认图像文件未被损坏。结果与分析修复关键:本实训的核心是“先修复后清理”的逻辑,先用闭运算(先膨胀后腐蚀)填充文字孔洞、连接断裂笔画,再用开运算(先腐蚀后膨胀)清除背景小噪点,两步形态学操作结合,实现“修复文字”与“净化背景”的双重目标。技术价值:本Otsu自动阈值分割无需手动调整参数,能快速区分古碑文的文字(前景)与背景,有效增强图像对比度,为后续形态学修复打下良好基础;高斯模糊则能在不严重模糊文字边缘的前提下,平滑风化产生的细微划痕,提升修复效果。结果与分析实际意义:本后的古碑文以数字格式保存,可避免物理载体进一步磨损带来的信息丢失,为后续的碑文文字识别(OCR)、文化遗产跨时空传播提供高质量素材,体现“科技赋能文化传承”的核心价值;。运行结果:图7-6为古碑文原图,可见明显的风化划痕、斑驳噪点与文字笔画断裂;图7-7为数字化修复后的图像,背景整洁、文字完整,碑文内容更易辨识,达到实训预期目标。图7-6古碑文原图
图7-7古碑文修复图静态图像硬币计数系统实训2实训目标在前面章节的实训中,通过一个“数硬币”案例学习了“图像读取→灰度化→高斯滤波→Canny边缘检测→轮廓查找→结果绘制”的计算机视觉核心流程,建立了目标检测的基本认知。本实训将再次回归经典的“数硬币”案例,这是对基础案例的进阶拓展;一方面通过“形态学操作填充轮廓缺口”、“面积阈值过滤干扰轮廓”等技术,解决“半露硬币漏检”“噪声误判”等实际场景问题,提升检测精度;另一方面新增“检测时间记录”、“CSV数据持久化”和“单枚硬币编号标注”等功能;将算法演示延伸至工程化应用,让读者从“能跑通基础流程”,进阶到“针对实际场景调优算法,为工程分析提供数据支撑”;本次实训的目标,是从一张静态硬币图片中,自动统计硬币数量,并在图片上用彩色框标记每枚硬币,输出“总数量”和“每枚硬币的面积”。
实训准备准备一张"没有严重堆叠的硬币图像"素材方面确保实训代码和素材在同级文件夹。新建文件OpenCV核心库1.新建一个Python的文件。2.先导入必要的库:处理数组数据导出性能统计文件操作实训步骤第一步:定义主函数+时间记录记录开始时间"image_path"是图像路径统计整个检测过程的耗时,评估算法性能实训步骤第二步:图像读取+格式验证确保图像读取成功,避免后续处理出错读彩色图要在原图基础上绘制检测结果,保留原始图像信息实训步骤第三步:图像预处理流程Canny算法能检测出清晰的硬币边缘实训步骤后续边缘检测和轮廓查找都需要单通道图像硬币图像可能有噪声,大核能更好平滑图像第四步:形态学优化(关键改进)闭运算:能填充边缘检测后可能出现的空隙,让硬币轮廓更完整实训步骤表示先膨胀后腐蚀第五步:轮廓检测与过滤实训步骤压缩轮廓点只检测最外层轮廓要过滤掉太小的噪声点和太大的异常区域,只保留真正的硬币轮廓第六步:结果绘制与数据记录对每个合格轮廓计算面积,记录硬币ID、面积和检测时间遍历轮廓用绿色线条标记硬币边界绘制轮廓实训步骤第六步:结果绘制与数据记录在硬币中心显示红色编号添加编号实训步骤第七步:结果保存与数据导出生成带标注的检测结果图便于后续用Excel打开分析记录每枚硬币的详细数据实训步骤第七步:结果保存与数据导出静态图像硬币计数系统第七步:结果保存与数据导出实训步骤运行结果需要注意:在实际应用场景中对参数的调整是至关重要的,这点我们将在第8章中深入讨论。如图7-8所示,可以看出参数设置比较契合该场景图7-8硬币统计结果结果与分析1.打开程序代码所在文件夹,会看到两个新文件:coins_result.jpg:带标记的结果图coins_count.csv:每枚硬币的序号、面积、识别时间图7-10生成的详细统计数据表2.可用Excel
打开.csv格式文件,查看详细数据,用于后续统计或报告,如图7-10所示本章小节图像分割本章聚焦图像分割基础,核心解决“从像素级区分图像中不同区域”的问题,重点覆盖三类实用方法:阈值分割、轮廓分割、分水岭算法。阈值分割适合“前景与背景有灰度差异”的场景——全局阈值适配光照均匀、差异明显的图像,Otsu自动阈值能自动计算最优阈值,适配灰度差异小、光照不均的图像,两者均需先去噪(高斯滤波)才能保证效果。轮廓分割则依托“边缘→轮廓→填充”的流程,适合“物体边缘清晰、无重叠”的场景,如单个苹果、多个棋子,核心是用cv2.findContours()提取轮廓后,通过cv2.drawContours()填充内部实现区域分割。图像分割分水岭算法是针对“重叠物体”的补充方案,通过“预处理→确定前景/背景/不确定区域→创建标记→注水分割”的流程,用蓝色/红色边界分开重叠物体,如重叠硬币、药片,关键是通过距离变换确定前景中心、膨胀操作确定背景。图像分割总结以
预处理为前提、场景适配为核心强化了“去噪→分割→结果可视化”的固定流程为后续复杂分割,打下“像素级区域区分”的基础课后习题一、选择题课后习题1.以下哪种图像最适合用全局阈值分割?(
)A.光照不均的灰色背景米粒图B.黑色背景上的白色棋子图C.重叠的硬币图D.灰度差异小的医学影像图一、选择题课后习题2.Otsu自动阈值分割的核心优势是(
)A.无需手动调整阈值,自动计算最优阈值B.适合处理重叠物体C.不需要预处理,直接对原图分割D.分割速度比全局阈值快一、选择题课后习题3.轮廓填充实现区域分割时,cv2.drawContours()的“线宽”参数应设为(
)A.1(细线)B.2(粗线)C.-1(填充内部)D.0(无线)一、选择题课后习题4.分水岭算法中,“不确定区域”是指(
)A.确定的前景区域B.确定的背景区域C.背景与前景之间的边界区域D.噪声区域一、选择题课后习题5.以下哪种操作不是分水岭算法的必要预处理步骤?(
)A.高斯滤波去噪B.阈值分割得到二值图C.形态学开运算D.轮廓提取二、填空题课后习题1.阈值分割中,cv2.THRESH_BINARY_INV的作用是:灰度值大于阈值时设为__________,小于等于阈值时设为__________,适合“前景暗、背景亮”的图像。2.轮廓分割的核心流程是:→→轮廓填充→分割区域提取。3.分水岭算法中,确定前景时常用__________变换(计算像素到最近背景的距离),确定背景时常用__________操作(扩大背景区域)。4.cv2.watershed()函数处理后,图像中__________区域的标记值会被设为-1,通常用红色或蓝色标注该区域,用于区分不同物体。三、操作题课后习题1.编写代码,实现“基于轮廓分割的手写数字提取”读取“handwritten_digits.jpg”(白底黑字,数字0-9);预处理:灰度化→高斯滤波(3×3)→二值化(反色,数字为白色);提取每个数字的最外层轮廓,过滤面积小于100的噪声用不同颜色的矩形框标记每个数字,标注序号(0-9);保存分割结果为“digits_segmented.jpg”,打印数字总数。三、操作题课后习题2.编写代码,实现“分水岭分割重叠坚果”读取“nuts_overlapped.jpg”(灰色背景,重叠坚果);按分水岭流程处理:灰度化→高斯滤波(5×5)→Otsu阈值分割(反色)→开运算(3×3核,1次)→确定前景(距离变换+0.6×
最大距离)→确定背景(膨胀3次)→创建标记→分水岭分割;用绿色边界标记每个坚果,标注坚果数量;显示“原图→二值图→前景图→分割结果图”,保存结果为“nuts_watershed.jpg”。三、操作题课后习题3.硬币计数系统多场景测试(基于课后实验二)素材获取:从教师(素材库)处获取coins_1.jpg~coins_5.jpg,保存到“CV_Project”文件夹,也可以自备;代码修改:每次运行前,将image_path中的图片名从coins_1.jpg改成coins_2.jpg,依次类推;三、操作题课后习题3.硬币计数系统多场景测试(基于课后实验二)结果记录:每运行一次,记录“代码输出数量”和“实际数量”,填入下表:图片名代码输出数量实际数量是否正确(√/×)coins_1.jpg
coins_2.jpg
coins_3.jpg
coins_4.jpg
coins_5.jpg
三、操作题课后习题3.硬币计数系统多场景测试(基于课后实验二)计算准确率:准确率=正确次数/5×100%,如4次正确,则准确率
为80%;提交文件:将“结果图片(5张)、Excel数据(5个)、实验报告”打包发给教师。能力进阶:利用AI大模型的知识问答能力,尝试在不同场景中调整参数,从而优化针对特定场景的“数硬币”的准确率。第8章
计算机视觉项目实战计算机视觉应用开发案例教程目录CONTENT8.1实战项目1:基于分水岭算法的重叠药片计数系统018.2实战项目2:基于YOLO模型的实时物件检测系统02本章小结03课后习题04引言图像预处理阈值分割轮廓检测基于分水岭算法的重叠药片计数系统
整合技术,使读者建立积累对计算机视觉的完整项目的整体框架开发经验。本章将通过两个综合项目:基于YOLO模型的实时物件检测系统引言工作情境当下AI赋能实体经济的趋势里,“技术落地”是核心
工作情境制药厂的
“重叠药片计数系统”安防场景的“实时物件检测系统”“工业场景里怎么标定参数”“遇到异常情况怎么处理”不管你是想积累项目经验,还是为实际工作做准备,这些实战都能帮你明白:“技术落地”不复杂,关键是把学过的本领用对地方,解决真正的需求。工作情境8.1实战项目1:基于分水岭算法的重叠药片计数系统
项目目标8.1.1项目目标3.绘制分割边界,统计药片数量。2.实现重叠药片的有效分割,区分每个药片;1.熟练掌握分水岭算法的完整流程:预处理→前景背景确定→标记→分割;项目准备8.1.2准备一张
“白色背景上的重叠药片”图像,如素材库中为读者准备的“pills_overlapped.jpg”项目准备素材方面核心技术形态学开运算、距离变换、分水岭算法、轮廓提取。项目实施8.1.3项目步骤步骤1:明确实验流程文本预处理的核心是“突出文字,消除背景噪声”,流程如下:读取图像灰度化去噪阈值分割开运算确定前景背景标记分水岭分割绘制边界计数导入两个必要的库OpenCV核心库处理数值数组步骤2:编写实训代码第一步:读取图像+灰度化读彩色图怕图片路径错了读不出来,能及时提示“读取失败”,工业场景里这种容错很重要。为什么转灰度?因为彩色图有3个通道(BGR),灰度图只有1个通道,能减少计算量,还能避免颜色干扰。步骤2:编写实训代码第二步:预处理优化(去噪+对比度增强)控制对比度强度,1.2属于“温和增强”,避免把噪声也放大把图像分成12x12的小区域处理把增强效果应用到灰度图上滤波核大小颜色相似度阈值空间相似度阈值步骤2:编写实训代码第三步:阈值分割用高斯加权的局部阈值,比全局阈值更适应光照变化“反二值化”,让药片变成白色、背景变成黑色步骤2:编写实训代码第四步:形态学操作小核处理细节腐蚀掉小噪声点把药片轮廓恢复回来步骤2:编写实训代码第四步:形态学操作因为这个区域可能有小碎片容易被误分割,这样处理能强化边界,避免把一个药片分成两个。步骤2:编写实训代码第五步:确定前景、背景与未知区域用3次膨胀让背景“包围所有药片”,确保没有遗漏把“药片区域”转成“离边缘越远值越大的图”过滤面积小于120的小噪声背景减去前景,这部分是后续分水岭要分割的“重叠区”步骤2:编写实训代码第六步:创建标记+应用分水岭把每个前景中心标成不同的数字把背景从“0”改成“1”告诉算法“这里是要分割的不确定区”算法会根据标记分割未知区域步骤2:编写实训代码第七步:计数+结果保存步骤2:编写实训代码第七步:计数+结果保存步骤2:编写实训代码步骤3:运行与验证项目步骤验证结果调整参数保存结果若分割不完整,调整距离变换的阈值系数(如0.5→0.7),或修改膨胀/开运算的迭代次数;分水岭结果图中,重叠药片被红色边界分开,每个药片为独立区域,计数与实际药片数一致;确认生成“pills_watershed_result.jpg”,红色边界清晰,计数文字明确。项目结果8.1.4分水岭关键前景需用“距离变换+阈值”获取“确定的物体中心”,避免前景包含重叠区域;背景需膨胀到包围所有物体,确保无遗漏;运行结果如图8-1所示,分水岭结果图中重叠药片被红色边界分开,顶部蓝色文字显示药片计数,标注“分割完整,无重叠误判”。实训结果与分析图8-1重叠药片分水岭分割结果图分析与调参8.1.5运行结果与解析图8-2参数调整过程代码中的可调参代码解析对比度增强:clahe=cv2.createCLAHE(clipLimit=1.2,tileGridSize=(12,12))clipLimit:对比度增强强度(值越小越温和,避免放大噪声)tileGridSize:局部区域大小(值越大,处理越平滑)代码中的可调参代码解析去噪参数:img_median=cv2.medianBlur(img_clahe,7)核大小(7):值越大去噪越强,但可能模糊边缘代码中的可调参代码解析双边滤波:cv2.bilateralFilter(img_median,9,70,70)第二个参数(9):滤波核大小后两个参数(70,70):颜色/空间相似度阈值(值越大,模糊范围越广)代码中的可调参代码解析自适应阈值:cv2.adaptiveThreshold(...,25,10)块大小(25):值越大,对局部光照变化越不敏感常数(10):值越大,越容易将暗区域判为背景代码中的可调参代码解析形态学核与迭代:kernel_medium=np.ones((9,9),np.uint8)核大小(9,9):值越大,合并碎片能力越强cv2.morphologyEx(...,iterations=2)迭代次数(2):值越大,形态学效果越强代码中的可调参代码解析左上角区域范围:top_left_roi=img_close[0:int(h/3),0:int(w/3)]区域比例(h/3,w/3):调整为实际药片所在区域代码中的可调参代码解析前景提取阈值:cv2.threshold(img_dist,0.35*img_dist.max(),...)比例(0.35):值越大,筛选出的前景中心越少(过滤小区域)代码中的可调参代码解析前景面积过滤:min_area=120最小面积(120):值越大,过滤的小噪声越多代码中的可调参代码解析计数面积范围:if250<marker_area<1500下限(250):过滤过小碎片上限(1500):过滤过大异常区域调参过程那么麻烦在现实的工业场景中我们是怎么做到把药片“数”的那么准确的呢?药厂的流水线上快速通过的传送带上的药片是怎么被准确无误的数出来的呢?工业场景落地8.1.6硬件标准化参数定制化标定分水岭算法(或其他机器视觉算法)在工业中能落地,本质是靠“硬件先标准化所有干扰因素”,让算法面对的图像“长得几乎一样”,从而只需要一套固定参数就能稳定工作。硬件端:彻底固定拍摄条件,消除变量。核心逻辑算法端:针对固定场景做“一次性参数标定”。工业场景落地的核心逻辑:先“控制变量”,再“定制参数”异常处理:加“兜底机制”,不依赖单一算法。工业场景落地工业计数不会像实验室那样“随手拍图”,而是用专用的视觉检测工位,把所有影响图像的因素锁死:彻底固定拍摄条件,消除变量。硬件端用定制光源,比如环形光源、背光光源,确保药片表面亮度均匀,没有阴影;光照相机位置如距离、角度等完全固定,比如正上方垂直拍摄,镜头焦距锁定,确保每颗药片在图像中的大小、比例一致;拍摄工业场景落地工业计数不会像实验室那样“随手拍图”,而是用专用的视觉检测工位,把所有影响图像的因素锁死:彻底固定拍摄条件,消除变量。硬件端用纯色高对比度背景,比如黑色背景拍白色药片,避免背景干扰,让药片边缘更清晰;背景药片通过传送带或振动盘“整理姿态”,尽量避免严重重叠,如果必须处理重叠,会搭配机械结构辅助分离,比如轻震传送带。姿态工业场景落地当硬件条件固定后,算法只需要做一次“参数标定”,后续所有同场景的图像都用这套参数:针对固定场景做“一次性参数标定”。算法端先拍几十/几百张该场景下的标准图像,包含正常药片、少量重叠、可能的轻微杂质,手动标注正确计数;步骤工业场景落地当硬件条件固定后,算法只需要做一次“参数标定”,后续所有同场景的图像都用这套参数:针对固定场景做“一次性参数标定”。算法端用标注好的样本,自动或手动调整算法参数,比如阈值、滤波核大小、面积范围,找到能覆盖99.9%以上正常情况的“最优参数组合”;优化参数确定后写入程序,后续所有进入该工位的图像,都直接用这套参数处理,不需要任何人工干预。固定工业场景落地工业场景不会只靠分水岭算法,会搭配其他逻辑确保稳定性:加“兜底机制”,不依赖单一算法。异常处理根据药片实际尺寸,设定“最小-最大面积范围”,比如实际药片直径5mm,对应图像中面积100-200像素,超出这个范围的直接排除,避免杂质或碎片干扰;面积过滤结合轮廓分析,比如药片是圆形,用圆度阈值过滤非圆形的干扰;形状校验工业场景落地工业场景不会只靠分水岭算法,会搭配其他逻辑确保稳定性:加“兜底机制”,不依赖单一算法。异常处理如果某张图的计数超出正常范围,比如正常是每帧50±2颗,突然出现30颗或70颗,会触发报警,让人工复核,而不是直接输出错误结果。异常报警固定场景定制参数小结核心落地逻辑药企的
“药片瓶装计数”工位传送带速度固定、光源固定、相机角度固定,针对某一种药片,比如某规格的圆形药片,提前标定好参数,后续每天生产几万瓶,都是用同一套算法参数计数;电子厂的
“芯片计数”“电阻计数”原理完全一样——先靠硬件锁死拍摄条件,再用一套固定参数处理,准确率能稳定在99.95%以上,工业场景对准确率要求极高,通常允许的误判率低于0.1%。小结工业机器视觉的
“算法能力”,很大程度上是靠
“硬件标准化”
撑起来的。如果硬件条件混乱,如光照忽明忽暗、拍摄角度随便变,再厉害的算法也需要频繁调参数,根本无法落地;但只要硬件先“控住变量”,哪怕是分水岭这种需要参数调优的算法,也能稳定工作。8.2实战项目2:基于YOLO模型的实时物件检测系统YOLO模型简介YOLO(YouOnlyLookOnce)是一种基于深度学习的实时目标检测算法,由JosephRedmon等人于2016年提出,其核心优势是兼顾检测速度与精度,非常适合实时场景,如摄像头实时识别。YOLO模型简介与传统的两阶段检测算法(先生成候选区域再分类)不同,YOLO将目标检测视为单一的回归问题,通过一次神经网络计算即可同时预测图像中所有目标的边界框和类别概率,因此检测速度极快,基础版本可达到45帧/秒。YOLO系列YOLOv8版本YOLOv3YOLOv3通过多尺度特征检测(利用不同尺寸的特征图识别大小目标)和残差网络结构(提升特征提取能力),在保证速度的同时显著提升了检测精度,支持80种常见物体,如人、汽车、手机、杯子等的识别。YOLOv3机器人视觉自动驾驶实时监控项目目标8.2.1项目目标调用电脑摄像头采集实时视频流,实现对画面中常见物体,如人、手机、杯子等的实时检测;1.用绿色边框标记检测到的物体,在边框旁显示中文类别名称及置信度,如“手机92%”;2.画面左上角显示实时检测时间(毫秒级),便于评估性能;3.支持按任意键退出程序,并自动保存最后一帧的检测结果(含标记信息)到本地文件夹。4.项目实施8.2.2步骤1:创建文件夹新建文件准备以下文件并放入该文件夹中文字体文件:STSONG.TTF,用于正常显示中文标签,可从系统字体文件夹中复制,路径通常为“C:\Windows\Fonts”。类别名称文件:object_names.txt,包含80种物体的中文名称,每行一个,如“人”“汽车”“手机”等;预训练模型文件:yolov3.cfg(模型配置文件)、yolov3.weights(模型权重文件,可从YOLO官网或素材库获取);步骤1:创建文件夹新建文件安装在PyCharm/VSCode的“Terminal”中粘贴以下命令,按Enter安装,若已安装可跳过此步骤:步骤2:安装Python库pipinstallopencv-pythonnumpypillow若安装缓慢,可添加国内镜像源:pipinstallopencv-pythonnumpypillow-isimple完整代码步骤3导入4个必要的库OpenCV核心库处理数值数组解决中文显示计算检测耗时完整代码第一步:加载中文字体+物体类别指定字体文件路径设置字号20读取物体类别去掉每行的换行符,整理成列表如果找不到文件,会提示错误并退出完整代码第二步:加载YOLOv3预训练模型加载模型try-except容错配置文件:定义模型结构权重文件:模型训练好的“经验参数”完整代码创建设摄像头捕捉器,0代表电脑默认摄像头,外接摄像头就改成1检查摄像头是否可用用来存储最后一帧画面,方便退出时保存;打印提示第三步:初始化摄像头+设置变量完整代码第四步:实时检测主循环完整代码第四步:实时检测主循环完整代码第五步:筛选有效目标+消除重复边框完整代码第五步:筛选有效目标+消除重复边框完整代码第六步:绘制边框+中文标签+显示保存完整代码第六步:绘制边框+中文标签+显示保存完整代码第六步:绘制边框+中文标签+显示保存完整代码第七步:释放资源+保存最后一帧生成时间戳关闭摄像头关闭所有显示窗口保存最后一帧完整代码操作说明8.2.3文件路径配置确保yolov3.cfg、y
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 长沙市雨花区2025届数学三年级第一学期期中预测试题(含答案)
- 肿瘤科护理工作计划
- 2026年浙江宁波镇海区社区专职工作者招聘【结构化面试题库+高分答题模板】(含考官评分要点)
- (2026版)医院收费员个人工作总结
- 长岛县2025-2026学年数学三年级下学期期中监测试题(含答案解析)
- (2026版)多学科会诊制度
- 2025-2026学年上海市黄浦区比乐中学高一(上)期中数学试卷(含解析)
- 食品饮料行业深度报告:以周期迭代视角看茶饮崛起与突围
- 无人基础及应用 14
- 某医药厂生产过程控制准则
- 2026年四川省成都市天府新区数学八上期末学业质量监测模拟试题含解析
- 2026年中国邮政集团有限公司吉林省分公司纪检干部社会招聘1人笔试历年典型考点题库附带答案详解
- 昆山啤酒节策划方案
- 国家卫生健康委员会中国结直肠癌诊疗规范(2025版)
- (2026年)围手术期血压管理课件
- 国企工程管理岗笔试试题及答案
- 诊所医学检验科工作制度
- 心房颤动诊断和治疗中国指南
- 2025年香港苏浙公学笔试面试及答案
- 安全工程师岗位面试问题及答案
- 云资源采购管理制度
评论
0/150
提交评论