计算机基础项目实战6_第1页
计算机基础项目实战6_第2页
计算机基础项目实战6_第3页
计算机基础项目实战6_第4页
计算机基础项目实战6_第5页
已阅读5页,还剩93页未读 继续免费阅读

下载本文档

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

文档简介

计算机视觉项目开发实战

(微课版)项目四车牌识别—形态学处理与轮廓检测思维导图学习目标概览能够使用OpenCV库实现图像的全局阈值处理和自适应阈值处理知识目标学习目标素养目标技能目标培养交通安全意识培养社会责任感培养法治精神能够运用形态学变换对图像进行去噪、分割等预处理操作,优化图像质量能够使用Sobel、Laplacian、Canny等边缘检测算法提取图像的边缘信息理解图像阈值处理的核心思想,掌握不同阈值处理方法的适用场景及优缺点掌握形态学变换的核心思想,掌握不同形态学操作的作用掌握查找、绘制图像轮廓及分析轮廓特征的基本方法理解边缘检测算法的原理,熟悉不同边缘检测算法的特点及应用场景能够查找、绘制图像的轮廓,并分析轮廓特征目录项目导入知识准备项目拓展项目实施项目巩固4.1阈值处理4.2形态学变换4.3图像轮廓4.4边缘检测PART01项目导入项目导入在智慧交通系统中,车牌作为车辆的“数字身份证”,其精准识别与合规使用已成为城市治理现代化的重要支撑。从技术实现路径看,车牌识别经历了从依赖阈值、形态学等的传统数字图像处理,到基于深度学习的端到端智能识别的技术演进。秉持技术向善的理念,明确技术应用的边界PART02知识准备知识准备—阈值处理4.1.1全局阈值处理全局阈值处理是指为整幅图像选取一个固定的数值T作为阈值,所有像素都依据此统一标准进行分类。OpenCV提供了cv2.threshold()函数来进行全局阈值处理。其语法格式如下:其中各参数含义如下。src:输入图像(通常为灰度图像),支持CV_8U、CV_32F等数据类型。thresh:设定的阈值。maxval:当像素值超过(或低于)阈值时,需要赋予的新值,仅用于THRESH_BINARY和THRESH_BINARY_INV类型。retval:返回值,如果非自动获取阈值,最后的retval和设定的thresh相等,而如果是自动获取阈值,返回的是使用自动获取阈值算法得到的阈值。dst:输出图像,与输入图像具有相同的尺寸、类型和通道数。retval,dst=cv2.threshold(src,thresh,maxval,type[,dst])知识准备—阈值处理4.1.1全局阈值处理type:阈值处理类型。常见阈值处理类型如表4-1所示。知识准备—阈值处理4.1.1全局阈值处理—案例

【例4-1】读取一幅图像,并将其转换为单通道灰度图像。然后利用cv2.threshold()函数,针对固定阈值(127)演示5种基础阈值处理类型的处理效果。同时,将OTSU和TRIANGLE分别与THRESH_BINARY及THRESH_BINARY_INV规则组合,展示自动阈值分割的效果,并进行可视化。根据题目要求,编写程序的关键代码如下:源代码地址文件

ex4-1.py见教材配套代码,路径如下:src/proj04/ex4-1.py知识准备—阈值处理4.1.1全局阈值处理—案例运行本例的代码,结果如图4-1所示。图4-1例4-1代码运行结果知识准备—阈值处理4.1.2自适应阈值处理自适应阈值处理是解决图像光照不均问题的重要技术,它通过动态调整图像不同区域的阈值,使每个局部区域的二值化更符合该区域的灰度分布。OpenCV提供了cv2.adaptiveThreshold()函数来实现自适应阈值处理。其语法格式如下:其中各参数含义如下。src:输入图像,必须是8位单通道的灰度图像。maxValue:满足条件的像素被赋予的非零值,通常为255。thresholdType:阈值处理类型。必须是THRESH_BINARY或THRESH_BINARY_INV。blockSize:用于计算像素阈值的邻域像素尺寸,值通常为3、5、7等,必须是正奇数。C:从算术平均值或加权平均值中减去的常数,通常为正值,但也可以为零或负值。dst:输出图像,与输入图像具有相同尺寸和类型。dst=cv2.adaptiveThreshold(src,maxValue,adaptiveMethod,thresholdType,blockSize,C[,dst])知识准备—阈值处理4.1.2自适应阈值处理adaptiveMethod:使用的自适应阈值算法。常见自适应阈值处理算法如表4-2所示。知识准备—阈值处理4.1.2自适应阈值处理—案例

【例4-2】读取一幅图像,并将图像转换为单通道灰度图像,然后利用cv2.adaptiveThreshold()函数,对比全局阈值处理(OTSU)和两种自适应阈值处理方法的效果。根据题目要求,编写程序的关键代码如下:源代码地址文件

ex4-2.py见教材配套代码,路径如下:src/proj04/ex4-2.py知识准备—阈值处理4.1.2自适应阈值处理—案例运行本例的代码,结果如图4-2所示。图4-2例4-2代码运行结果知识准备—形态学变换形态学变换是一种基于目标形状进行处理的图像分析技术。其核心思想是使用一个被称为结构元素(或核)的预定义模板,在图像上系统性地移动并进行逻辑运算(如基础的腐蚀、膨胀),从而精细地调整、分析或提取图像中目标的形态特征,如大小、轮廓和连通性。形态学变换主要应用于二值图像(常由阈值处理得到),用于后续的去噪、连接断点、分离物体、提取边界及形状骨架等,也可推广至灰度图像处理。结构元素是实现所有形态学变换操作的关键。它本质上是一个由0和1(代表不参与和参与计算)构成的小型二维矩阵,其形状(如矩形、十字形、椭圆形)和大小决定了运算的效果。知识准备—形态学变换OpenCV提供了cv2.getStructuringElement()函数来快速生成标准化的结构元素。其语法格式如下:其中各参数含义如下。ksize:以元组形式(width,height)表示的结构元素尺寸,必须为正奇数,确保结构元素有唯一的中心像素(锚点默认在中心),避免对称偏移。anchor:结构元素内的锚点位置。默认值(-1,-1)表示锚点位于中心,为可选项。请注意,只有十字形结构元素的形状会受锚点位置影响,在其他情况下锚点仅调节形态学操作结果的偏移量。retval:返回值,是一个numpy.ndarray类型的二维数组。retval=cv2.getStructuringElement(shape,ksize[,anchor])知识准备—形态学变换shape:结构元素的形状。结构元素的常见形状如表4-3所示。知识准备—形态学变换4.2.1腐蚀腐蚀的本质是用“结构元素”(又称“核”)作为“工具”,对图像中的前景区域进行“收缩”处理。OpenCV提供了cv2.erode()函数来对图像进行腐蚀处理。其语法格式如下:其中各参数含义如下。src:输入图像,通道数可以是任意的。kernel:用于进行腐蚀操作的结构元素。anchor:结构元素内的锚点位置;默认值(-1,-1)表示锚点位于结构元素中心。iterations:进行腐蚀操作的次数。次数越多,腐蚀效果越明显。borderType:边界类型,像素外推方法。borderValue:使用常量边界时的边界值。dst:输出图像,与输入图像具有相同尺寸和类型。dst=cv2.erode(src,kernel[,dst[,anchor[,iterations[,borderType[,borderValue]]]]])知识准备—形态学变换4.2.1腐蚀—案例

【例4-3】使用OpenCV的cv2.erode()函数实现腐蚀操作。根据题目要求,编写程序的关键代码如下:源代码地址文件

ex4-3.py见教材配套代码,路径如下:src/proj04/ex4-3.py知识准备—形态学变换4.2.1腐蚀—案例

【例4-3】使用OpenCV的cv2.erode()函数实现腐蚀操作。运行本例的代码,结果如图4-3所示。图4-3例4-3代码运行结果知识准备—形态学变换4.2.2膨胀膨胀是与腐蚀操作相对的基础形态学变换,是用“结构元素”(核)作为“工具”,对图像中的前景区域进行“扩张”处理。OpenCV提供了cv2.dilate()函数来对图像进行膨胀处理。其语法格式如下:其中各参数含义与cv2.erode()函数一致。dst=cv2.dilate(src,kernel[,dst[,anchor[,iterations[,borderType[,borderValue]]]]])知识准备—形态学变换4.2.2膨胀—案例

【例4-4】使用OpenCV的cv2.dilate()函数实现膨胀操作。根据题目要求,编写程序的关键代码如下:源代码地址文件

ex4-4.py见教材配套代码,路径如下:src/proj04/ex4-4.py知识准备—形态学变换4.2.2膨胀—案例

【例4-4】使用OpenCV的cv2.erode()函数实现腐蚀操作。运行本例的代码,结果如图4-4所示。图4-4例4-4代码运行结果知识准备—形态学变换4.2.3高级形态学操作高级形态学操作是基于腐蚀和膨胀的复合操作,通过组合这两种基础操作,可实现更复杂的形态调整,如去噪、补洞、边缘提取等。OpenCV提供了cv2.morphologyEx()函数来进行高级形态学操作。其语法格式如下:其中各参数含义如下。src:输入图像。对于二值或灰度形态学操作,通常为单通道图像。kernel:用于进行形态学操作的结构元素。anchor:结构元素内的锚点位置。默认值为(-1,-1),表示锚点位于结构元素中心。iterations:迭代次数。腐蚀和膨胀操作的次数。borderType:边界类型,像素外推方法。borderValue:使用常量边界时的边界值。dst:输出图像,与输入图像具有相同的大小和类型。dst=cv2.morphologyEx(src,op,kernel[,dst[,anchor[,iterations[,borderType[,borderValue]]]]])知识准备—形态学变换4.2.3高级形态学操作op:形态学操作的类型。常见形态学操作类型如表4-4所示。知识准备—形态学变换4.2.3高级形态学操作—案例

【例4-5】使用OpenCV的cv2.morphologyEx()函数实现各种高级形态学操作并对比效果。根据题目要求,编写程序的关键代码如下:源代码地址文件

ex4-5.py见教材配套代码,路径如下:src/proj04/ex4-5.py知识准备—形态学变换4.2.3高级形态学操作—案例

【例4-5】使用OpenCV的cv2.morphologyEx()函数实现各种高级形态学操作并对比效果。运行本例的代码,结果如图4-5至图4-9所示。图4-5例4-5代码中开运算结果(a)源图像

(b)3×3矩形核处理

(c)5×5椭圆核处理

(d)5×5十字形核处理知识准备—形态学变换4.2.3高级形态学操作—案例

【例4-5】使用OpenCV的cv2.morphologyEx()函数实现各种高级形态学操作并对比效果。运行本例的代码,结果如图4-5至图4-9所示。图4-6例4-5代码中闭运算结果(a)源图像

(b)3×3矩形核处理

(c)5×5椭圆核处理

(d)5×5十字形核处理知识准备—形态学变换4.2.3高级形态学操作—案例

【例4-5】使用OpenCV的cv2.morphologyEx()函数实现各种高级形态学操作并对比效果。运行本例的代码,结果如图4-5至图4-9所示。图4-7例4-5代码中梯度运算结果(a)源图像

(b)3×3矩形核处理

(c)5×5椭圆核处理

(d)5×5十字形核处理知识准备—形态学变换4.2.3高级形态学操作—案例

【例4-5】使用OpenCV的cv2.morphologyEx()函数实现各种高级形态学操作并对比效果。运行本例的代码,结果如图4-5至图4-9所示。图4-8例4-5代码中顶帽运算结果(a)源图像

(b)3×3矩形核处理

(c)5×5椭圆核处理

(d)5×5十字形核处理知识准备—形态学变换4.2.3高级形态学操作—案例

【例4-5】使用OpenCV的cv2.morphologyEx()函数实现各种高级形态学操作并对比效果。运行本例的代码,结果如图4-5至图4-9所示。图4-9例4-5代码中黑帽运算结果(a)源图像

(b)3×3矩形核处理

(c)5×5椭圆核处理

(d)5×5十字形核处理知识准备—形态学变换4.2.3高级形态学操作知识准备—图像轮廓4.3.1查找轮廓在计算机视觉和图像处理中,图像轮廓通常指一条由一系列点连接而成的曲线,用于勾画图像中目标物体的外形。OpenCV提供了cv2.findContours()函数来查找轮廓。其语法格式如下:其中各参数含义如下。image:8位单通道图像,通常为二值图像。contours:返回的轮廓信息,是构成每个轮廓的一系列坐标点集合。hierarchy:返回的轮廓层级信息。contours,hierarchy=cv2.findContours(image,mode,method[,contours[,hierarchy[,offset]]])知识准备—图像轮廓4.3.1查找轮廓mode:轮廓检索模式。常见轮廓检索模式如表4-6所示。知识准备—图像轮廓4.3.1查找轮廓method:轮廓逼近方法。常见轮廓逼近方法如表4-7所示。知识准备—图像轮廓4.3.1查找轮廓—案例

【例4-6】使用OpenCV的cv2.findContours()函数查找图像的所有轮廓。根据题目要求,编写程序的关键代码如下:源代码地址文件

ex4-6.py见教材配套代码,路径如下:src/proj04/ex4-6.py知识准备—图像轮廓4.3.1查找轮廓—案例

【例4-6】使用OpenCV的cv2.findContours()函数查找图像的所有轮廓。运行本例的代码,输出如下结果:知识准备—图像轮廓4.3.2绘制轮廓在图像中查找到轮廓后,可以按要求绘制轮廓。OpenCV提供了cv2.drawContours()函数来绘制轮廓。其语法格式如下:其中各参数含义如下。image:绘制轮廓的目标图像。contours:所有输入图像的轮廓。每个轮廓存储为一个点向量。contourIdx:指定要绘制的轮廓索引。如果为负值,则绘制所有轮廓。color:绘制轮廓所用的颜色。thickness:绘制轮廓的线条粗细。如果为负值,则绘制轮廓内部填充区域。hierarchy:轮廓的层级信息,可选项。maxLevel:绘制轮廓的最大层级。offset:轮廓偏移参数,可选项。将绘制的所有轮廓按指定的偏移量进行平移。image=cv2.drawContours(image,contours,contourIdx,color[,thickness[,lineType[,hierarchy[,maxLevel[,offset]]]]])知识准备—图像轮廓4.3.2绘制轮廓—案例

【例4-7】使用OpenCV的cv2.drawContours()函数绘制图像所有轮廓。根据题目要求,编写程序的关键代码如下:源代码地址文件

ex4-7.py见教材配套代码,路径如下:src/proj04/ex4-7.py知识准备—图像轮廓4.3.2绘制轮廓—案例

【例4-7】使用OpenCV的cv2.drawContours()函数绘制图像所有轮廓。运行上述代码,结果如图4-10所示。图4-10例4-7代码运行结果知识准备—图像轮廓4.3.3轮廓特征在图像处理和计算机视觉中,矩特征是描述物体形状、大小、位置及分布特性的重要数学工具。它通过对图像像素的灰度值进行加权求和,构建一系列矩量,从而量化物体的几何属性。

矩特征具有可平移、可旋转、尺度不变性等特性,广泛用于形状识别、目标分类、姿态估计等任务。根据计算方式和用途,矩可分为原始矩(RawMoment)、中心矩(CentralMoment)、归一化中心矩(NormalizedCentralMoment)等,不同矩描述的特征不同。几何特征——利用矩特征计算轮廓面积、重心知识准备—图像轮廓4.3.3轮廓特征(1)原始矩几何特征——利用矩特征计算轮廓面积、重心原始矩是直接基于像素坐标计算得到的矩,主要描述物体的位置和大小。其中:零阶矩m00:等于目标的像素数量,即面积;对于灰度图像,是目标区域的灰度值总和。一阶矩m10、m01

:结合零阶矩可计算重心坐标,公式如下。,知识准备—图像轮廓4.3.3轮廓特征(2)中心矩几何特征——利用矩特征计算轮廓面积、重心中心矩是以重心为原点计算得到的矩,描述物体的形状分布范围,可用于计算物体的主轴方向、宽高比等,消除平移对特征的影响。其中:μ20:沿x轴的分布惯性(目标在x轴方向的拉伸程度)。μ02:沿y轴的分布惯性(目标在y轴方向的拉伸程度)。μ11:描述x轴和y轴方向的相关性(目标的倾斜程度)。,知识准备—图像轮廓4.3.3轮廓特征(3)归一化中心矩几何特征——利用矩特征计算轮廓面积、重心归一化中心矩通过除以零阶矩的幂次消除尺度影响,具有可平移、可旋转、尺度不变性等特性,是形状匹配的核心特征。,知识准备—图像轮廓4.3.3轮廓特征OpenCV提供了cv2.moments()函数,可直接计算轮廓的原始矩、中心矩等,并返回一个包含多类矩特征的字典。其语法格式如下:几何特征——利用矩特征计算轮廓面积、重心retval=cv2.moments(array[,binaryImage])其中各参数含义如下。array:单通道栅格图像或由二维点(Point或Point2f)组成的数组。binaryImage:如果设置为True,所有非零图像像素都会被当作1处理。retval:返回值,一个包含24个图像矩的字典。知识准备—图像轮廓4.3.3轮廓特征—案例几何特征——利用矩特征计算轮廓面积、重心

【例4-8】使用OpenCV的cv2.moments()函数获取轮廓矩特征并计算轮廓面积、重心。根据题目要求,编写程序的关键代码如下:源代码地址文件

ex4-8.py见教材配套代码,路径如下:src/proj04/ex4-8.py知识准备—图像轮廓4.3.3轮廓特征—案例几何特征——利用矩特征计算轮廓面积、重心

【例4-8】使用OpenCV的cv2.moments()函数获取轮廓矩特征并计算轮廓面积、重心。运行上述代码,结果如图4-11所示。同时,输出矩特征的值,通过对比和观察可以加深理解。图4-11例4-8代码运行结果知识准备—图像轮廓4.3.3轮廓特征OpenCV提供cv2.contourArea()函数用于计算轮廓面积。其语法格式如下:几何特征——利用函数计算轮廓面积、周长retval=cv2.contourArea(contour[,oriented])其中各参数含义如下。contour:轮廓顶点坐标的集合,可以是点向量或矩阵形式。oriented:有符号面积标志。如果设置为True,函数将返回一个有符号的面积值,面积值的正负取决于轮廓的方向。默认情况下,该参数设置为False,表示返回绝对值。retval:double类型的面积值。知识准备—图像轮廓4.3.3轮廓特征OpenCV提供cv2.arcLength()函数用于计算轮廓周长。其语法格式如下:几何特征——利用函数计算轮廓面积、周长retval=cv2.arcLength(curve,closed)其中各参数含义如下。curve:曲线点坐标的集合,可以是点向量或矩阵形式。closed:布尔标志,表示曲线是否形成闭合形状。retval:轮廓或曲线的长度,浮点型。知识准备—图像轮廓4.3.3轮廓特征—案例几何特征——利用函数计算轮廓面积、周长

【例4-9】使用OpenCV的cv2.contourArea()函数和cv2.arcLength()函数计算轮廓面积和周长。根据题目要求,编写代码如下:源代码地址文件

ex4-9.py见教材配套代码,路径如下:src/proj04/ex4-9.py知识准备—图像轮廓4.3.3轮廓特征—案例几何特征——利用函数计算轮廓面积、周长

【例4-9】使用OpenCV的cv2.contourArea()函数和cv2.arcLength()函数计算轮廓面积和周长。运行本例的代码,结果如图4-12所示。同时,输出通过函数计算得到的轮廓面积和周长,可以对比和观察轮廓面积与例4-8中通过矩特征得到的面积是否相等。图4-12例4-9代码运行结果知识准备—图像轮廓4.3.3轮廓特征(1)外接矩形(BoundingRectangle)外接矩形主要应用于物体检测、ROI指定、碰撞检测,计算简单快速。求外接矩形的函数语法格式如下:几何特征——外接矩形、最小外接矩形、最小外接圆、拟合椭圆retval=cv2.boundingRect(array)其中各参数含义如下。array:轮廓数组(由cv2.findContours返回的单个轮廓,形状为(n,1,2)的numpy数组,n为轮廓点数量)。retval:元组类型的返回值,形式为(x,y,w,h),其中x、y是矩形左上角顶点的坐标,w、h是矩形的宽度和高度。知识准备—图像轮廓4.3.3轮廓特征(2)最小外接矩形(MinimumBoundingRectangle)最小外接矩形主要应用于文本检测、车牌识别、方向估计等场景。求最小外接矩形的函数语法格式如下:几何特征——外接矩形、最小外接矩形、最小外接圆、拟合椭圆retval=cv2.minAreaRect(points)其中各参数含义如下。points:二维坐标点的集合。retval:元组类型的返回值,形式为((cx,cy),(w,h),angle),其中(cx,cy)是矩形中心的坐标,w、h是矩形的宽度和高度,angle是矩形的旋转角度,表示矩形绕中心逆时针旋转的角度,范围为[-90,0)。知识准备—图像轮廓4.3.3轮廓特征(2)最小外接矩形(MinimumBoundingRectangle)要绘制最小外接矩形,需要将返回值retval转换为4个顶点的坐标,OpenCV提供了cv2.boxPoints()函数进行转换。其语法格式如下:几何特征——外接矩形、最小外接矩形、最小外接圆、拟合椭圆points=cv2.boxPoints(box[,points])其中各参数含义如下。box:旋转矩形对象,通常来自cv2.minAreaRect()的返回值。points:用于存储矩形4个顶点的输出数组。知识准备—图像轮廓4.3.3轮廓特征(3)最小外接圆(MinimumEnclosingCircle)最小外接圆是一个完全包含轮廓的最小圆形,主要应用于圆形物体检测、大小估计等场景。求最小外接圆的函数语法格式如下:几何特征——外接矩形、最小外接矩形、最小外接圆、拟合椭圆center,radius=cv2.minEnclosingCircle(points)其中各参数含义如下。points:二维坐标点的集合。center:元组类型的返回值,形式为(cx,cy),表示圆心的坐标。radius:圆的半径。知识准备—图像轮廓4.3.3轮廓特征(4)拟合椭圆(EllipseFitting)拟合椭圆主要应用于椭圆物体分析、方向检测等场景。求拟合椭圆的函数语法格式如下:几何特征——外接矩形、最小外接矩形、最小外接圆、拟合椭圆retval=cv2.fitEllipse(points)其中各参数含义如下。points:二维坐标点的集合,至少需要5个轮廓点。retval:元组类型的返回值,形式为((cx,cy),(a,b),angle),其中(cx,cy)是椭圆中心的坐标,a、b是椭圆的长轴和短轴长度,angle是椭圆长轴与x轴的夹角,范围为[0,180)。知识准备—图像轮廓4.3.3轮廓特征—案例几何特征——外接矩形、最小外接矩形、最小外接圆、拟合椭圆

【例4-10】使用OpenCV的函数分别绘制轮廓的外接矩形、最小外接矩形、最小外接圆和拟合椭圆。根据题目要求,编写程序的关键代码如下:源代码地址文件

ex4-10.py见教材配套代码,路径如下:src/proj04/ex4-10.py知识准备—图像轮廓4.3.3轮廓特征—案例几何特征——外接矩形、最小外接矩形、最小外接圆、拟合椭圆

【例4-10】使用OpenCV的函数分别绘制轮廓的外接矩形、最小外接矩形、最小外接圆和拟合椭圆。运行本例的代码,结果如图4-13所示。图4-13例4-10代码运行结果知识准备—图像轮廓4.3.3轮廓特征OpenCV提供了cv2.approxPolyDP()函数来构造指定精度的逼近多边形曲线。

其语法格式如下:形状特征——逼近多边形approxCurve=cv2.approxPolyDP(curve,epsilon,closed[,approxCurve])其中各参数含义如下。curve:输入曲线的二维坐标点的集合。epsilon:近似精度参数,即原始曲线与近似曲线之间的最大距离。其值越小,近似结果越接近原始形状,通常取值为周长的0.01~0.05。closed:布尔值,指定曲线是否闭合。approxCurve:返回值,多边形近似顶点集合。知识准备—图像轮廓4.3.3轮廓特征—案例形状特征——逼近多边形

【例4-11】使用OpenCV的cv2.approxPolyDP()函数分别绘制轮廓的逼近多边形。根据题目要求,编写程序的关键代码如下:源代码地址文件

ex4-11.py见教材配套代码,路径如下:src/proj04/ex4-11.py知识准备—图像轮廓4.3.3轮廓特征—案例形状特征——逼近多边形

【例4-11】使用OpenCV的cv2.approxPolyDP()函数分别绘制轮廓的逼近多边形。运行本例的代码,结果如图4-14所示。图4-14例4-11代码运行结果知识准备—图像轮廓4.3.3轮廓特征在图像形状分析中,凸包(ConvexHull)和凸性检测(ConvexityCheck)是描述轮廓几何特征的核心工具。凸包能简化复杂轮廓的形状,保留关键凸性特征。

凸性检测则用于判断轮廓是否为凸形。二者结合可快速提取物体的宏观形状特征,广泛应用于目标识别、手势分析、工业检测等领域。形状特征——凸包、凸性检测知识准备—图像轮廓4.3.3轮廓特征(1)凸包对于平面上的一组点,如轮廓的顶点,凸包是包含所有点的最小凸多边形。OpenCV提供cv2.convexHull()函数获取轮廓的凸包。其语法格式如下:形状特征——凸包、凸性检测hull=cv2.convexHull(points[,hull[,clockwise[,returnPoints]]])其中各参数含义如下。points:输入的二维坐标点的集合。hull:输出的凸包。clockwise:方向标志,默认值为False。returnPoints:控制返回值hull的类型,默认值为True。知识准备—图像轮廓4.3.3轮廓特征(2)凸性检测凸性检测用于判断一个轮廓是否为凸形,即判断轮廓上任意两点的连线是否均在轮廓内部或边界上。OpenCV提供cv2.isContourConvex()函数实施凸性检测。其语法格式如下:形状特征——凸包、凸性检测hull=cv2.convexHull(points[,hull[,clockwise[,returnPoints]]])其中各参数含义如下。contour:输入的轮廓,即由一系列顶点组成的闭合曲线。retval:布尔值。返回True表示输入的轮廓是凸形,返回False表示输入的轮廓非凸形。知识准备—图像轮廓4.3.3轮廓特征—案例形状特征——凸包、凸性检测

【例4-12】使用OpenCV的cv2.convexHull()函数获取轮廓凸包,绘制轮廓,同时使用cv2.ContourConvex()函数判断轮廓是否为凸形。根据题目要求,编写程序的关键代码如下:源代码地址文件

ex4-12.py见教材配套代码,路径如下:src/proj04/ex4-12.py知识准备—图像轮廓4.3.3轮廓特征—案例形状特征——凸包、凸性检测

【例4-12】使用OpenCV的cv2.convexHull()函数获取轮廓凸包,绘制轮廓,同时使用cv2.ContourConvex()函数判断轮廓是否为凸形。运行本例的代码,结果如图4-15所示。同时,输出轮廓凸性检测结果。图4-15例4-12代码运行结果知识准备—图像轮廓4.3.3轮廓特征(1)纵横比纵横比也称为宽高比,描述轮廓的“细长程度”,通常用外接矩形的宽度与高度的比值表示。值越接近1,形状越“方正”;值越偏离1,形状越“细长”。

计算公式如下:形状特征——横比、紧密度、等效直径知识准备—图像轮廓4.3.3轮廓特征(2)紧密度紧密度也称为“圆形度”,衡量轮廓与理想圆形的接近程度,值越接近1,轮廓越接近圆形。

计算公式如下:形状特征——横比、紧密度、等效直径知识准备—图像轮廓4.3.3轮廓特征(3)等效直径等效直径为与轮廓面积相等的圆形的直径,用于量化轮廓的大小而不受形状影响。例如,对于一个正方形和一个三角形,可通过等效直径比较谁更大。

计算公式如下:形状特征——横比、紧密度、等效直径知识准备—图像轮廓4.3.3轮廓特征—案例形状特征——横比、紧密度、等效直径

【例4-13】计算图像轮廓的各个特征值并进行适当的标注和可视化。根据题目要求,编写程序的关键代码如下:源代码地址文件

ex4-13.py见教材配套代码,路径如下:src/proj04/ex4-13.py知识准备—图像轮廓4.3.3轮廓特征—案例形状特征——横比、紧密度、等效直径

【例4-13】计算图像轮廓的各个特征值并进行适当的标注和可视化。运行本例的代码,结果如图4-16所示。同时,输出各个轮廓的纵横比、紧密度、等效直径。图4-16例4-13代码运行结果知识准备—边缘检测边缘检测旨在识别图像中物体的轮廓,其本质是定位像素灰度发生急剧变化的区域。常用的经典算法包括如下几种。Sobel:基于一阶梯度,通过分别计算x轴和y轴方向的近似导数来检测边缘。其特点是计算简单快速,但检测到的边缘较粗,定位精度一般。Laplacian:基于二阶导数,直接计算梯度的散度,从而实现各向同性的边缘检测(对各个方向响应一致)。其特点是对噪声非常敏感,通常需要先进行高斯平滑预处理。Canny:一个多阶段的优化算法,包含高斯滤波、梯度计算、非极大值抑制和双阈值检测与连接。其特点是能产生连续、单像素宽度、高精度的边缘,是效果最优的标准算法之一,但计算相对复杂。知识准备—边缘检测4.4.1Sobel边缘检测OpenCV提供cv2.Sobel()函数实现Sobel边缘检测。其语法格式如下:其中各参数含义如下。src:输入图像,通常为单通道灰度图像。ddepth:输出图像的深度,核心参数。dx:x轴方向的梯度阶数。dy:y轴方向的梯度阶数。ksize:Sobel算子的大小,默认值为3,必须为正奇数。scale:缩放因子,默认值为1,不缩放。delta:偏移量,默认值为0。borderType:边界填充方式,与均值滤波、2D滤波的边界填充方式一致。dst=cv2.Sobel(src,ddepth,dx,dy[,dst[,ksize[,scale[,delta[,borderType]]]]])知识准备—边缘检测4.4.1Sobel边缘检测—案例

【例4-14】读取一幅图像,使用cv2.Sobel()函数分别计算x轴方向、y轴方向的边缘,合并两个方向的边缘结果,并对比不同核大小的检测效果,展示Sobel边缘检测的方向特性。根据题目要求,编写程序的关键代码如下:源代码地址文件

ex4-14.py见教材配套代码,路径如下:src/proj04/ex4-14.py知识准备—边缘检测4.4.1Sobel边缘检测—案例

【例4-14】读取一幅图像,使用cv2.Sobel()函数分别计算x轴方向、y轴方向的边缘,合并两个方向的边缘结果,并对比不同核大小的检测效果,展示Sobel边缘检测的方向特性。运行本例的代码,结果如图4-17所示。图4-17例4-14代码运行结果知识准备—边缘检测4.4.2Laplacian边缘检测OpenCV提供cv2.Laplacian()函数实现Laplacian边缘检测。其语法格式如下:其中各参数含义如下。ksize:Laplacian算子的大小,默认值为1,对应3×3核,必须为正奇数(如1、3、5、7);ksize越大,核覆盖范围越广,抗噪声能力越强,但边缘细节越模糊。其他参数同Sobel算子。dst=cv2.Laplacian(src,ddepth[,dst[,ksize[,scale[,delta[,borderType]]]]])知识准备—边缘检测4.4.2Laplacian边缘检测—案例

【例4-15】读取一幅图像,先对其进行高斯平滑预处理,再使用cv2.Laplacian()函数对比“无预处理”与“有预处理”的边缘检测效果,同时展示不同核大小的影响,突出Laplacian边缘检测对噪声的敏感性及预处理的必要性。根据题目要求,编写程序的关键代码如下:源代码地址文件

ex4-15.py见教材配套代码,路径如下:src/proj04/ex4-15.py知识准备—边缘检测4.4.2Laplacian边缘检测—案例

【例4-15】读取一幅图像,先对其进行高斯平滑预处理,再使用cv2.Laplacian()函数对比“无预处理”与“有预处理”的边缘检测效果,同时展示不同核大小的影响,突出Laplacian边缘检测对噪声的敏感性及预处理的必要性。运行本例的代码,结果如图4-18所示。图4-18例4-15代码运行结果知识准备—边缘检测4.4.3Canny边缘检测Canny边缘检测旨在解决传统边缘检测算法存在的边缘定位不准确、噪声敏感度高以及边缘断裂等问题,以实现高精度、连续且单像素宽度的边缘检测效果。Canny边缘检测的实现流程包括以下4个核心步骤。①高斯平滑滤波。②梯度值与方向计算。③非极大值抑制。④双阈值检测与边缘连接。知识准备—边缘检测4.4.3Canny边缘检测OpenCV提供cv2.Canny()函数实现高效的Canny边缘检测。其语法格式如下:其中各参数含义如下。image:输入图像,支持单通道灰度图像或多通道彩色图像。threshold1:低阈值。threshold2:高阈值。apertureSize:Sobel算子的大小,必须为正奇数,默认值为3。L2gradient:梯度值计算方法,布尔值;默认值为False。edges:输出边缘图像,为单通道二值图像,与输入图像尺寸一致。edges=cv2.Canny(image,threshold1,threshold2[,edges[,apertureSize[,L2gradient]]])知识准备—边缘检测4.4.3Canny边缘检测—案例

【例4-16】读取一幅含细节与噪声的图像,使用cv2.Canny()函数进行处理,对比不同双阈值组合的检测效果,并与Sobel边缘检测结果对比,突出Canny边缘检测的精度优势。根据题目要求,编写程序的关键代码如下:源代码地址文件

ex4-16.py见教材配套代码,路径如下:src/proj04/ex4-16.py知识准备—边缘检测4.4.3Canny边缘检测—案例

【例4-16】读取一幅含细节与噪声的图像,使用cv2.Canny()函数进行处理,对比不同双阈值组合的检测效果,并与Sobel边缘检测结果对比,突出Canny边缘检测的精度优势。运行本例的代码,结果如图4-19所示。图4-19例4-16代码运行结果PART03项目实施项目实施项目任务在车辆图像中定位车牌位置,并提取出车牌区域图像。任务实现步骤1:图像预处理首先读取源车辆图像并创建备份,然后将彩色图像转换为灰度图像以降低计算复杂度,最后使用3×3的高斯滤波器对灰度图像进行模糊处理,有效消除图像中的噪声干扰,为后续处理步骤奠定基础。项目实施步骤1:图像预处理具体代码如下:图4-20高斯滤波处理后的图像本步骤的输出如图4-20所示。项目实施步骤2:边缘检测通过Sobel算子进行水平方向的边缘检测,突出图像中的垂直边缘特征,这对识别车牌的竖直字符边界特别有效,然后将结果映射到0~255范围内以便显示和处理,增强车牌区域的轮廓特征。具体代码如下:图4-21边缘检测结果本步骤的输出如图4-21所示。项目实施步骤3:图像二值化采用OTSU自适应阈值算法将经过边缘检测

温馨提示

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

评论

0/150

提交评论