计算机视觉技术应用项目化教程 课件 项目4 基于OpenCV处理图像_第1页
计算机视觉技术应用项目化教程 课件 项目4 基于OpenCV处理图像_第2页
计算机视觉技术应用项目化教程 课件 项目4 基于OpenCV处理图像_第3页
计算机视觉技术应用项目化教程 课件 项目4 基于OpenCV处理图像_第4页
计算机视觉技术应用项目化教程 课件 项目4 基于OpenCV处理图像_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

项目四:基于OpenCV处理图像打造一个简单的图像标注工具COMPUTERVISION·计算机视觉系列课程任务导入:打造一个简单的图像标注工具【案例背景】在自动驾驶、医疗影像分析等领域,我们常常需要对图像中的特定目标进行标注,例如用矩形框出车辆,用圆形标记病灶,这是实现智能分析的重要一步。【面临挑战】如何利用OpenCV在图像上精确地绘制出这些几何图形,并灵活添加必要的文字说明?如何保证绘制效果清晰且不破坏原图的关键信息?【引入课题】本项目将学习如何使用OpenCV的核心绘图函数,在图像上绘制直线、矩形、圆形等基本图形,并添加文字标签,为后续开发一个功能完备的图像标注工具打下坚实基础。【本项目任务】1.在图像上绘制一个蓝色矩形框,精准框出目标物体。

2.在矩形框旁添加红色文字标签,说明目标类别。

3.对标注后的图像执行缩放与翻转的变换操作。本项目学习目标知识目标Knowledge●理解图像通道:掌握图像通道的拆分与合并原理,理解不同色彩空间的通道特性。●掌握绘图函数:熟悉OpenCV中在图像上绘制直线、矩形、圆形及添加文字的函数用法。●理解几何变换:掌握图像缩放、翻转、平移和旋转等几何变换背后的矩阵运算原理。●掌握阈值处理:深入理解固定阈值、自适应阈值和Otsu二值化算法的适用场景与原理。●理解算术运算:掌握图像加法、加权叠加以及位运算在图像处理中的逻辑与应用。能力目标Skills🎯图像绘制能力

能独立编写Python代码,在任意图像上精确绘制各类几何图形并添加文本信息。🔄图像变换能力

熟练运用OpenCV函数对图像进行缩放、翻转、裁剪等操作,适应不同处理需求。✂️图像分割能力

能够根据实际场景选择正确的阈值方法,实现前景与背景的有效分割。🧩图像融合能力

灵活运用算术运算,将多张图像进行叠加、混合或组合,实现创意合成效果。素质目标Competence🧠培养逻辑思维

通过分析不同图像处理技术的原理、参数差异及适用场景,锻炼对复杂问题的分析能力,培养严谨的逻辑推理与抽象思维能力。🛠️提升实践能力

在动手编写代码解决实际图像处理问题的过程中,不断增强工程实践能力和调试排错能力,提升解决实际问题的综合素质。课程目录CONTENTS01OpenCV图像处理基础•图像通道的拆分与合并

•在图像上绘制图形与文字02图像的几何变换•图像缩放

•图像翻转03图像的阈值处理•固定阈值与自适应阈值

•Otsu二值化04图像的算术与位运算•图像加法与加权叠加

•图像位运算与掩膜操作课程介绍与学习目标学习情境在当今的计算机视觉项目中,图像是信息的核心载体。本课程将带领大家深入探索如何利用OpenCV库对图像进行各种处理,从基础的通道操作到复杂的几何变换和算术运算。核心知识•色彩空间:掌握OpenCV默认的BGR格式与常见RGB格式的转换逻辑。•基础操作:熟练掌握图像的拆分、合并、绘制、缩放及旋转等基础功能。•核心技术:深入理解并实践阈值处理、平滑处理、形态学操作等关键技术。学习目标•知识层面:透彻理解图像处理的基本概念和主流算法背后的数学与逻辑原理。•技能层面:能独立调用OpenCV库函数,高效完成各类常规的图像处理任务。•应用层面:具备解决实际问题的能力,能完成文档扫描、简单目标识别等项目。第一部分:OpenCV图像处理基础▍任务4.1:图像通道的拆分与合并核心概念:BGR色彩模式彩色图像在OpenCV中默认以BGR(蓝、绿、红)三个独立通道的形式存储。在进行色彩调整、滤镜处理时,我们常需要分离出单个颜色通道进行独立计算,处理后再将其重新组合。核心操作函数●cv2.split(img):将图像拆分为独立的B,G,R单通道灰度图。返回一个包含三个数组的列表。●cv2.merge([b,g,r]):将处理后的单通道图像按顺序重新合并为一张完整的彩色图像。输入必须为一个包含三个元素的列表。色彩空间与通道可视化

不同色彩空间(如RGB,HSV,YCrCb)拥有不同的色域范围。在OpenCV中,掌握通道拆分与合并是理解色彩空间转换与处理的基石。任务4.1:代码实现与分析任务要求读取一张彩色图片,使用图像处理库将其拆分为独立的B、G、R颜色通道。实现两个关键的可视化操作:1.单独显示拆分出的蓝色通道分量,观察其灰度表现。2.构造并显示一张仅保留蓝色通道、其余通道清零的彩色图片。代码实现(Python)#1.读取图像并拆分通道img=cv2.imread("HappyFish.jpg")b,g,r=cv2.split(img)#2.构造仅保留蓝色的三通道图g0=np.zeros_like(b)img_blue=cv2.merge([b,g0,r0])#3.分别显示对比cv2.imshow("BlueChannel(Gray)",b)cv2.imshow("OnlyBlue",img_blue)关键区别解析直接显示`b`变量:呈现为灰度图。因为拆分后的`b`是单通道矩阵,OpenCV默认将其作为灰度图像渲染,无法体现色彩信息。显示合并后的`img_blue`:呈现为蓝色调的彩色图。虽然G、R通道数值为0,但这是一个完整的三通道矩阵,系统能正确解析并显示出蓝色分量。任务4.2:在图像上绘制图形与文字💡核心概念:OpenCV提供了丰富的绘图功能,可以在图像上绘制各种几何形状和添加文字注释,常用于结果可视化与目标标记。常用绘图函数▫️`cv2.line(img,pt1,pt2,color,thickness)`:绘制直线,定义起点和终点坐标。▫️`cv2.rectangle(img,pt1,pt2,color,thickness)`:绘制矩形,定义左上角和右下角。▫️`cv2.circle(img,center,radius,color,thickness)`:绘制圆形,定义圆心和半径。▫️`cv2.ellipse(...)`:绘制椭圆,需指定中心点、长/短轴、旋转角度等。▫️`cv2.putText(img,text,org,fontFace,...)`:在图像指定位置绘制文本字符串。通用参数解析img·画布载体

需要在其上进行绘制操作的输入/输出图像对象,操作会直接修改原图。color·颜色定义

形状的颜色,使用BGR格式的元组表示,例如红色为`(0,0,255)`。thickness·线条粗细

正数代表线条的像素宽度;若为-1,则表示填充整个图形内部。任务4.2:综合绘图案例任务目标与要求在一张800x400的空白白色图像上,结合使用绘图函数,完成以下操作:

1.绘制分割线,划分图像区域。

2.随机绘制多个矩形、圆形与椭圆。

3.添加自定义文本标签。#1.创建背景与分割线img=np.ones((400,800,3),dtype=np.uint8)*255cv2.line(img,(0,200),(800,200),(0,0,0),3)#2.绘制随机形状(矩形、圆、椭圆)cv2.rectangle(img,pt1,pt2,color,3)#随机颜色与位置cv2.circle(img,(100,300),r,(0,0,255),random_thickness)#3.添加文字标签并展示cv2.putText(img,'OpenCV',(320,320),cv2.FONT_HERSHEY_SIMPLEX,3,(0,0,255),15)代码运行效果预览•左上角:3个颜色与位置均随机生成的矩形。

•左下角:一组同心、不同粗细的蓝色圆形。

•右上角:3个不同旋转角度的红色椭圆。

•右下角:醒目的红色OpenCV文字标识。拓展学习:绘制中文字符核心痛点:OpenCV原生函数cv2.putText()仅支持ASCII字符集,直接输入中文会显示为乱码或方框,无法满足本地化需求。解决方案:引入PythonImagingLibrary(PIL/Pillow)库,利用其强大的文字渲染能力,通过图像格式转换实现中文绘制。🔄关键步骤拆解01.格式转换

OpenCV(BGR)➔PIL(RGB)02.资源加载

使用ImageFont加载中文字体文件03.绘制文字|用ImageDraw渲染中文04.还原格式|PIL➔OpenCV(BGR)importcv2,numpyasnp

fromPILimportImage,ImageDraw,ImageFont

img_cv=cv2.imread("your_img.jpg")

#1.格式转换(BGR->RGB)

img_pil=Image.fromarray(cv2.cvtColor(img_cv,cv2.COLOR_BGR2RGB))

draw=ImageDraw.Draw(img_pil)

font=ImageFont.truetype("simhei.ttf",40)

draw.text((10,10),"OpenCV中文显示成功!",font=font,fill=(255,0,0))

img_cv=cv2.cvtColor(np.array(img_pil),cv2.COLOR_RGB2BGR)✅最终效果:

成功在OpenCV窗口中渲染出清晰的中文文本,解决了乱码问题。可灵活调整字体、大小与颜色。第二部分:图像的几何变换任务4.3:图像缩放(ImageResizing)核心概念改变数字图像的物理尺寸大小,在保持图像原有内容的基础上,实现放大(ZoomIn)或缩小(ZoomOut)操作。OpenCV关键函数:cv2.resize()cv2.resize(src,dsize[,fx,fy[,interpolation]])参数说明:•src/dsize:输入图像/目标尺寸(width,height),若为None则用fx/fy比例缩放。•fx,fy:水平/垂直方向的缩放系数(例如:0.5表示缩小一半)。•interpolation:插值方式(默认:放大用INTER_LINEAR,缩小用INTER_AREA)。插值方法速查:缩小:INTER_AREA|放大:INTER_LINEAR(推荐)|高质量:INTER_CUBIC任务4.3:代码实现任务目标与分析📝任务要求:对一张彩色图片进行几何变换:水平方向拉伸为原尺寸的2倍,垂直方向压缩为原尺寸的0.5倍。💡实现思路:代码展示了两种等效方法:1.方法一:手动计算宽高,通过dsize参数指定新尺寸。2.方法二:通过设置fx,fy直接指定缩放比例,更加简洁。#导入OpenCV库并读取图像importcv2img=cv2.imread(r"../colorpicture/HappyFish.jpg")rows,cols=img.shape[:2]#获取高和宽#方法一:指定目标尺寸dsize(宽,高)new_size=(int(cols*2),int(rows*0.5))rst1=cv2.resize(img,new_size)#方法二:指定缩放因子fx,fy(更简洁)rst2=cv2.resize(img,None,fx=2,fy=0.5)#显示图像并释放资源cv2.imshow("Original",img);cv2.imshow("Method1",rst1);cv2.imshow("Method2",rst2)cv2.waitKey(0);cv2.destroyAllWindows()任务4.4:图像翻转核心概念图像翻转是指将图像按照特定轴进行镜像变换。它是计算机视觉中常用的基础操作,广泛应用于数据增强、对称图像生成及镜像特效制作。关键函数:cv2.flip(src,flipCode)•flipCode=0:绕X轴翻转(垂直翻转,上下颠倒)•flipCode>0:绕Y轴翻转(水平翻转,左右镜像)•flipCode<0:同时绕X轴和Y轴翻转(对角/原点翻转)💻代码实现(Python)img=cv2.imread("HappyFish.jpg")flip_x=cv2.flip(img,0)#垂直翻转(X轴)flip_y=cv2.flip(img,1)#水平翻转(Y轴)flip_xy=cv2.flip(img,-1)#对角翻转(X+Y轴)cv2.imshow("AllFlips",stackImages(0.5,([img,flip_y],[flip_x,flip_xy])))📸效果预览左侧图片展示了将原始图与三种翻转后的图像进行网格拼接的最终效果。可以直观地对比不同翻转模式的差异。第三部分:图像的阈值处理任务4.5:图像的阈值处理核心概念一种简单高效的图像分割技术。通过设定一个数值作为“界限”,将灰度图像中的像素点分为两类:大于阈值的部分和小于阈值的部分,从而提取图像中的目标区域。OpenCV关键函数:cv2.threshold(src,thresh,maxval,type)🔸参数解析:src:输入图像(必须为灰度图)thresh:设定的分割阈值(0-255)maxval:二值化的最大值(通常为255)🔹常见类型(type):•BINARY:大于阈值取maxval,否则0•BINARY_INV:大于阈值取0,否则maxval•TRUNC/TOZERO:截断或归零模式💡实用技巧1.阈值选取:如果不确定阈值,可尝试从127开始测试,或使用Otsu二值化自动计算。

2.应用场景:常用于去除背景、提取轮廓、文档扫描等对黑白对比要求高的场景。任务4.5:代码实现与效果▍代码实现(Python&OpenCV)importcv2importopencv_add_hvstack#1.以灰度模式读取输入图像img=cv2.imread("HappyFish.jpg",cv2.IMREAD_GRAYSCALE)#2.应用五种不同的固定阈值处理方法(阈值=150)_,bin=cv2.threshold(img,150,255,cv2.THRESH_BINARY)_,inv=cv2.threshold(img,150,255,cv2.THRESH_BINARY_INV)_,trun=cv2.threshold(img,150,255,cv2.THRESH_TRUNC)_,zero=cv2.threshold(img,150,255,cv2.THRESH_TOZERO)#3.合并并展示所有处理结果stack=opencv_add_hvstack.stackImages(0.8,([img,bin,inv],[trun,zero,cv2.THRESH_TOZERO_INV]))cv2.imshow("ThresholdComparison",stack);cv2.waitKey(0)▍运行效果展示从左到右,从上到下依次展示了:原始灰度图、二值化(Binary)、反二值化(Inv)、截断(Trunc)、取零(ToZero)、反取零(ToZeroInv)的视觉效果差异。任务4.5:高级阈值处理Otsu二值化(大津算法)适用于直方图呈现明显双峰分布的图像,算法能自动计算并确定一个最佳阈值,最大化前景与背景的类间方差。cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)自适应阈值(AdaptiveThreshold)解决光照不均问题,基于像素周围的小邻域计算局部阈值。关键参数:•Method:均值(ADAPTIVE_THRESH_MEAN_C)/高斯加权(GAUSSIAN_C)

•BlockSize:计算阈值的邻域大小(需为奇数)。

•C:从均值/加权均值中减去的常数,用于微调对比度。场景与效果对比上方展示了自适应阈值处理后的图像效果。相比于全局阈值,它能很好地保留暗部与亮部的细节,常用于文档扫描、车牌识别、以及光照条件复杂的户外场景分析。第四部分:图像的算术与位运算任务4.6:图像的加法处理核心概念图像加法在计算机视觉中是基础且常用的操作,主要应用场景包括:●调整图像整体亮度:给每个像素点加上一个固定值。●图像叠加融合:将两张或多张图像按比例混合,常用于添加水印、融合场景等。两种加法逻辑1.Numpy加法(`+`)基于“模运算”:(a+b)%256。当数值超过255时,会像钟表一样循环,可能导致画面色彩异常(如亮度反转)。2.OpenCV加法(`cv2.add()`)基于“饱和运算”:min(a+b,255)。超过255的数值直接取255,结果更符合人眼视觉习惯,是图像处理的首选。加权叠加(Blending)通过cv2.addWeighted实现两张图片的平滑过渡,公式:dst=src1×α+src2×β+γ•α/β:第一/二张图片的权重(通常满足α+β=1)。

•γ:亮度调整量,为图像整体提供一个偏移量。任务4.6:代码实现与效果💻代码逻辑解析(Python+OpenCV)importcv2importcopy#1.读取并预处理图像img_bg=cv2.imread(r"../colorpicture/HappyFish.jpg")img_logo=cv2.imread(r"../colorpicture/opencv-logo-white.png")img_logo=cv2.resize(img_logo,None,fx=0.5,fy=0.5)#2.计算背景图中放置Logo的中心区域(ROI)h_bg,w_bg=img_bg.shape[:2]h_logo,w_logo=img_logo.shape[:2]center_y,center_x=(h_bg-h_logo)//2,(w_bg-w_logo)//2roi=img_bg[center_y:center_y+h_logo,center_x:center_x+w_logo]#3.核心操作:加权叠加(Logo透明度0.4,背景透明度0.6)blended_roi=cv2.addWeighted(img_logo,0.4,roi,0.6,0)#4.将融合后的区域放回原图并显示img_result=copy.deepcopy(img_bg)img_result[center_y:center_y+h_logo,center_x:center_x+w_logo]=blended_roicv2.imshow("ImageBlending",img_result)cv2.waitKey(0)✨运行效果演示🔑关键步骤说明:•定位(ROI):精确计算背景图中心位置,确保Logo居中放置。

•加权融合:通过cv2.addWeighted控制透明度,实现Logo与背景的柔和叠加。

•结果回写:将融合后的区域替换回原图,保证背景图其他部分不受影响。任务4.7:图像的位运算核心概念:位运算在图像处理中常用于掩膜(Masking)操作,可以精确地提取或修改图像的特定区域,实现对图像局部区域的精准控制。📚常用位运算函数(OpenCV)•cv2.bitwise_and(src1,src2[,mask]):按位与(最常用于掩膜操作)•cv2.bitwise_or(src1,src2[,mask]):按位或(用于叠加图像区域)•cv2.bitwise_not(src)/cv2.bitwise_xor:按位非(取反)/按位异或🔑掩膜核心逻辑•任何数值与0按位与→结果为0(黑色/被屏蔽)•任何数值与255(二进制11111111)按位与→保持原样(显示/保留)图示:利用白色(255)的圆形掩膜与背景图进行按位与操作,

最终仅保留背景图中对应掩膜的圆形区域。任务4.7:代码实现与效果▍核心代码逻辑(Python+OpenCV)#1.读取背景图与带Alpha通道的Logoimg_bg=cv2.imread("HappyFish.jpg")img_logo=cv2.imread("logo.png",cv2.IMREAD_UNCHANGED)#2.分离Logo的颜色(BGR)与透明通道(掩膜)img_bgr,img_mask=img_logo[:,:,:3],img_logo[:,:,3]#3.关键位运算:利用掩膜叠加Logoroi_bg=cv2.bitwise_and(roi,roi

温馨提示

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

评论

0/150

提交评论