计算机视觉应用开发案例教程(OpenCV)课件 第3、4章 图像预处理技术、图像几何变换_第1页
计算机视觉应用开发案例教程(OpenCV)课件 第3、4章 图像预处理技术、图像几何变换_第2页
计算机视觉应用开发案例教程(OpenCV)课件 第3、4章 图像预处理技术、图像几何变换_第3页
计算机视觉应用开发案例教程(OpenCV)课件 第3、4章 图像预处理技术、图像几何变换_第4页
计算机视觉应用开发案例教程(OpenCV)课件 第3、4章 图像预处理技术、图像几何变换_第5页
已阅读5页,还剩294页未读 继续免费阅读

下载本文档

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

文档简介

计算机视觉应用第3章

图像预处理技术目录CONTENT3.1图像灰度化与二值化013.2图像噪声与去噪023.3图像边缘检测03任务实践04拓展实训05本章小结06课后习题07彩色图计算量大图像预处理是计算机视觉任务的“第一步”,也是关键一步现实中的图像常存在问题:光照不均导致细节模糊噪声干扰目标识别边缘不清晰影响后续检测引言引言其精度直接决定后续算法的可靠性与应用价值,这与职业教育倡导的工匠精神高度契合。"第一工序"图像预处理从"中国鹰眼"VAR技术的国产化突破到美的工厂的AI质检升级,背后都离不开扎实的图像预处理技术支撑。一线技术岗位上,参数的精准调试、噪声的有效去除,看似微小的操作实则关乎产业升级与科技自立。推进新型工业化、发展新质生产力的进程中引言核心预处理技术消除噪声干扰简化图像突出目标提取目标轮廓图像灰度化与二值化图像去噪边缘检测工作情境制造业正往“高质量发展”转型,安防、医疗等领域对图像质量的要求也越来越高工作情境零件图有噪声监控图光照不均图像预处理技术就成了“救场关键”,也是很多视觉岗位必须掌握的核心环节。灰度化、去噪滤波、二值化和边缘检测,就是帮你解决这些问题的:高斯滤波能磨掉零件图的噪声,自适应二值化能让文档图更清晰,Canny边缘检测能勾出监控里的行人轮廓。工作情境不仅能应对岗位里“图像质量差”的实际问题,也能为产业升级中的“精准视觉应用”添一份力。学习目标知识目标3.熟悉关键OpenCV函数的使用方法(如cv2.cvtColor、cv2.threshold、cv2.GaussianBlur、cv2.Canny等)。2.掌握常见图像噪声类型(椒盐噪声、高斯噪声)及其特点。1.理解图像预处理的核心概念与重要性(灰度化、二值化、去噪、边缘检测)。能力目标3.能够通过参数调整(如滤波核大小、阈值、sigma值)优化预处理效果。2.能独立完成“灰度化→去噪→二值化/边缘检测”的完整预处理流程。1.能够根据图像场景选择合适的预处理方法(如自适应二值化处理光照不均、中值滤波去除椒盐噪声)。素养目标3.树立科技自立意识,理解国产技术背后对核心技术的持续打磨与突破。2.增强解决实际问题的工程思维,如通过调试参数应对不同图像场景。1.培养“精益求精、求真务实”的职业精神,理解预处理技术在产业升级中的责任与价值。3.1图像灰度化与二值化图像灰度化3.1.1含3个通道(BGR),像素数据量大,计算复杂;图像灰度化彩色图像灰度化是将彩色图转为单通道灰度图(像素值0-255,0为黑、255为白),既能保留图像核心细节,又能减少50%以上的计算量。灰度化原理灰度值计算遵循“人眼对绿光敏感、对蓝光不敏感”的规律,常用加权平均法:灰度值=0.299×R+0.587×G+0.114×BOpenCV的cv2.cvtColor()函数已内置该算法,无需手动计算。灰度化实现示例3-1:用OpenCV函数实现灰度化(推荐)灰度化实现示例3-1:用OpenCV函数实现灰度化(推荐)运行结果:如图3-1所示,两个窗口对比显示,彩色图色彩丰富,灰度图用明暗程度保留了山脉、天空的细节,无色彩信息。先导入必要的库OpenCV核心库处理数值数组示例3-2:手动实现灰度化(理解原理)第一步:灰度化原理理解灰度化的核心公式:灰度值=0.299×R+0.587×G+0.114×B示例3-2:手动实现灰度化(理解原理)第一步:灰度化原理理解为什么是这个权重?因为人眼对绿光最敏感(权重0.587),红光次之(权重0.299),蓝光最不敏感(权重0.114),这个公式符合人眼视觉特性,不是简单的算术平均。示例3-2:手动实现灰度化(理解原理)第二步:OpenCV函数实现转换标识符示例3-2:手动实现灰度化(理解原理)第二步:OpenCV函数实现转换标识符为什么要先判断ifcolor_imgisNone?是怕图像路径错了读取失败,实际项目里这种容错很重要。示例3-2:手动实现灰度化(理解原理)第三步:手动计算实现转换标识符为什么要转float计算?因为权重计算会产生小数,避免uint8溢出;为什么要用astype(np.uint8)?因为图像像素值必须是0-255的整数。示例3-2:手动实现灰度化(理解原理)第四步:结果验证与对比这行代码验证OpenCV函数与手动计算实现结果是否完全一致,如果输出True,说明我们的原理理解和代码实现都正确。示例3-2:手动实现灰度化(理解原理)第五步:结果显示对比通过并排显示,直观感受两种方法得到的灰度图是否一致,验证实现正确性。示例3-2:手动实现灰度化(理解原理)第六步:资源释放等待按键后关闭所有窗口,释放系统资源通过并排显示,直观感受两种方法得到的灰度图是否一致,验证实现正确性。示例3-2:手动实现灰度化(理解原理)图像二值化3.1.2是在灰度化基础上,将图像转为

“纯黑(0)”和“纯白(255)”

两种像素,彻底简化图像,突出目标(如文本、物体轮廓)。图像二值化二值化核心技术选择“阈值(Threshold)”——灰度值大于阈值设为255,小于等于阈值设为0(或相反)。核心函数:cv2.threshold()语法:ret,dst=cv2.threshold(src,thresh,maxval,type)src:输入图像,必须是单通道灰度图;thresh:自定义阈值(0-255,如127);核心函数:cv2.threshold()语法:ret,dst=cv2.threshold(src,thresh,maxval,type)maxval:阈值类型为“THRESH_BINARY”或“THRESH_BINARY_INV”时,灰度值超过阈值的像素被赋值为maxval,通常为255;核心函数:cv2.threshold()语法:ret,dst=cv2.threshold(src,thresh,maxval,type)type:阈值类型,常用

的有4种,见表3-1;返回值:ret(实际使用的阈值,与输入thresh一致)、dst(二值化后的图像)核心函数:cv2.threshold()类型效果(灰度值>thresh时)应用场景cv2.THRESH_BINARY设为

maxval(255,白),否则0(黑)文本白底黑字→黑底白字cv2.THRESH_BINARY_INV设为

0(黑),否则255(白)文本黑底白字→白底黑字cv2.THRESH_TRUNC设为

thresh,否则保持原灰度值保留暗部细节cv2.THRESH_TOZERO保持原灰度值,否则

0(黑)去除暗部噪声二值化实例:全局阈值示例3-3:文本图像二值化:突出文字二值化实例:全局阈值示例3-3:文本图像二值化:突出文字二值化实例:全局阈值运行结果:如图3-3所示,4个窗口对比显示,阈值100的二值化图文字偏粗,部分背景被误判为文字;阈值150的图文字偏细,部分文字丢失;阈值127的图文字清晰、背景干净,为最优结果。示例3-3:文本图像二值化:突出文字二值化实例:全局阈值等待按键后关闭所有窗口,释放系统资源示例3-4:光照不均图像的自适应阈值二值化如127,适合光照均匀的图像,若图像存在

“一半亮、一半暗”(如窗边的文档),全局阈值会导致亮区文字丢失、暗区背景残留。图像二值化全局阈值自适应阈值根据像素周围的局部亮度自动调整阈值,每个区域用不同阈值。核心函数:cv2.adaptiveThreshold()语法:dst=cv2.adaptiveThreshold(src,maxval,adaptiveMethod,thresholdType,blockSize,C)adaptiveMethod:局部阈值计算方法(ADAPTIVE_THRESH_MEAN_C:局部均值;ADAPTIVE_THRESH_GAUSSIAN_C:局部高斯加权均值);核心函数:cv2.adaptiveThreshold()语法:dst=cv2.adaptiveThreshold(src,maxval,adaptiveMethod,thresholdType,blockSize,C)blockSize:局部区域大小,必须是奇数,如3、5、7,越大越平滑;C:从局部均值/高斯均值中减去的常数,调整阈值偏移,通常为2-10。自适应阈值:解决光照不均示例3-4:光照不均图像的自适应阈值二值化自适应阈值:解决光照不均示例3-4:光照不均图像的自适应阈值二值化第四步:结果对比与验证运行结果:如图3-4所示,全局阈值图中,亮区文字几乎看不见,暗区有大量黑色噪声;自适应阈值图,尤其是高斯法中,亮区和暗区的文字均清晰,背景干净,完美解决光照不均问题。示例3-4:光照不均图像的自适应阈值二值化第五步:资源释放等待按键后关闭所有窗口,释放系统资源示例3-4:光照不均图像的自适应阈值二值化3.2图像噪声与去噪图像噪声与去噪还原信息本质消除干扰误差图像噪声与去噪核心价值求真务实的科学精神精益求精的职业追求图像噪声与去噪"中国鹰眼"图像去噪目标追踪常见噪声类型3.2.1图像中随机出现的

“纯白像素(盐噪声)”和“纯黑像素(椒噪声)”,像撒了盐和胡椒,常见于传感器故障、传输错误;常见噪声类型椒盐噪声高斯噪声噪声像素值服从高斯分布(正态分布),图像整体呈现

“模糊的颗粒感”,常见于低光照、高ISO拍摄。示例3-5:生成椒盐噪声和高斯噪声先导入必要的库OpenCV核心库处理数值数组第一步:噪声原理理解椒盐噪声图像中随机出现的“纯白像素(盐噪声)”和“纯黑像素(椒噪声)”,像撒了盐和胡椒,常见于传感器故障、传输错误;高斯噪声噪声像素值服从高斯分布(正态分布),图像整体呈现“模糊的颗粒感”,常见于低光照、高ISO拍摄。为什么要区分两种噪声?示例3-5:生成椒盐噪声和高斯噪声第二步:椒盐噪声实现(理解原理这里为什么要用noise_ratio/2?因为我们要均分噪声比例,一半给盐噪声(白点),一半给椒噪声(黑点),确保噪声分布均衡。示例3-5:生成椒盐噪声和高斯噪声第三步:高斯噪声实现(理解原理)这里为什么要先归一化?因为高斯噪声需要在0-1范围内计算,避免数值溢出;为什么要用np.clip?因为噪声叠加后可能超出0-1范围,需要裁剪到有效区间。示例3-5:生成椒盐噪声和高斯噪声第四步:噪声效果验证对比显示是为了让大家直观感受两种噪声的视觉差异,理解各自的特点和应用场景。示例3-5:生成椒盐噪声和高斯噪声第五步:资源释放对比显示是为了让大家直观感受两种噪声的视觉差异,理解各自的特点和应用场景。等待按键后关闭所有窗口,释放系统资源示例3-5:生成椒盐噪声和高斯噪声图像去噪:滤波3.2.2去噪的核心是“滤波(Filtering)”用像素周围的“局部区域像素值”替换当前像素值,消除异常噪声。均值滤波(MeanFilter)函数:cv2.blur(src,ksize),ksize为滤波核大小,如(3,3)核。缺点:会模糊图像细节,如边缘,噪声占比越高,模糊越明显;原理:用当前像素周围k×k(k为奇数,如3×3)区域的“均值”替换当前像素值,平滑图像,适合消除高斯噪声;先导入必要的库OpenCV核心库处理数值数组示例3-6:均值滤波去高斯噪声第一步:噪声原理理解均值滤波的核心原理是用当前像素周围k×k区域的像素均值替换当前像素值,通过局部平均来消除随机噪声。为什么要用奇数大小的核?因为奇数核有明确的中心点,便于计算和定位。示例3-6:均值滤波去高斯噪声第二步:噪声生成(准备测试数据)这里为什么要先归一化?因为高斯噪声需要在0-1范围内计算,避免数值溢出;为什么要用np.clip?因为噪声叠加后可能超出有效范围,需要限制在0-255之间。示例3-6:均值滤波去高斯噪声第三步:均值滤波实现(核心)为什么要尝试不同大小的滤波核?因为不同大小的核在去噪强度和细节保留上有明显权衡,需要通过对比找到最佳平衡点。示例3-6:均值滤波去高斯噪声第四步:结果对比与验证示例3-6:均值滤波去高斯噪声示例3-6:均值滤波去高斯噪声第五步:资源释放等待按键后关闭所有窗口,释放系统资源运行结果:如图3-6所示,3×3核去噪后,噪声明显减少,Lena的面部细节,如眼睛、鼻子保留较好;5×5和7×7核去噪更强,但面部轮廓逐渐模糊,证明“核越大,去噪越强但细节损失越多”。高斯滤波(GaussianFilter)函数:cv2.GaussianBlur(src,ksize,sigmaX),sigmaX为X方向高斯标准差,该值越大,去噪越强,Y方向默认与X相同。优势:相比均值滤波,去噪效果更好,且模糊程度更低,是最常用的去噪方法,适合高斯噪声;原理:用当前像素周围k×k区域的“高斯加权均值”替换当前像素值——距离中心越近的像素权重越大,距离越远权重越小;先导入必要的库OpenCV核心库处理数值数组示例3-7:高斯滤波vs均值滤波(去高斯噪声)第一步:高斯滤波原理理解高斯滤波的核心原理是用当前像素周围k×k区域的高斯加权均值替换当前像素值,距离中心越近的像素权重越大,距离越远权重越小。为什么要用高斯加权?因为这种加权方式更符合自然规律,能够在去噪的同时更好地保留边缘和细节信息。示例3-7:高斯滤波vs均值滤波(去高斯噪声)第二步:噪声生成(准备测试数据)这里为什么要先归一化?因为高斯噪声计算需要在0-1范围内进行,确保数值计算的准确性和稳定性。示例3-7:高斯滤波vs均值滤波(去高斯噪声)第三步:高斯滤波实现(核心)sigmaX参数控制什么?sigmaX是高斯核在X方向的标准差,值越大表示权重分布越分散,去噪效果越强但可能更模糊;值越小表示权重越集中,细节保留更好但去噪效果减弱。示例3-7:高斯滤波vs均值滤波(去高斯噪声)第四步:对比实验设计为什么要在相同核大小下对比?因为这样可以公平地比较两种滤波方法的性能差异,排除核大小因素的影响,专注于方法本身的特性比较。示例3-7:高斯滤波vs均值滤波(去高斯噪声)第五步:结果验证与展示示例3-7:高斯滤波vs均值滤波(去高斯噪声)运行结果:如图3-7所示,相同5×5核下,高斯滤波的去噪效果与均值滤波相当,但Lena的面部细节,如眉毛、嘴角更清晰,无明显模糊,体现高斯滤波的优势。第六步:资源释放等待按键后关闭所有窗口,释放系统资源示例3-7:高斯滤波vs均值滤波(去高斯噪声)中值滤波(MedianFilter)函数:cv2.medianBlur(src,ksize),ksize为滤波核大小,且必须是奇数,如3、5。优势:能有效消除椒盐噪声,因为椒盐噪声是极端值,排序后不会成为中值,且对细节模糊少;缺点:对高斯噪声效果差;原理:用当前像素周围k×k区域的“中值”替换当前像素值——将区域内像素值排序,取中间值;先导入必要的库OpenCV核心库处理数值数组示例3-8:中值滤波去椒盐噪声第一步:中值滤波原理理解中值滤波的核心原理是用当前像素周围k×k区域的像素值中值替换当前像素值,通过对局部区域像素值排序取中间值来消除极端噪声。为什么中值滤波特别适合处理椒盐噪声?因为椒盐噪声是极端的黑白点(0或255),在排序后不会成为中值,从而被有效滤除。示例3-8:中值滤波去椒盐噪声第二步:椒盐噪声生成(准备测试数据)为什么要用noise_ratio/2?因为我们要均分噪声比例,一半给盐噪声(白点),一半给椒噪声(黑点),确保噪声分布均衡且符合实际场景。示例3-8:中值滤波去椒盐噪声第三步:中值滤波实现(核心)为什么核大小必须是奇数?因为奇数核有明确的中心点,便于确定滤波窗口的中心位置,确保滤波计算的准确性。示例3-8:中值滤波去椒盐噪声第四步:对比实验设计为什么要与高斯滤波对比?因为通过对比可以清晰展示中值滤波在处理椒盐噪声方面的独特优势,帮助理解不同滤波方法的适用场景。示例3-8:中值滤波去椒盐噪声第五步:结果验证与展示示例3-8:中值滤波去椒盐噪声运行结果:如图3-8所示,3×3中值滤波已基本消除椒盐噪声,5×5核完全消除噪声;而高斯滤波后仍有大量黑白小点,证明“中值滤波是椒盐噪声的最佳选择”。第六步:资源释放等待按键后关闭所有窗口,释放系统资源示例3-8:中值滤波去椒盐噪声滤波方法选择总结3.2.3滤波方法选择总结噪声类型推荐滤波方法不推荐方法核心参数建议高斯噪声高斯滤波中值滤波核大小

3×3~5×5,sigmaX=1~2椒盐噪声中值滤波高斯滤波、均值滤波核大小

3×3(噪声少)、5×5(噪声多)混合噪声高斯滤波

+中值滤波单一滤波先高斯去高斯噪声,再中值去椒盐噪声3.3图像边缘检测图像边缘检测边缘是图像中

“灰度值突变”的区域,如物体轮廓、文本边框,边缘检测的目标是提取这些区域,为后续的目标识别、形状分析铺路。两种常用边缘检测算法Canny边缘检测Sobel算子Sobel算子3.3.1原理通过计算图像在

“水平方向”和“垂直方向”的灰度变化梯度,梯度越大,边缘越明显,分别检测水平边缘和垂直边缘;2.classifier.detectMultiScale():检测目标函数:cv2.Sobel(src,ddepth,dx,dy,ksize)ddepth:输出图像深度,通常用cv2.CV_64F,避免梯度负值被截断;dx:x方向导数,1表示检测水平边缘,0表示不检测;dy:y方向导数,1表示检测垂直边缘,0表示不检测;ksize:Sobel核大小,必须是奇数,如3、5,默认3;注意梯度可能为负,如从亮到暗的边缘,需用cv2.convertScaleAbs()取绝对值,避免显示为黑色。先导入必要的库OpenCV核心库处理数值数组示例3-9:用Sobel算子检测道路边缘第一步:读取图像+格式验证这里直接使用图像文件名,前提是图像文件与代码在同一目录;后面应该加判断ifcolor_imgisNone,确保图像读取成功,避免后续处理出错。示例3-9:用Sobel算子检测道路边缘第二步:图像预处理为什么转灰度?因为彩色图有3个通道,灰度图只有1个通道,能大幅减少计算量,而且边缘检测主要依赖亮度差异信息。参数里"(3,3)"是滤波核大小;"sigmaX=1"是高斯标准差。为什么要先滤波?因为原始图像可能有噪声,高斯滤波能平滑噪声,避免噪声被误检为边缘。示例3-9:用Sobel算子检测道路边缘第三步:Sobel水平边缘检测参数里"CV_64F"表示输出图像深度为64位浮点型,避免负梯度值被截断;"dx=1,dy=0"表示计算x方向(水平)梯度;"ksize=3"是Sobel核大小。为什么需要这一步?因为梯度值可能为负数(从亮到暗的变化),取绝对值后才能正确显示为灰度图像。示例3-9:用Sobel算子检测道路边缘第四步:Sobel垂直边缘检测参数里"dx=0,dy=1"表示计算y方向(垂直)梯度。这样我们就能分别得到水平和垂直两个方向的边缘信息。示例3-9:用Sobel算子检测道路边缘第五步:边缘结果融合参数里两个"0.5"是权重系数,表示各取50%进行融合;"0"是偏置项。示例3-9:用Sobel算子检测道路边缘第六步:结果显示与对比示例3-9:用Sobel算子检测道路边缘运行结果:如图3-9所示,水平边缘图中,道路的水平车道线呈白色线条;垂直边缘图中,路边的交通标志、柱子呈白色线条;合并图中,道路的所有边缘,如车道线、路边,均清晰,无明显噪声。Canny边缘检测3.3.2Canny边缘检测Canny是目前最优秀的边缘检测算法,采用“多阶段处理”,边缘检测更精准、抗噪声能力更强。步骤高斯滤波:去噪,与Sobel前的去噪一致;1.计算梯度:用Sobel算子计算梯度大小和方向;2.非极大值抑制(NMS):消除边缘上的“非最大值”像素,使边缘更细;3.双阈值筛选:用“高阈值”和“低阈值”筛选边缘——高于高阈值的是确定边缘,低于低阈值的是噪声,介于两者之间的需看是否与确定边缘相连,相连则保留,否则丢弃。4.Canny边缘检测(CannyEdgeDetection)核心函数:cv2.Canny(image,threshold1,threshold2,apertureSize)threshold1:低阈值,通常为高阈值的1/2~1/3,如50;threshold2:高阈值,如150;apertureSize:Sobel核大小,默认3。先导入必要的库OpenCV核心库示例3-10:Canny边缘检测vsSobel算子第一步:读取图像+预处理为什么转灰度?因为边缘检测主要依赖亮度信息,灰度图能大幅减少计算量。这里直接使用图像文件名,前提是图像文件与代码在同一目录;后面应该加判断`ifcolor_imgisNone`,确保图像读取成功。参数里"(5,5)"是滤波核大小;"sigmaX=1"是高斯标准差。为什么要用5×5核?因为硬币图像需要较强的去噪效果,但又要避免过度模糊边缘。示例3-10:Canny边缘检测vsSobel算子第二步:Sobel算子对比(理解Canny基础)这里展示了传统边缘检测方法,边缘较粗且有噪声,为后续Canny的优越性做铺垫。示例3-10:Canny边缘检测vsSobel算子第三步:Canny边缘检测核心参数里"50"是低阈值,"150"是高阈值。Canny内部自动完成了四个步骤:高斯去噪→计算梯度→非极大值抑制→双阈值筛选。示例3-10:Canny边缘检测vsSobel算子第四步:多阈值对比实验通过对比理解阈值选择的重要性。示例3-10:Canny边缘检测vsSobel算子第五步:结果显示与对比示例3-10:Canny边缘检测vsSobel算子运行结果:如图3-10所示,Sobel边缘图中,硬币边缘较粗,且背景有少量噪声;Canny(50,150)图中,硬币边缘细且连续,背景干净,完美保留所有硬币的轮廓;阈值过低(30,100)会引入噪声,过高(80,200)会丢失边缘,证明“双阈值需合理搭配”。第五步:结果显示与对比示例3-10:Canny边缘检测vsSobel算子等待按键后关闭所有窗口,释放系统资源Canny阈值选择技巧场景适配:复杂场景,如多物体,用较低阈值从而保留更多边缘,简单场景如单一物体,用较高阈值从而减少噪声。调试方法:先固定低阈值,逐步提高高阈值,直到边缘无明显噪声;再微调低阈值,确保边缘完整;经验法则:高阈值=低阈值

×2~3,如低50→高100~150;任务实践任务1:身份证图像预处理2.按流程预处理:灰度化→高斯滤波(3×3核)→自适应阈值二值化,解决身份证光照不均;3.用Canny边缘检测提取身份证轮廓(阈值50,150);4.显示“原图→灰度图→滤波图→二值化图→边缘图”的完整流程,保存边缘图为“id_card_edges.jpg”。1.读取一张身份证彩色图像;任务:2:

噪声图像去噪对比2.对椒盐噪声图:用3×3和5×5中值滤波去噪,对比效果;3.对高斯噪声图:用3×3高斯滤波(sigmaX=1)和5×5均值滤波去噪,对比效果;4.总结“不同噪声对应的最优去噪方法”,保存所有去噪图。1.读取一张灰度图像,分别添加10%椒盐噪声和方差0.01的高斯噪声;拓展实训文本图像预处理:灰度化→去噪→二值化实训1实训目标3.实现清晰的文本二值化效果。2.能根据文本图像质量调整滤波核大小和二值化阈值;1.掌握“灰度化→去噪→二值化”的标准文本预处理流程;准备1张含噪声的文本图像,如手机拍摄的打印文档,存在轻微倾斜和噪声,命名为“noisy_text.jpg”;实训准备素材方面核心技术灰度化(cv2.cvtColor)、高斯滤波(cv2.GaussianBlur)、自适应阈值二值化(cv2.adaptiveThreshold)。实训步骤步骤1:分析实训流程文本预处理的核心是“突出文字,消除背景噪声”,流程如下:灰度图(简化数据)高斯滤波(去拍摄噪声)彩色图自适应二值化(解决光照不均,文字变纯白、背景变纯黑)步骤2:编写实训代码先导入必要的库OpenCV核心库第一步:读取图像+格式验证这里直接使用图像文件名,前提是图像文件与代码在同一目录;怕图像路径错了加载失败,能及时提示"文本图像读取失败!",实际项目里这种容错很重要。步骤2:编写实训代码第二步:图像灰度化为什么先转灰度?因为彩色图有3个通道,灰度图只有1个通道,能大幅减少计算量,而且文本识别主要依赖亮度信息,灰度图更合适。步骤2:编写实训代码第三步:高斯滤波去噪参数里"(3,3)"是滤波核大小,我们同时尝试3×3和5×5两种核;"sigmaX=1"是高斯标准差,控制滤波强度。为什么用高斯滤波而不是其他滤波?因为高斯滤波能有效消除随机噪声,同时较好地保留文字边缘细节。步骤2:编写实训代码第四步:自适应阈值二值化用高斯加权计算局部阈值是局部区域大小,必须是奇数;调节常数是反转二值化模式,让文字变白、背景变黑。步骤2:编写实训代码第五步:多方案对比与最优选择同时对3×3滤波和5×5滤波的结果进行二值化,通过对比选择最优效果。通常3×3滤波能更好保留文字细节,5×5滤波可能过度模糊导致文字断裂。步骤2:编写实训代码第六步:结果显示与保存步骤2:编写实训代码实训步骤步骤3:运行与验证运行代码:执行pythonexp1_text_preprocessing.py;实训步骤步骤3:运行与验证流程对比:观察6个窗口,从“彩色图”到“二值化图”,文字逐渐清晰,背景噪声逐渐减少;最优选择:3×3滤波后的二值化图中,文字笔画完整、无断裂,背景无明显噪声;5×5滤波后的图文字可能轻微模糊;实训步骤步骤3:运行与验证扩展尝试:若文字仍有噪声,调整adaptiveThreshold的C值,如改为3;若文字断裂,减小C值,如改为1。滤波作用自适应阈值优势运行结果文本预处理中,高斯滤波的核大小不宜过大(5×5及以上),否则会模糊文字边缘,导致二值化后文字断裂;相比全局阈值,自适应阈值能处理文本图像的

“局部光照不均”,如边缘阴影,确保全图文字清晰;实训结果与分析硬币边缘检测与计数实训2实训目标3.初步实现基于轮廓数量统计的硬币计数,理解边缘检测的应用价值。2.能通过Canny边缘检测清晰提取硬币轮廓;1.掌握“去噪→二值化→边缘检测”的物体轮廓提取流程;实训准备素材方面核心技术准备1张含多枚硬币的图像,硬币无重叠,背景简单,命名为“coins.jpg”;高斯滤波、Canny边缘检测、轮廓查找(cv2.findContours)。实训步骤步骤1:分析实训流程硬币计数的基础是“提取每个硬币的轮廓”,流程如下:灰度图高斯滤波(去噪)彩色图Canny边缘检测(提轮廓)轮廓查找(计数)绘制轮廓可视化先导入必要的库OpenCV核心库处理数值数组步骤2:编写实训代码第一步:读取图像+格式验证这里直接使用图像文件名,前提是图像文件与代码在同一目录;怕图像路径错了加载失败,能及时提示"硬币图像读取失败!",实际项目里这种容错很重要。步骤2:编写实训代码第二步:图像预处理为什么转灰度?因为彩色图有3个通道,灰度图只有1个通道,能大幅减少计算量,而且边缘检测主要依赖亮度差异信息。参数里"(5,5)"是滤波核大小;"sigmaX=1.5"是高斯标准差。为什么要先滤波?因为原始图像可能有噪声,高斯滤波能平滑噪声,避免噪声被误检为边缘。步骤2:编写实训代码第三步:Canny边缘检测核心是低阈值,低于此值的边缘点被丢弃;是高阈值,高于此值的边缘点被确认为强边缘;介于两者之间的边缘点需要与强边缘连接才会被保留。步骤2:编写实训代码第四步:轮廓查找与计数表示只检测最外层轮廓,忽略硬币内部可能存在的反光区域;压缩水平、垂直和对角线段,只保留端点,节省内存。步骤2:编写实训代码第五步:结果可视化避免修改原始数据参数里"(0,255,0)"是绿色BGR值,"2"是线宽;添加红色计数文字"(20,40)"是文字位置"FONT_HERSHEY_SIMPLEX"是字体类型,"1.2"是字体大小步骤2:编写实训代码第六步:显示与保存结果显示原图显示边缘图显示最终结果步骤2:编写实训代码实训步骤步骤3:运行与验证1.运行代码:执行pythonexp2_coins_detection.py;边缘检测:Canny边缘图中,每个硬币的轮廓完整,无明显断裂或噪声;计数准确:轮廓数量与实际硬币数量一致;若多计数,可能是背景噪声,需提高Canny高阈值;若少计数,需降低低阈值;轮廓绘制:彩色原图上,每个硬币被绿色轮廓包围,左上角红色文字显示计数结果;实训步骤步骤3:运行与验证3.异常处理:若存在“小噪声轮廓”,可在轮廓查找后添加“轮廓面积筛选”,如只保留面积大于1000的轮廓,代码如下:实训步骤步骤3:运行与验证#筛选面积大于1000的轮廓(去除小噪声)valid_contours=[cntforcntincontoursifcv2.contourArea(cnt)>1000]coin_count=len(valid_contours)预处理关键轮廓查找参数硬币边缘检测前,高斯滤波的sigmaX需适当(1.5~2),过小则噪声残留,过大则轮廓模糊;cv2.RETR_EXTERNAL只保留最外层轮廓,避免将硬币内部的反光区域误判为独立轮廓;实训结果与分析运行结果如图3-12所示,可以看出硬币被明显“数”多了。这种时候我们就要通过调整阈值的方式来手动调整参数。具体方法就是将Canny高阈值提高,如图3-13所示,把图中代码红框框出部分的高阈值提高到350。实训结果与分析图3-12硬币边缘检测与计数运行结果如图3-12所示,可以看出硬币被明显“数”多了。这种时候我们就要通过调整阈值的方式来手动调整参数。具体方法就是将Canny高阈值提高,如图3-13所示,把图中代码红框框出部分的高阈值提高到350。实训结果与分析图3-13提高Canny高阈值运行结果如图3-12所示,可以看出硬币被明显“数”多了。这种时候我们就要通过调整阈值的方式来手动调整参数。具体方法就是将Canny高阈值提高,如图3-13所示,把图中代码红框框出部分的高阈值提高到350。实训结果与分析图3-14调整阈值后再次统计的结果

本章小结预处理是计算机视觉的关键前提现实图像常存在计算量大、光照不均、噪声干扰、边缘模糊等问题,预处理通过改善图像质量、突出有用信息,为后续特征提取、目标检测等任务铺路,是计算机视觉流程中不可或缺的“第一步”;四类核心技术图像灰度化与二值化简化图像数据(灰度化降维、二值化突出目标),图像去噪消除干扰像素,边缘检测提取目标轮廓,四类技术覆盖“简化-净化-特征提取”的预处理全流程;技术选择需匹配场景特性灰度化优先用OpenCV内置函数(cv2.cvtColor)保证效率;二值化中,光照均匀场景选全局阈值(cv2.threshold),光照不均场景选自适应阈值(cv2.adaptiveThreshold);去噪需按噪声类型匹配方法如高斯噪声用高斯滤波、椒盐噪声用中值滤波;边缘检测中,Sobel算子适合分方向提取边缘,Canny算法适合高精度轮廓检测,但需合理设置双阈值,如课后实训二的“数硬币”任务,读者可以尝试根据不同图像场景设定不同的双阈值,以改进准确率;实操流程有标准范式复杂场景预处理需遵循“灰度化→去噪→二值化/边缘检测”的顺序,如身份证预处理、文本清晰化;且需通过调整参数(滤波核大小、阈值、sigma值)优化效果,避免参数“一刀切”;函数是实现核心需熟练掌握关键函数的参数含义与应用场景,如cv2.threshold的阈值类型、cv2.GaussianBlur的sigmaX、cv2.Canny的双阈值,同时结合NumPy数组操作,深化对技术原理的理解。

课后习题一、选择题课后习题1.以下关于图像灰度化的说法,正确的是(

)A.灰度化是将彩色图转为3通道灰度图B.灰度值计算无需考虑人眼对颜色的敏感度C.OpenCV的cv2.COLOR_BGR2GRAY采用加权平均法计算灰度值D.灰度化会丢失图像的所有细节一、选择题课后习题2.处理光照不均的文本图像时,最优的二值化方法是(

)A.全局阈值二值化(cv2.threshold)B.自适应阈值二值化(cv2.adaptiveThreshold)C.手动计算二值化D.无法处理,需重新拍摄一、选择题课后习题3.以下滤波方法中,最适合消除椒盐噪声的是(

)A.均值滤波(cv2.blur)B.高斯滤波(cv2.GaussianBlur)C.中值滤波(cv2.medianBlur)D.以上方法都适合一、选择题课后习题4.Canny边缘检测的核心步骤不包括(

)A.高斯滤波去噪B.计算梯度大小和方向C.非极大值抑制(NMS)D.全局阈值二值化一、选择题课后习题5.用Sobel算子检测水平边缘时,dx和dy的参数设置应为(

)A.dx=1,dy=0B.dx=0,dy=1C.dx=1,dy=1D.dx=0,dy=0二、填空题课后习题1.图像二值化中,cv2.THRESH_BINARY_INV的作用是:灰度值大于阈值时设为__________,小于等于阈值时设为__________,适合将“白底黑字”转为“黑底白字”。2.高斯滤波的核心参数包括__________(滤波核大小)和__________(高斯标准差,控制去噪强度)。3.Canny边缘检测中,“低阈值”通常设为“高阈值”的__________倍,若低阈值过小,会导致__________增多。4.边缘检测前通常需要先进行__________操作,目的是减少噪声对边缘提取的干扰。三、操作题课后习题1.编写代码,实现“高斯噪声图像的去噪对比”读取“lena_gray.jpg”灰度图像;为图像添加方差0.01的高斯噪声;分别用3×3均值滤波、3×3高斯滤波(sigmaX=1)、5×5高斯滤波(sigmaX=2)去噪;显示“原图→噪声图→3种去噪图”,对比效果,保存最优去噪图(高斯3×3)为“lena_denoised.jpg”。三、操作题课后习题2.编写代码,实现“简单物体边缘检测”读取一张含单一物体的图像(如苹果、杯子);按流程处理:灰度化→高斯滤波(5×5核,sigmaX=1)→Canny边缘检测(阈值40,120);查找物体的最外层轮廓,在彩色原图上用红色线条(线宽2)绘制轮廓;显示“原图→灰度图→Canny边缘图→带轮廓的原图”,保存带轮廓的图为“object_contour.jpg”。计算机视觉应用第4章

图像几何变换目录CONTENT4.1基础几何变换014.2仿射变换024.3透视变换03任务实践04拓展实训05本章小结06课后习题07手机拍照后旋转图片——纠正倾斜;图像几何变换是计算机视觉中“调整图像空间位置与形态”的核心技术通俗来说就是“改变图像的大小、位置、角度或形状”,其应用场景随处可见:人脸识别时缩放人脸图像——统一尺寸;扫描文档时校正倾斜的页面——透视变换;全景图拼接时调整多幅图像的视角——仿射变换。引言引言平移、旋转、缩放、翻转,改变位置或尺寸,不改变图像形状;基础几何变换两类几何变换:仿射、透视,改变图像形状,用于校正或视角转换;所有技术均基于OpenCV的warpAffine()和warpPerspective()函数实现,配套大量实操例子,确保能直接应用到实际场景。复杂几何变换引言图像几何变换精准应用重要基础工匠精神图像几何变换看似是基于矩阵运算的技术工具,实则是支撑现代产业发展的重要基础;从国产空间站“天宫”传回图像的畸变校正,到自动驾驶汽车摄像头的实时视角转换,再到医疗影像设备中病灶区域的精准定位,这些关乎国计民生与科技突破的场景,都离不开几何变换技术的精准应用;我国科研团队在自主图像处理算法研发中,正是以“工匠精神”打磨每一个变换参数,让技术精度达到国际领先水平,部分成果已被OpenCV等国际主流库收录。工作情境实际工作中,你拿到的图像很少会“端端正正”:工业线上的零件可能歪着放,零售货架的商品图尺寸不统一,监控摄像头装偏了画面还会倒置——这些“形态问题”会直接影响后续工作;工作情境比如歪的零件图没法准确测尺寸,尺寸不统一的商品图没法进系统;图像几何变换,就是帮你把这些“不标准”图像调成“能用的样子”。本模块学的平移、旋转、缩放和透视变换,每一个都对应具体需求:透视变换能把歪的零件图转正,缩放能把商品图调成统一大小;工作情境对需要处理图像的岗位来说,这些操作不是“花架子”;而是“把图像调好用”的必备手段,学会了就能少走很多弯路。学习目标知识目标3.熟悉OpenCV中相关函数的使用,如cv2.warpAffine()、cv2.getPerspectiveTransform()等,并能根据任务需求选择合适的插值方法。2.理解仿射变换与透视变换的区别与应用场景,掌握基于多对应点的变换矩阵生成方法。1.掌握图像基础几何变换(平移、旋转、缩放、翻转)的原理与实现方法,理解变换矩阵的作用及参数含义。能力目标3.具备根据实际场景手动选取特征点并调整参数的能力,提升解决实际图像处理问题的动手能力。2.能够对倾斜、畸变的图像(如身份证、书本封面)进行仿射或透视校正,使其恢复为规整的矩形视角。1.能够独立完成图像的组合几何变换(如平移+旋转+缩放),并理解变换顺序对结果的影响。素养目标3.技术报国的价值认同:通过了解国产空间站图像校正、自动驾驶视角转换等案例,理解图像几何变换在国家科技发展中的基础支撑作用,树立“小技术、大贡献”的职业使命感。2.问题导向的解决思维:面对倾斜、变形等实际问题,学会分析成因、选择合适方法,增强在实际岗位中“把图像调好用”的责任意识。1.严谨细致的工程习惯:在手动选取特征点、设置变换参数时,培养耐心与精准度,体现“细节决定成败”的职业态度。4.1基础几何变换基础几何变换核心是“线性变换”,不改变图像的像素值,仅调整像素的空间坐标,且变换后图像的形状不变。OpenCV中,平移、旋转、缩放均通过cv2.warpAffine()函数实现,该函数需传入“原始图像”“变换矩阵”和“目标图像尺寸”三个关键参数。图像平移4.1.1图像平移是将图像沿x轴即水平方向和y轴即垂直方向移动指定距离,核心是构建“平移矩阵”。1.原理与变换矩阵平移矩阵的格式为2×3的浮点型矩阵:dx:x轴方向偏移量,正数向右,负数向左;dy:y轴方向偏移量,正数向下,负数向上;矩阵需用np.float32()转换为float32类型(OpenCV要求)。2.核心函数:cv2.warpAffine()(注意:是“宽度

×

高度”,与图像shape的“高度

×

宽度”相反);flags:插值方法(可选,默认cv2.INTER_LINEAR,适合大多数场景);M:变换矩阵(2×3,float32类型);src:输入原始图像;语法:dst=cv2.warpAffine(src,M,dsize,flags)dsize:目标图像尺寸,格式为(width,height)返回值:dst,变换后的图像。3.示例:图像向右下平移示例4-1:将风景图向右平移100像素、向下平移50像素1.新建一个Python文件;2.导入必要的库;第一步:读取图像+格式验证直接使用图像文件名怕图像路径错了加载失败前提是图像文件与代码在同一目录实际项目里这种容错很重要3.示例:图像向右下平移第二步:获取图像尺寸后续的平移变换需要知道原始尺寸来确定输出图像的大小用解包赋值获取图像的高度、宽度和通道数为什么要了解图像尺寸?3.示例:图像向右下平移第三步:定义平移参数dx=100表示向右平移100像素x轴向右为正,y轴向下为正,与数学坐标系不同dy=50表示向下平移50像素3.示例:图像向右下平移第四步:构建平移矩阵为什么是这个形式?2×3平移矩阵新x坐标=1×原x+0×原y+dx新y坐标=0×原x+1×原y+dy3.示例:图像向右下平移第五步:应用平移变换为什么用(w,h)而不是(h,w)?执行变换:M:平移矩阵(w,h):输出图像尺寸因为OpenCV的dsize参数要求格式是(宽度,高度)3.示例:图像向右下平移第六步:添加文字标注添加标注:是文字起始位置字体类型字体大小2:线宽是红色BGR值3.示例:图像向右下平移第七步:结果显示与保存显示对比结果保存平移后的图像3.示例:图像向右下平移第八步:资源释放等待按键后关闭所有窗口,释放系统资源3.示例:图像向右下平移运行结果左窗口为原图,右窗口为平移后的图像,图像整体向右下移动,左上角出现黑色空白区域(因像素移出原范围,无新像素填充)。如图4-1所示:图4-1将风景图向右平移100像素、向下平移50像素图像旋转4.1.2图像旋转是将图像绕指定“旋转中心”旋转指定角度,核心是通过cv2.getRotationMatrix2D()自动生成“旋转矩阵”,无需手动构建。angle:旋转角度,正数为逆时针旋转,负数为顺时针旋转;center:旋转中心坐标,格式为(x,y),x为宽度方向坐标,y为高度方向坐标,通常取图像中心(w//2,h//2);语法:M=cv2.getRotationMatrix2D(center,angle,scale)scale:旋转后的缩放系数,1.0表示不缩放,0.8表示缩小为原图的80%,1.2表示放大为120%;返回值:M,2×3的旋转矩阵,float32类型,直接传入cv2.warpAffine()即可。1.核心函数:cv2.getRotationMatrix2D()2.示例:图像绕中心旋转示例4-2:将人物图绕中心逆时针旋转45度,不缩放;顺时针旋转90度,缩放0.81.新建一个Python文件;2.导入必要的库;第一步:旋转原理理解角度正数为逆时针旋转,负数为顺时针旋转旋转的核心:通过RotationMatrix2D()自动生成旋转矩阵,无需手动构建缩放系数控制图像大小变化2.示例:图像绕中心旋转第二步:OpenCV函数实现(推荐)2×3旋转矩阵为什么要设置旋转中心为图像中心?应用仿射变换是为了让图像绕中心旋转而不是左上角,这样视觉效果更自然。2.示例:图像绕中心旋转第三步:参数设置与效果验证逆时针45度,不缩放;scale=1.0为什么要测试不同参数?为了理解每个参数的实际影响,为实际项目中的参数调优积累经验。顺时针90度,缩放0.8(缩小)2.示例:图像绕中心旋转第四步:结果标注与显示添加文字标注是为了清晰区分不同旋转效果,方便对比分析。2.示例:图像绕中心旋转第五步:结果显示与保存显示所有处理结果进行对比通过多窗口显示,直观感受不同旋转参数的效果差异,保存处理结果便于后续使用。2.示例:图像绕中心旋转第六步:资源释放等待按键后关闭所有窗口,释放系统资源2.示例:图像绕中心旋转运行结果三个窗口分别显示原图、逆时针45度旋转图,边缘有裁剪,因旋转后部分像素超出原尺寸;顺时针90度缩放图,图像缩小且无明显裁剪。如图4-2所示图4-2将人物图绕中心逆时针旋转45度(不缩放)和顺时针旋转90度(缩放0.8)图像缩放4.1.3图像缩放是调整图像的尺寸,核心是cv2.resize()函数,支持两种缩放方式:①

指定目标尺寸;②

指定缩放比例,且可通过“插值方法”控制缩放后的图像质量。1.核心函数:cv2.resize()fy:y轴方向的缩放比例,通常与fx一致,避免图像拉伸;dsize:目标尺寸,格式为(width,height)(若为None,则通过fx和fy计算);src:输入原始图像;语法:dst=cv2.resize(src,dsize,fx,fy,interpolation)fx:x轴方向的缩放比例,如0.5表示缩小为50%,2表示放大为200%;interpolation:插值方法,见表4-1;返回值:dst,缩放后的图像。1.核心函数:cv2.resize()表4-1常见的插值方法:插值方法特点适用场景cv2.INTER_NEAREST最近邻插值,速度最快,质量最差快速预览,对质量要求低的场景cv2.INTER_LINEAR双线性插值,速度较快,质量中默认方法,大多数缩放场景cv2.INTER_CUBIC双三次插值,速度慢,质量高图像放大,如放大细节cv2.INTER_AREA区域插值,适合缩小,避免模糊图像缩小,如缩略图表4-1常用插值方法及适用场景示例4-3:将文本图缩小为原图的50%,再放大为原图的200%,对比不同插值方法1.新建一个Python文件;2.导入必要的库;2.示例:不同插值方法的缩放效果对比第一步:缩放原理理解cv2.resize()函数调整图像尺寸因为不同的算法在速度和质量上有权衡,需要根据实际需求选择。为什么要用不同的插值方法?直接指定目标尺寸(dsize)或使用缩放比例(fx,fy)2.示例:不同插值方法的缩放效果对比第二步:OpenCV函数实现(核心)cv2.resize()函数调整图像尺寸直接指定目标尺寸(dsize)或使用缩放比例(fx,fy)为什么要用INTER_AREA?因为这是图像缩小时的推荐方法,能避免模糊和锯齿现象。2.示例:不同插值方法的缩放效果对比第三步:不同插值方法对比(理解原理)为什么要对比三种方法?是为了让大家直观感受不同插值方法在图像放大时的质量差异,为实际项目中的方法选择提供依据。2.示例:不同插值方法的缩放效果对比第四步:结果标注与显示添加文字标注是为了清晰区分不同插值方法的效果,方便对比分析2.示例:不同插值方法的缩放效果对比第五步:结果显示与保存通过多窗口显示,直观感受不同插值方法的质量差异,理解各种方法的适用场景。显示所有处理结果进行对比2.示例:不同插值方法的缩放效果对比第六步:资源释放通过多窗口显示,直观感受不同插值方法的质量差异,理解各种方法的适用场景。显示所有处理结果进行对比等待按键后关闭所有窗口,释放系统资源2.示例:不同插值方法的缩放效果对比如图4-3所示图4-3将文本图缩小为原图的50%,再放大为原图的200%,对比不同插值方法INTER_NEAREST放大的文本图最模糊,文字边缘有锯齿;INTER_LINEAR中等清晰,INTER_CUBIC最清晰,文字边缘平滑。证明

“放大图像时,双三次插值质量最优”。运行结果图像翻转4.1.4图像翻转是将图像沿水平或垂直方向“镜像翻转”,核心是cv2.flip()函数,操作简单且无需变换矩阵,适合快速调整图像方向。1.核心函数:cv2.flip()flipCode:翻转方向(关键参数):

flipCode=1:水平翻转,左右镜像,如人脸左右翻转;

flipCode=0:垂直翻转,上下镜像,如风景图上下颠倒;

flipCode=-1:水平+垂直双向翻转,左右且上下镜像;src:输入原始图像;语法:dst=cv2.flip(src,flipCode)返回值:dst,翻转后的图像。示例4-4:将对称的建筑图进行三种翻转,观察镜像效果1.新建一个Python文件;2.导入必要的库;2.示例:三种翻转方式对比第一步:翻转原理理解通过cv2.flip()函数实现图像镜像变换,无需复杂的变换矩阵读取图像为什么要用不同的flipCode?不同参数对应不同的镜像方向2.示例:三种翻转方式对比第二步:OpenCV函数实现(核心)为什么要用对称建筑图?因为对称结构的图像在翻转后效果更明显,便于观察和理解翻转的本质。2.示例:三种翻转方式对比第三步:结果标注与显示添加文字标注是为了清晰区分不同翻转方式的效果,特别是标注对应的flipCode值,加深参数记忆。2.示例:三种翻转方式对比第四步:结果显示与保存通过多窗口显示,直观感受三种翻转方式的效果差异,理解各种翻转的实际应用场景。显示所有处理结果进行对比2.示例:三种翻转方式对比第五步:资源释放等待按键后关闭所有窗口释放系统资源2.示例:三种翻转方式对比运行结果如图4-4所示,水平翻转图与原图左右对称,建筑的门从左侧变右侧;垂直翻转图上下颠倒,天空在下方,地面在上方;双向翻转图同时左右和上下镜像,效果直观。图4-4

4.2仿射变换仿射变换(AffineTransformation)是“基础几何变换的组合”,能同时实现平移、旋转、缩放、倾斜,核心特点是“保持平行线不变”;变换前的平行线,变换后仍为平行线,如矩形变换后为平行四边形,但不会变成梯形。原理与关键条件4.2.1仿射变换核心是“三个对应点”:通过确定原始图像上的3个非共线点(不在同一直线上),以及变换后这3个点的目标位置,OpenCV会自动计算出仿射变换矩阵,进而应用到整个图像。1.核心函数dst_pts:目标图像上对应的3个点,格式与src_pts一致;src_pts:原始图像上的3个点,格式为np.float32([[x1,y1],[x2,y2],[x3,y3]]);cv2.getAffineTransform(src_pts,dst_pts):生成仿射变换矩阵返回值:2×3的仿射矩阵(float32类型);cv2.warpAffine():应用仿射变换(与基础变换共用该函数)。2.应用场景仿射变换常用于“轻微倾斜校正”,如:扫描的文本图像轻微倾斜,矩形文本框变平行四边形;1.拍摄的名片轻微倾斜,需校正为正面平行四边形。2.4.2.2示例:文本图像倾+斜校正示例4-5:将轻微倾斜的文本图(平行四边形)校正为水平文本图(矩形)1.新建一个Python文件;2.导入必要的库;第一步:读取图像+格式验证直接使用图像文件名加个判断实际项目里这种容错很重要前提是图像文件与代码在同一目录怕图像路径错了加载失败,及时提示4.2.2示例:文本图像倾+斜校正第二步:选择原始图像三个点为什么要选三个点?仿射变换需要至少三对非共线点,才能唯一确定变换矩阵。仿射变换的核心关键要求:这三个点不能在同一直线上,否则无法计算出有效的变换矩阵。4.2.2示例:文本图像倾+斜校正第三步:定义目标位置三个点设置校正后的目标位置数学原理:通过这三对点的对应关系,OpenCV可以计算出从倾斜平面到水平平面的仿射变换矩阵。将右上角点的y坐标从40调整为604.2.2示例:文本图像倾+斜校正第四步:可视化标记点验证点选择是否正确(0,255,0):绿色BGR值在原图上绘制标记5:圆点半径-1:填充圆点4.2.2示例:文本图像倾+斜校正第五步:生成仿射变换矩阵核心计算根据三对对应点计算出2×3的仿射变换矩阵4.2.2示例:文本图像倾+斜校正第六步:应用仿射变换执行实际变换M:变换矩阵将倾斜的文本"拉直"成水平排列(w,h):输出图像尺寸与原图一致核心计算根据三对对应点计算出2×3的仿射变换矩阵4.2.2示例:文本图像倾+斜校正第七步:结果显示与保存显示对比结果结果显示保存校正后的图像4.2.2示例:文本图像倾+斜校正第八步:资源释放结果显示保存校正后的图像等待按键后关闭所有窗口,释放系统资源4.2.2示例:文本图像倾+斜校正运行结果如图4-5所示,左窗口为原图,绿色圆点标记3个原始点,文本倾斜;右窗口为校正后的图像,可以很明显的看出改善效果,从而证明仿射变换能有效校正轻微倾斜。图4-54.3透视变换透视变换(PerspectiveTransformation是比仿射变换更灵活的“非线性变换”,核心特点是“不保持平行线不变”;变换前的平行线,变换后可相交,如矩形变换后为梯形、任意四边形,能实现“视角转换”,常用于严重倾斜的图像校正。原理与关键条件4.3.1透视变换透视变换的核心是“四个对应点”:需确定原始图像上的4个非共线点,通常为物体的四个角点,如身份证的四个角,以及变换后这4个点的目标位置,通常为矩形的四个角,如正面视图的矩形,OpenCV通过这8个坐标计算“透视矩阵”。1.核心函数dst_pts:目标图像上对应的4个点,格式与src_pts一致,需为矩形,确保校正后为正面视图;src_pts:原始图像上的4个点,格式为np.float32([[x1,y1],[x2,y2],[x3,y3],[x4,y4]]);cv2.getPerspectiveTransform(src_pts,dst_pts):生成透视变换矩阵返回值:3×3的透视矩阵,float32类型,与仿射矩阵的2×3不同。1.核心函数dsize:目标图像尺寸;语法:dst=cv2.warpPerspective(src,M,dsize);cv2.warpPerspective():应用透视变换通常根据目标点计算,确保校正后的物体完整显示。2.应用场景拍摄的倾斜身份证,从斜上方拍摄,呈梯形校正为正面矩形;1.倾斜的书本封面校正为正面视图;2.道路监控图像中的车辆视角转换为正面视图。3.透视变换常用于“严重倾斜校正”或“视角转换”,如:4.3.2示例:书本封面透视校正示例4-6:将从斜上方拍摄的书本封面(梯形)校正为正面矩形1.新建一个Python文件;2.导入必要的库;第一步:读取图像+格式验证直接使用图像文件名怕图像路径错了加载失败前提是图像文件与代码在同一目录实际项目里这种容错很重要4.3.2示例:书本封面透视校正第二步:选择原始图像四个点透视变换的核心为什么要选四个点因为透视变换需要四对点才能唯一确定3×3的透视变换矩阵。关键要求:这四个点必须是物体的四个角点,且按顺时针或逆时针顺序排列。4.3.2示例:书本封面透视校正第三步:定义目标位置四个点设置校正后的目标位置定义了一个300×280像素的矩形因为像素坐标从0开始,最大坐标是width-1和height-1。数学原理:通过这四对点的对应关系,OpenCV可以计算出从倾斜视角到正面视角的透视变换矩阵。为什么尺寸要减1?4.3.2示例:书本封面透视校正第四步:可视化标记点验证点选择是否正确在原图上绘制标记(0,0,255):红色BGR值6:圆点半径-1:填充圆点4.3.2示例:书本封面透视校正第五步:生成透视变换矩阵验证点选择是否正确在原图上绘制标记(0,0,255):红色BGR值6:圆点半径-1:填充圆点核心计算这个函数根据四对对应点计算出3×3的透视变换矩阵,实现了从倾斜视角到正面视角的数学映射。4.3.2示例:书本封面透视校正第六步:应用透视变换执行实际变换这一步将倾斜的书本封面"拉直"成正面矩形3×3透视矩阵输出图像的目标尺寸4.3.2示例:书本封面透视校正第七步:结果显示与保存显示对比结果:保存校正后的图像4.3.2示例:书本封面透视校正第八步:资源释放显示对比结果:保存校正后的图像等待按键后关闭所有窗口,释放系统资源4.3.2示例:书本封面透视校正运行结果如图4-6所示右侧窗口为原图(红色圆点标记书本四个角,呈梯形),左侧窗口为校正后的图像(书本变为正面矩形,文字清晰且无倾斜),证明透视变换能有效处理严重倾斜的图像。图4-6将从斜上方拍摄的书本封面(梯形)校正为正面矩形注意:本程序在运行前需要手动标注书本的四个角的具体位置,图4-6中用红色框线框出来的部分就是四个角的具体坐标,读者可以尝试换一张倾斜的图片来再次做该示例,学习如何标注角的位置。

任务实践任务实践任务1:

图像组合变换:平移+旋转+缩放1.读取一张风景图像;2.按顺序执行以下变换:

向右平移50像素、向上平移30像素;绕图像中心逆时针旋转30度,缩放0.9;缩小为变换后图像的80%(用INTER_AREA插值);3.显示“原图→平移图→旋转图→缩放图”完整流程,保存最终缩放图为

“combo_t

温馨提示

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

评论

0/150

提交评论