人工基础导论 5_第1页
人工基础导论 5_第2页
人工基础导论 5_第3页
人工基础导论 5_第4页
人工基础导论 5_第5页
已阅读5页,还剩85页未读 继续免费阅读

下载本文档

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

文档简介

第7章计算机视觉从像素到智能感知:OpenCV与深度学习的视觉探索目录01计算机视觉概述02OpenCV图像魔法03深度学习计算机视觉04超级应用05实践案例与练习06思政与思考PART01计算机视觉概述什么是计算机视觉计算机视觉(ComputerVision,CV)计算机视觉的任务就是研究如何让计算机从一堆数字中"看懂"这个世界。当你看到一张猫的照片,你能瞬间脱口而出:"这是猫!"但对计算机来说,它面对的不是毛茸茸的触感,而是一堆冰冷的数字。本章学习路线从理解数字图像的底层表示出发,掌握基于OpenCV的图像变换与特征提取技术,最终探讨深度学习模型如何实现对现实世界的智能感知。我们将共同探索计算机如何跨越数字与现实的语义鸿沟,实现从"看见"到"看懂"。图像的色彩密码——像素像素(Pixel)图像是由无数个有颜色的小方格组成的,这些小方格就是像素(Pixel)。我们常说一张图像是500×500大小,实际指的是这张图像有500个像素高,500个像素宽。像素的特点像素没有固定的物理尺寸,取决于显示媒介的密度每个像素承载特定的颜色信息像素的排列组合构成了我们看到的画面黑白图像与灰度图像黑白图像(二值图像)也叫BinaryImage,采用1位(Bit)表示每个像素:

•0表示黑色,1表示白色

•简单且占空间小

•没有中间色调,无法精细表示图像

二值图像常用场景:

文档扫描、二维码识别、指纹识别等只需要区分前景和背景的场景。灰度图像GrayImage具有256个灰度等级:

•使用0~255表示,0=纯黑,255=纯白

•8位(bit)=1字节(Byte)存储

•介于纯黑与纯白之间有254个过渡等级

灰度图像常用场景:

医学影像、工业检测、人脸识别预处理等需要保留明暗信息但不需要色彩的场景。

彩色图像与RGB颜色模式RGB颜色模式最常用的颜色表示方法,由红(Red)、绿(Green)、蓝(Blue)三种基本颜色组成。三种颜色按照不同比例组合,形成各种我们看到的颜色。色彩组合示例(255,0,0)→纯红色(0,255,0)→纯绿色(0,0,255)→纯蓝色(255,255,0)→黄色(红色+绿色混合)(255,255,255)→白色(0,0,0)→黑色每个通道值0~255,采用三维数组存储:R通道、G通道、B通道。Alpha通道透明度通道(AlphaChannel)OpenCV在BGR色彩空间中,除了B、G、R通道外,还有A通道(Alpha通道),表示透明度。A值范围:0~255A=0:完全透明(背景可见)A=255:完全不透明中间值:半透明效果应用场景PNG格式是典型的拥有A通道的图像。Alpha通道广泛用于:图像合成、UI界面设计、视频叠加(字幕)、游戏特效等。计算机眼中的图像——矩阵表示图像=数字矩阵图像在计算机中被整齐地排列成矩阵(matrix),矩阵中的每一个数字表示像素值。黑白图像的矩阵二维矩阵:行数=图像高度(像素),列数=图像宽度(像素)。每个数字代表对应位置像素的亮度,0=最暗的黑色,255=最亮的白色。彩色图像的矩阵三维数组:第一维=R通道二维矩阵,第二维=G通道二维矩阵,第三维=B通道二维矩阵。每个通道的值都在0~255之间。PART02OpenCV图像魔法OpenCV——开源计算机视觉库什么是OpenCV?OpenCV(OpenSourceComputerVisionLibrary)封装了非常多的工具,无论是简单的图像查看,还是复杂的特征提取,它都能轻松应对。图像处理的本质图像是一个数字矩阵,对图像进行各种处理,实际上就是对这个矩阵进行加减乘除操作。想变亮就加上某个值,变暗就减去某个值。视觉程序的"开机三部曲"读取(Read):把硬盘里的图像文件转换为数字矩阵显示(Show):把数字矩阵"翻译"成肉眼能看懂的图像保存(Save):将处理后的矩阵保存为文件7.2.1图像的三部曲读取-显示-保存任何计算机视觉程序都离不开这三个基础步骤。就像我们看照片要先"拿起照片"(读取)、"睁开眼睛看"(显示),喜欢的话还要"放进相册"(保存)。安装OpenCVpipinstallopencv-pythonpipinstallnumpyOpenCV依赖NumPy库,两个库需要一起安装。安装完成后通过importcv2验证。读取图像——imread函数函数格式img=cv2.imread(img_path,flags)img_path:图像路径(相对或绝对路径)flags:读取格式标志(见右表)返回值成功读取返回numpy数组(ndarray),否则返回None。OpenCV默认色彩空间为BGR(非RGB),shape为(高度,宽度,通道数)。图像读取格式标识表7-1imread函数的flags参数标志值说明IMREAD_UNCHANGED-1保留原始数据,加载所有通道(含Alpha)IMREAD_GRAYSCALE0强制转为单通道8位灰度图IMREAD_COLOR1默认:转为3通道BGR彩色图IMREAD_ANYDEPTH2保留原始位深(16/32位)IMREAD_ANYCOLOR4尝试保留颜色格式IMREAD_REDUCED_GRAYSCALE_216灰度图,尺寸缩小1/2IMREAD_REDUCED_COLOR_217BGR彩色图,尺寸缩小1/2【例7-1】读取图像并查看图像信息例7-1importcv2img=cv2.imread('fruit.jpg')#读取图像print(img)#打印图像数组print(type(img))#输出数据类型print(img.shape)#输出数组形状print(img.dtype)#输出数组元素的数据类型print(img.size)#输出数组元素的个数输出:type为numpy.ndarray,shape为(361,556,3),dtype为uint8,size为602148。分别表示高度361像素、宽度556像素、3个通道(BGR)。【例7-2】修改图像像素例7-2importcv2y=100x=200img=cv2.imread('fruit.jpg')img[y:y+20,x:x+20]=[0,0,0]#将指定区域修改为黑色cv2.imshow('fruit',img)cv2.waitKey(0)通过将坐标(100:120,200:220)的像素值设为[0,0,0](黑色),在图像上形成一个20×20的黑色方块。这展示了直接操作像素矩阵的方法。显示图像——imshow函数函数格式cv2.imshow(winname,img)winname:窗口名称(字符串类型)img:numpy类型的图像数组支持单通道(灰度)、3通道(BGR)和4通道(BGRA)图像重要:配合waitKey()使用waitKey(0):无限等待,直到用户按任意键waitKey(1000):显示1秒后自动关闭不调用waitKey()窗口会一闪而过!【例7-3】显示图像例7-3importcv2img=cv2.imread('fruit.jpg')#读取图像cv2.imshow('MyPicture',img)#显示图像cv2.waitKey(0)#等待按键这是最基本的图像显示程序。imread读取图像为numpy数组,imshow将数组渲染到窗口,waitKey(0)保持窗口打开直到按键。截取图像区域【例7-4】截取彩色图像img=cv2.imread('fruit.jpg')

#截取200:300行,200:300列的所有通道

img[200:300,200:300,:]

cv2.imshow('MyPicture',

img[200:300,200:300,:])

cv2.waitKey(0)

彩色图像是三维数组,第三个维度用:表示选取所有通道。【例7-5】截取灰度图像img=cv2.imread('fruit.jpg',0)

#读取为灰度图像

#截取200:300行,200:300列

img[200:300,200:300]

cv2.imshow('MyPicture',

img[200:300,200:300])

cv2.waitKey(0)

灰度图像是二维数组,切片时无需第三个维度。【例7-6】截取单个通道图像例7-6importcv2img=cv2.imread('fruit.jpg')cv2.imshow('Blue',img[:,:,0])#显示B通道cv2.imshow('Green',img[:,:,1])#显示G通道cv2.imshow('Red',img[:,:,2])#显示R通道cv2.waitKey(0)OpenCV默认BGR顺序:[:,:,0]是蓝色通道,[:,:,1]是绿色通道,[:,:,2]是红色通道。每个通道显示的是一幅灰度图,亮度表示该颜色的强度。【例7-7】保存图像例7-7importcv2img=cv2.imread('fruit.jpg')cv2.imwrite('MyPicture.jpg',img)#保存为JPG格式#cv2.imwrite('output.png',img)#也可以保存为PNGimwrite将处理后的图像矩阵保存为文件。支持JPG、PNG、BMP、TIFF、WebP等格式。图像保存格式表7-2常用图像保存格式及特点格式扩展名特点JPEG.jpg/.jpeg有损压缩,支持质量参数(1-100),默认95PNG.png无损压缩,支持Alpha通道透明度TIFF.tif/.tiff支持多页、高位深(16/32位)BMP.bmp无压缩,文件较大WebP.webp支持有损/无损压缩,文件更小窗口管理【例7-8】创建窗口importnumpy,cv2

img=numpy.zeros((240,320),

dtype=numpy.uint8)

img[70:170,110:210]=255

dWindow('Win',

cv2.WINDOW_NORMAL)

cv2.imshow('Win',img)

cv2.waitKey(0)

namedWindow可创建可调整大小的窗口。【例7-9】调整窗口大小importcv2

img=cv2.imread('fruit.jpg')

s=img.shape

cv2.imshow('Win',img)

cv2.waitKey(500)

cv2.resizeWindow('Win',

(s[0]//2,s[1]//2))

cv2.waitKey(0)

resizeWindow可动态调整窗口大小。窗口标志常量表7-3namedWindow的flags参数常量说明WINDOW_NORMAL用户可以调整窗口大小WINDOW_AUTOSIZE默认值,窗口大小由图像决定WINDOW_FULLSCREEN窗口全屏显示WINDOW_GUI_EXPANDED显示状态栏和工具栏WINDOW_FREERATIO无比例限制显示图片色彩空间转换——cv2.cvtColor()常见色彩空间BGR:OpenCV默认色彩空间RGB:最常见的显示色彩空间(R和B通道互换)HSV:色相-饱和度-明度,适合颜色筛选HLS:色相-亮度-饱和度GRAY:灰度图(单通道)转换函数cv2.cvtColor(src,code):code指定转换方向BGR→RGB:cv2.COLOR_BGR2RGBBGR→GRAY:cv2.COLOR_BGR2GRAYBGR→HSV:cv2.COLOR_BGR2HSVHSV→BGR:cv2.COLOR_HSV2BGRHSV色彩筛选技巧HSV中H(0~179)表示颜色种类,S(0~255)表示饱和度,V(0~255)表示亮度。通过cv2.inRange()可按颜色范围提取目标区域。7.2.2创意绘图——在图像上画画OpenCV绘图函数一览cv2.line():绘制直线cv2.rectangle():绘制矩形cv2.circle():绘制圆形cv2.ellipse():绘制椭圆cv2.polylines():绘制多边形cv2.putText():添加文字cv2.arrowedLine():绘制箭头创建画布黑色画布:np.zeros((200,300,3),np.uint8)

白色画布:np.zeros((200,300,3),np.uint8)+255【例7-10】创建画布+【例7-11】绘制直线例7-10&例7-11#创建白色画布img=np.zeros((200,300,3),np.uint8)+255#创建黑色画布并绘制对角线img=np.zeros((200,320,3),np.uint8)cv2.line(img,(0,0),(320,200),(255,0,0),5)#蓝色对角线cv2.line(img,(320,0),(0,200),(0,255,0),5)#绿色对角线cv2.imshow('draw',img)cv2.waitKey(0)cv2.line(img,pt1,pt2,color,thickness):pt1起点,pt2终点,colorBGR颜色,thickness线宽。【例7-12】绘制矩形例7-12importnumpyasnp,cv2img=np.zeros((200,320,3),np.uint8)#画矩形,蓝色边框,线宽5cv2.rectangle(img,(20,20),(300,180),(255,0,0),5)#画矩形,绿色填充(thickness=-1表示填充)cv2.rectangle(img,(70,70),(250,130),(0,255,0),-1)cv2.imshow('draw',img)cv2.waitKey(0)cv2.rectangle(img,pt1,pt2,color,thickness):thickness=-1时填充整个矩形。【例7-13】绘制圆形+【例7-14】绘制椭圆例7-13&例7-14importnumpyasnp,cv2img=np.zeros((200,320,3),np.uint8)#画圆:圆心(160,100),半径80,蓝色边框cv2.circle(img,(160,100),80,(255,0,0),5)#画圆:绿色填充cv2.circle(img,(160,100),40,(0,255,0),-1)#画椭圆:中心、轴长、旋转角度、起止角度cv2.ellipse(img,(160,100),(120,50),45,10,250,(255,0,0),5)cv2.imshow('draw',img)cv2.waitKey(0)circle参数:(center,radius,color,thickness)。ellipse参数:(center,axes,angle,startAngle,endAngle,color,thickness)。【例7-15】绘制多边形+【例7-16】绘制文本例7-15&例7-16importnumpyasnp,cv2img=np.zeros((400,320,3),np.uint8)+255#多边形:定义顶点数组pts=np.array([[160,20],[20,100],[160,180],[300,100]],32)cv2.polylines(img,[pts],True,(255,0,0),5)#True=闭合#文本font=cv2.FONT_HERSHEY_SCRIPT_SIMPLEXcv2.putText(img,'Python',(50,100),font,2,(255,0,0),2)cv2.imshow('draw',img)cv2.waitKey(0)polylines:pts顶点数组,isClosed是否闭合。putText:text文本,org位置,fontFace字体,fontScale大小。【例7-17】绘制箭头+【例7-18】鼠标交互绘图例7-17&例7-18#箭头cv2.arrowedLine(img,(50,50),(50,150),(0,0,255),2)cv2.arrowedLine(img,(50,50),(300,50),(0,0,255),2)#鼠标回调:双击左键画圆,双击右键画矩形defdraw(event,x,y,flag,param):ifevent==cv2.EVENT_LBUTTONDBLCLK:cv2.circle(img,(x,y),20,(255,0,0),-1)elifevent==cv2.EVENT_RBUTTONDBLCLK:cv2.rectangle(img,(x,y),(x+20,y+20),(0,0,255),-1)cv2.setMouseCallback('drawing',draw)setMouseCallback为窗口绑定鼠标回调函数,可响应移动、点击、双击等事件。鼠标事件常量表7-4鼠标事件类型常量值说明EVENT_MOUSEMOVE0移动鼠标EVENT_LBUTTONDOWN1单击左键EVENT_RBUTTONDOWN2单击右键EVENT_LBUTTONUP4放开左键EVENT_LBUTTONDBLCLK7双击左键EVENT_RBUTTONDBLCLK8双击右键鼠标拖曳事件常量表7-5鼠标拖曳事件类型(flags参数)常量值说明EVENT_FLAG_LBUTTON1按住左键拖曳EVENT_FLAG_RBUTTON2按住右键拖曳EVENT_FLAG_MBUTTON4按住中间键拖曳EVENT_FLAG_CTRLKEY8按住Ctrl键不放EVENT_FLAG_SHIFTKEY16按住Shift键不放EVENT_FLAG_ALTKEY32按住Alt键不放关闭窗口与窗口调整关闭窗口cv2.destroyAllWindows():关闭所有OpenCV创建的窗口cv2.destroyWindow(winname):关闭指定名称的窗口调整窗口大小cv2.resizeWindow(winname,(width,height)):用于动态改变窗口大小。size为(width,height)二元组。使用流程1.namedWindow()创建可调整大小的窗口2.imshow()显示图像3.resizeWindow()调整窗口大小4.waitKey()等待按键5.destroyAllWindows()关闭所有窗口图像滤波与平滑为什么要滤波?图像在采集和传输过程中不可避免地会受到噪声污染。滤波可以去除噪声、平滑图像,为后续的边缘检测等操作做准备。常用滤波方法均值滤波cv2.blur(src,ksize):用邻域平均值替代当前像素,简单但会模糊边缘中值滤波cv2.medianBlur(src,ksize):用邻域中值替代,有效去除椒盐噪声高斯滤波cv2.GaussianBlur(src,ksize,sigmaX):加权平均,保留边缘效果更好双边滤波cv2.bilateralFilter(src,d,sigmaColor,sigmaSpace):保边去噪效果最佳内核大小(ksize)ksize必须是正奇数(如3、5、7),数值越大平滑效果越强但计算量也越大。高斯滤波的ksize可以设为(0,0)让OpenCV根据sigma自动计算。7.2.3边缘与轮廓检测概述什么是边缘?边缘是图像中像素值发生剧烈变化的位置,就像图像的"骨架线条",勾勒出物体的外形轮廓。边缘检测是计算机视觉中最基础也最重要的操作之一。三种经典边缘检测算子Sobel算子:基于梯度计算,分别求X和Y方向的梯度Laplacian算子:基于二阶导数,对噪声敏感但检测精细Canny算子:多步骤综合处理,效果最好最常用【例7-19】Sobel边缘检测例7-19importcv2img=cv2.imread('MyPicture.jpg')cv2.imshow('original',img)#Sobel边缘检测:计算Y方向梯度img2=cv2.Sobel(img,cv2.CV_64F,0,1)cv2.imshow('Sobel',img2)cv2.waitKey(0)cv2.Sobel(src,depth,dx,dy):depth为输出深度(CV_64F可存负值),dx=1计算X方向梯度,dy=1计算Y方向梯度。【例7-20】计算梯度绝对值例7-20importcv2,numpyasnpimg=cv2.imread('image.jpg',cv2.IMREAD_GRAYSCALE)#计算X方向梯度(使用可存储负值的类型)grad_x=cv2.Sobel(img,cv2.CV_32F,1,0)#取绝对值并转为uint8abs_grad_x=cv2.convertScaleAbs(grad_x)cv2.imshow('SobelX',abs_grad_x)cv2.waitKey(0)convertScaleAbs:将浮点梯度值取绝对值并转换为0-255范围的uint8类型,方便显示。【例7-21】Laplacian算子边缘检测例7-21importcv2img=cv2.imread('fruit.jpg')cv2.imshow('original',img)img2=cv2.Laplacian(img,cv2.CV_8U)#边缘检测cv2.imshow('Laplacian',img2)cv2.waitKey()cv2.Laplacian(src,ddepth):基于二阶导数的边缘检测。相比Sobel,Laplacian同时考虑所有方向,但对噪声更敏感。【例7-22】Canny边缘检测例7-22importcv2img=cv2.imread('fruit.jpg')cv2.imshow('original',img)#不同阈值的效果对比img2=cv2.Canny(img,50,100)#低阈值:检测到更多边缘img3=cv2.Canny(img,200,300)#高阈值:只检测强边缘cv2.imshow('min50,max100',img2)cv2.imshow('min200,max300',img3)cv2.waitKey()Canny是最经典的边缘检测算法。threshold1和threshold2控制边缘灵敏度:低值检测更多细节,高值只保留强边缘。Canny算法四步详解Canny算法的"集大成者"设计Canny并非单一算子,而是一套多步骤组合的标准化流程,由计算机科学家JohnCanny于1986年提出。核心目标是实现"精准、连续、快速"的最优边缘检测。四个步骤①高斯模糊降噪:对图像"磨皮",消除噪声干扰②Sobel算子边缘粗检测:计算X/Y方向梯度,得到每个像素的梯度幅值和方向③非极大值抑制(NMS):在邻域内只保留梯度最大的像素点,细化边缘为单像素宽④双阈值筛选连续边缘:高阈值确定真实边缘,低阈值排除伪边缘,中间值若与真实边缘相连则保留双阈值的关键作用梯度幅值>MaxVal→确定为真实边缘(直接保留)

梯度幅值<MinVal→确定为伪边缘(直接剔除)

MinVal≤梯度幅值≤MaxVal→若与真实边缘相连则保留,保证边缘连续性。轮廓查找与绘制cv2.findContours()在二值图像中查找物体的轮廓线。轮廓是连接具有相同颜色或强度的连续点的曲线。cv2.drawContours()将查找到的轮廓绘制在原图上。contourIdx=-1表示绘制所有轮廓。轮廓分析cv2.contourArea():计算轮廓面积cv2.arcLength():计算轮廓周长cv2.boundingRect():外接矩形cv2.minEnclosingCircle():最小包围圆【例7-23】查找并绘制轮廓例7-23importcv2,numpyasnpimg=cv2.imread('star.jpg')gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转灰度ret,img2=cv2.threshold(gray,125,255,cv2.THRESH_BINARY)#查找轮廓c,h=cv2.findContours(img2,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)#绘制轮廓:-1表示所有轮廓,红色,线宽2cv2.drawContours(img,c,-1,(0,0,255),2)cv2.imshow('Contours',img)cv2.waitKey(0)findContours参数:mode=RETR_TREE检索所有轮廓及层级关系,method=CHAIN_APPROX_SIMPLE压缩水平/垂直/对角线方向。7.2.4图像分割算法概述什么是图像分割?将图像划分为多个有意义区域的过程。就像给图像中的每个像素贴标签,同一物体共享同一标签。经典方法阈值分割:根据像素值分为前景和背景形态学操作:腐蚀、膨胀、开运算、闭运算分水岭算法:模拟水流分割粘连物体【例7-24】阈值分割——7种方法对比例7-24importcv2,numpyasnpimg=cv2.imread('lena.jpg')gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)_,a=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)_,b=cv2.threshold(gray,127,255,cv2.THRESH_BINARY_INV)_,c=cv2.threshold(gray,127,255,cv2.THRESH_TRUNC)_,d=cv2.threshold(gray,127,255,cv2.THRESH_TOZERO)_,e=cv2.threshold(gray,127,255,cv2.THRESH_TOZERO_INV)_,f=cv2.threshold(gray,127,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)_,g=cv2.threshold(gray,127,255,cv2.THRESH_BINARY+cv2.THRESH_TRIANGLE)THRESH_OTSU和THRESH_TRIANGLE使用算法自动选择最佳阈值(手动设定的127不起作用)。【例7-25】腐蚀操作+【例7-26】膨胀操作例7-25&例7-26importcv2,numpyasnpimg=cv2.imread('star.jpg')kernel=np.ones((5,5),np.uint8)#定义5×5内核#腐蚀:缩小前景物体,消除小噪点img_erode=cv2.erode(img,kernel,iterations=5)#膨胀:扩大前景物体,填补空洞img_dilate=cv2.dilate(img,kernel,iterations=5)腐蚀(erode):缩小白色区域,消除噪点。膨胀(dilate):扩大白色区域,填补空洞。两者常配合使用。【例7-27~31】形态学高级操作例7-27~31importcv2,numpyasnpkernel=np.ones((3,3),np.uint8)#开运算=先腐蚀后膨胀(消除小噪点)cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)#闭运算=先膨胀后腐蚀(填补小空洞)cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)#梯度=膨胀-腐蚀(获取轮廓)cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)#礼帽=原图-开运算|黑帽=闭运算-原图morphologyEx(op,kernel):op决定操作类型。开运算去噪,闭运算填洞,梯度取轮廓,礼帽提取亮特征,黑帽提取暗特征。形态学操作对照表表7-5形态学具名常数常数说明等价公式MORPH_ERODE腐蚀erode()MORPH_DILATE膨胀dilate()MORPH_OPEN开运算dilate(erode())MORPH_CLOSE闭运算erode(dilate())MORPH_GRADIENT形态学梯度dilate()-erode()MORPH_TOPHAT礼帽运算src-open()MORPH_BLACKHAT黑帽运算close()-src分水岭算法原理与步骤基于拓扑学的图像分割技术核心思想:将图像灰度值视为地形海拔,灰度值高→山峰,灰度值低→山谷。模拟"注水"过程:从谷底注水,不同集水盆的水汇合处即为分水岭(目标边界)。三个核心概念局部极小值:周围像素灰度都比它大的点,对应"谷底",是注水起始点集水盆:从一个局部极小值出发水流能到达的所有区域,对应一个待分割目标分水岭:不同集水盆的边界,对应分割后的目标边界六个执行步骤①图像预处理:BGR→灰度→中值滤波→阈值分割②获取确定背景:开运算+多次膨胀③获取确定前景:距离变换找到离背景最远的像素④标记前景和未知区域⑤执行分水岭算法cv2.watershed()⑥显示结果(markers==-1的像素即为边界)【例7-32】分水岭算法(核心代码)例7-32#1.预处理:灰度化+中值滤波+阈值分割gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)gray=cv2.medianBlur(gray,5)ret,thresh=cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)#2.形态学操作去噪opening=cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel,iterations=2)sure_bg=cv2.dilate(opening,kernel,iterations=3)#3.距离变换获取前景标记dist=cv2.distanceTransform(opening,cv2.DIST_L2,5)ret,sure_fg=cv2.threshold(dist,0.7*dist.max(),255,0)#4.标记并执行分水岭markers=cv2.connectedComponents(sure_fg)+1markers[unknown==255]=0markers=cv2.watershed(img,markers)img[markers==-1]=[0,0,255]#边界标红分水岭算法用于分割粘连物体(如硬币)。通过距离变换标记确定的前景和背景,未知区域由算法自动分割。PART03深度学习计算机视觉大揭秘传统目标检测方法的局限"先找物体,再分类"的两阶段流程在YOLO出现之前,传统目标检测方法(如RCNN系列)多采用两阶段流程:首先生成大量候选区域(RegionProposal),再逐一分类。两大核心问题检测效率低下:候选区域生成与逐一分类涉及大量重复计算,运算量大、检测速度慢,难以满足实时检测场景需求定位精度受限:候选区域生成存在随机性,易漏检或重复检测,多阶段流程误差逐步累积,影响最终定位精度深度学习的突破深度学习技术无需人工设计图像特征,通过大量标注数据训练模型,让模型自主学习并挖掘深层特征,为突破传统CV瓶颈提供了全新路径。YOLO——秒懂物体的"眼力"YouOnlyLookOnceYOLO是端到端的目标检测算法,核心思想是将目标检测转化为回归问题。只需看一次图像就能同时预测所有物体的位置和类别。YOLO的优势速度快:单次前向传播完成检测,适合实时应用全局推理:看到整张图像而非局部窗口泛化能力强:对新领域也能较好检测端到端训练:一个模型完成所有任务YOLO版本发展史从v1到v26YOLO系列经历了快速发展:

•2015:YOLOv1(JosephRedmon)-开创性单阶段检测

•2016:YOLOv2-引入BatchNorm和Anchor

•2018:YOLOv3-多尺度检测

•2020:YOLOv4-引入大量数据增强

•2021:YOLOv5(Ultralytics)-PyTorch实现

•2023:YOLOv8-统一检测/分割/分类

•后续版本持续优化速度和精度YOLO网络架构24层卷积+2层全连接YOLO检测网络包含24个卷积层和2个全连接层。

关键设计:

•交替使用1×1卷积降低特征维度

•预训练阶段使用224×224分辨率

•检测阶段提升到448×448分辨率

•将图像划分为S×S网格

•每个网格预测B个边界框和置信度

•同时预测C个类别概率YOLO核心原理——网格、锚框与NMS(a)图像网格化划分将输入图像均匀划分为S×S网格(YOLOv1中S=7),每个网格负责检测其覆盖区域内的物体。若物体中心落在某网格内,则该网格承担该物体的检测任务。(b)锚框与目标预测锚框(AnchorBox):为每个网格预设K个不同宽高比的矩形框每个锚框预测三项信息:物体置信度:锚框内存在物体的概率及边界匹配程度物体类别概率:锚框内物体属于各类别的概率边界框坐标修正:微调锚框位置使其更贴合真实轮廓(c)非极大值抑制(NMS)后处理多个锚框可能同时检测到同一物体,产生重叠边界框。NMS通过保留置信度最高的框、抑制与之高度重叠的冗余框,得到唯一精准的检测结果。MaskR-CNN——像素级精准分割实例分割的里程碑MaskR-CNN由KaimingHe等人于2017年提出,在FasterR-CNN基础上增加掩码分支(MaskBranch),实现实例级别的像素级分割。三大输出分类(Classification):识别物体类别边界框(BoundingBox):定位物体位置掩码(Mask):像素级精确轮廓应用领域自动驾驶、医学图像分析、AR/VR、卫星图像分析等需要精细分割的场景。MaskR-CNN架构详解——四大模块基于FasterR-CNN的两阶段架构模块1:区域提议网络(RPN)通过卷积层提取特征图,利用Anchor机制快速筛选出可能包含物体的候选区域,大幅减少后续运算量模块2:RoIAlign层(核心创新)通过双线性插值精准提取候选区域特征,解决传统RoIPooling的坐标偏移问题,实现像素级对齐模块3:分类与边界框回归分支判断物体类别,并对边界框进行二次修正,精准定位物体模块4:掩码分支(新增)为每个候选区域生成固定尺寸(如14×14)的二进制掩码,再上采样恢复原图尺寸,实现像素级分割MaskR-CNN核心优势三大核心优势①像素级分割精度:掩码分支+RoIAlign精准勾勒物体轮廓,像素级目标与背景分离,可处理边界复杂、形态不规则的物体②多任务协同高效:一次推理同时输出类别、位置、掩码三大信息,无需单独训练检测与分割模型,简化系统设计③强适应性与泛化能力:对复杂背景、光照变化、目标重叠等场景具有较强适应性,能精准分割重叠物体的各个实例扩展性架构具有良好扩展性,可调整网络结构与超参数,适配不同尺寸、不同类别的目标分割任务。后续迭代版本在小目标分割、实时性等方面持续优化。GAN与扩散模型生成对抗网络(GAN)GAN由生成器和判别器组成:

•生成器负责"造假"

•判别器负责"鉴别"

•两者博弈不断提升

经典变体:

•DCGAN:引入卷积操作

•StyleGAN:控制样式细节

•CycleGAN:无配对风格转换

可生成逼真的人脸、风景、艺术作品。扩散模型(DiffusionModel)通过逐步去噪生成高质量图像:

•前向过程:逐步添加噪声

•反向过程:学习从噪声恢复

代表模型:

•StableDiffusion

•DALL-E

•Midjourney

相比GAN,训练更稳定,生成质量更高,已成为主流生成模型。GANvs扩散模型对比表7-6两种生成模型的核心差异对比维度GAN扩散模型核心机制生成器与判别器对抗博弈逐步加噪与反向去噪迭代训练稳定性较差,易模式崩溃优良,训练平稳收敛好生成速度快,单次映射生成慢,多步迭代去噪生成质量细节丰富但一致性较差质量均匀、逼真度高GAN详细原理——对抗博弈的生成逻辑GAN由IanGoodfellow于2014年提出核心创新在于引入"对抗博弈"机制,通过两个子网络的相互竞争,学习真实图像的特征分布并自主生成新图像。核心架构:生成器与判别器生成器(Generator):输入随机噪声,通过神经网络层层映射,将无序噪声转化为"假图像"判别器(Discriminator):同时接收真实图像与生成器假图像,判断输入是"真"还是"假"训练过程:三步交替迭代①训练判别器:固定生成器,输入真假图像提升判别器鉴别能力②训练生成器:固定判别器,优化生成器让假图像更难被识破③交替迭代:直至纳什均衡,判别器无法区分真假扩散模型详细原理——逐步去噪的生成逻辑源于热力学扩散过程扩散模型是近年来图像生成领域的主流技术,通过"逐步加噪"与"逐步去噪"的双向过程,学习真实图像特征分布,从随机噪声生成高质量图像。前向加噪过程(训练阶段)对真实图像逐步加入高斯噪声,经过T步后图像被完全破坏,转化为标准正态分布的随机噪声。此过程是确定性的,不需要模型学习。反向去噪过程(生成阶段)从随机噪声出发,按加噪的相反顺序逐步去噪。每一步基于模型学习到的特征规律,去除部分噪声,最终从噪声中"恢复"出逼真的图像。代表模型StableDiffusion、DALL-E、Midjourney、Seedream等训练比GAN更稳定,生成质量更均匀,已成为主流PART04计算机视觉的超级应用辅助驾驶——让机器成为司机的最佳助手感知-决策-控制三层架构通过摄像头、激光雷达、毫米波雷达等传感器采集道路信息,利用CV技术实现对周围环境的实时感知。核心CV技术车道线检测:利用边缘检测和曲线拟合识别车道边界交通标志识别:深度学习分类模型识别限速、转向等标志行人检测:基于YOLO/SSD的实时行人目标检测车辆跟踪:多目标跟踪算法维持车辆ID一致性3D场景重建:多视角图像生成三维点云自动驾驶等级从L1(辅助驾驶)到L5(完全自动驾驶),计算机视觉是实现高阶自动驾驶的核心技术。辅助驾驶——核心技术:全场景环境感知多摄像头协同感知道路与交通元素检测:YOLO实时识别车道线、信号灯、交通标志(限速、禁令、指示),为路线规划和车速调节提供依据障碍物识别与追踪:对行人、车辆、非机动车、掉落物等实现毫秒级检测与实时追踪,判断运动轨迹、速度与距离复杂场景适配:应对光照变化(强光、逆光、夜间)、天气干扰(雨天、雾天)、目标遮挡等复杂场景核心应用场景车道保持辅助:检测车道线,无意识偏离时自动微调方向盘或振动预警自适应巡航控制:自动保持与前车安全距离,缓解驾驶疲劳碰撞预警与主动刹车:碰撞风险高时声光预警,驾驶员未反应则自动刹车交通拥堵辅助:低速路况自动跟随前车,实现转向和加减速控制体育AI——AI如何分析比赛并预测胜负计算机视觉在体育领域的应用姿态估计:OpenPose/MediaPipe检测运动员身体关键点动作识别:识别投篮、传球、跑动等运动动作轨迹分析:跟踪球员和球的运动轨迹战术分析:识别阵型和战术配合模式典型应用案例NBA球员跟踪系统:每秒25帧追踪所有球员位置足球VAR系统:辅助裁判做出越位和进球判罚网球鹰眼系统:毫米级精度的球落点分析游泳/田径:运动员动作分析和技术改进比赛预测结合历史数据和实时分析,AI可以预测比赛走势和胜负概率。体育AI——赛事解析与胜负预测核心技术:赛事场景精准解析目标追踪与动作识别:优化YOLO实时追踪运动员和球类,结合姿态识别解析投篮、传球、跑动等动作关键数据自动统计:投篮命中率、篮板数、传球成功率、射门次数、控球率、发球速度等战术逻辑拆解:分析运动员移动轨迹和位置配合,可视化呈现战术执行效果胜负预测:数据驱动的概率预判①历史数据积累与分析:提取历史交锋数据、核心球员表现、战术执行效率等特征②实时状态量化:实时解析攻防效率、球员体能、动作稳定性、战术适配性③概率模型预测:历史+实时数据输入预测模型,结合突发因素动态调整结果注意AI预测本质是"概率预判",无法排除偶然因素,但能为教练、观众、运营方提供有价值的参考。医学影像AI——AI帮助医生发现健康问题核心应用场景X光/CT分析:肺结节检测、骨折检测MRI分析:脑肿瘤分割、脊髓病变检测病理切片分析:癌细胞检测和分类眼底图像分析:糖尿病视网膜病变筛查技术方法图像分类:判断图像是否包含病变目标检测:定位病变的位置和大小图像分割:精确勾画器官和病变边界图像配准:对比不同时间的影像检测变化临床价值辅助早期发现、减少漏诊、提高诊断一致性、缓解医疗资源不足。AI不替代医生,而是成为医生的"第二双眼睛"。医学影像AI——精准解析与核心价值核心应用场景:医学影像精准解析肿瘤与病变筛查:MaskR-CNN从CT/MRI中精准分割肿瘤、结节、息肉,量化大小、边界、形态等特征眼底与皮肤疾病诊断:识别视网膜出血、黄斑病变、青光眼等早期病变,分析血管形态和视神经变化病理切片分析:高分辨率图像解析快速扫描切片,识别细胞形态异常和病变区域分布核心价值:弥补人工局限、强化诊断能力快速处理海量医学影像,大幅缩短诊断时间降低主观误差,提升诊断一致性发现人眼难以察觉的微小病变和早期征兆让医生将更多精力投入诊断决策和治疗方案制定定位AI是医生的"辅助工具",通过精准图像解析提供客观数据支撑,实现"AI辅助+医生决策"的最优协作模式。PART05实践案例与练习实践:YOLO目标检测——模型加载【例7-33】步骤1~4加载YOLOv3模型并进行推理:

1.读取COCO类别名称(80类)

2.使用dnn.readNetFromDarknet加载模型

3.将图像预处理为blob格式

4.设置输入并前向推理

模型包含:

•yolov3.cfg(网络配置)

•yolov3.weights(权重文件)

•s(类别名称)【例7-33】YOLO模型加载与推理例7-33步骤1~4importcv2,numpyasnp#读取类别名称classes=open('s','rt').read().strip().split('\n')#读取网络模型net=cv2.dnn.readNetFromDarknet('yolov3.cfg','yolov3.weights')#图像预处理:缩放至416×416,归一化blob=cv2.dnn.blobFromImage(image,1.0/255.0,(416,416))#设置输入并推理net.setInput(blob)outInfo=net.getUnconnectedOutLayersNames()outs=net.forward(outInfo)YOLO输出层详解——3层×85个值3层输出对应3个尺度第0层:存储较大尺寸目标第1层:存储中等尺寸目标第2层:存储较小尺寸目标每个候选框由85个值描述第0~3个值:边框位置信息(cx,cy,w,h),注意是相对原图的百分比形式第4个值:边框置信度(框内有物体的概率)第5~84个值:80个类别各自的置信度(COCO数据集80类)后处理关键变量resultIDS:置信度较高的框对应的分类IDboxes:置信度较高的框位置集合confidences:置信度较高的框的置信度值遍历每层每个候选框,筛选置信度>0.5的框,最后用NMS去除冗余重叠框。【例7-33】YOLO后处理——筛选候选框例7-33步骤5foroutinouts:#3个输出层forcandidateinout:#每层数百个候选框scores=candidate[5:]#80个类别的置信度classID=np.argmax(scores)#最高置信度的类别confidence=scores[classID]ifconfidence>0.5:#置信度阈值0.5box=candidate[0:4]*np.array([W,H,W,H])(cx,cy,w,h)=box.astype('int')x=int(cx-w/2)#中心点转左上角y=int(cy-h/2)boxes.append([x,y,int(w),int(h)])confidences.append(float(confidence))#非极大值抑制NMS去除冗余框indexes=cv2.dnn.NMSBoxes(boxes,confidences,0.5,0.4)【例7-33】YOLO绘制检测结果例7-33步骤6#为每个类别生成随机颜色colors=np.random.randint(0,255,size=(len(classes),3))foriinrange(len(boxes)):ifiinindexes:#仅绘制NMS保留的框x,y,w,h=boxes[i]color=[int(c)forcincolors[resultIDS[i]]]cv2.rectangle(image,(x,y),(x+w,y+h),color,2)result='{}:{:.0f}%'.format(classes[resultIDS[i]],confidences[i]*100)cv2.putText(image,result,(x,y+35),cv2.FONT_HERSHEY_SIMPLEX,1,color,2)cv2.imshow('result',image)cv2.waitKey(0)绘制边框、置信度百分比和类别名称。每个类别使用不同颜色区分。自定义数据集的目标检测训练自己的YOLO模型1.数据准备:收集目标物体的图片(至少100张以上)2.数据标注:使用LabelImg标注目标位置和类别3.数据划分:训练集(80%)和验证集(20%)4.配置修改:调整类别数、训练参数等5.模型训练:使用YOLO框架进行训练6.模型评估:在验证集上测试mAP标注格式(YOLO格式)每个图片对应一个txt文件,每行:class_idcenter_xcenter_ywidthheight(归一化到0~1)数据集准备与标注高质量数据集=高性能模型采集方式:实地采集、公开数据集补充、仿真数据生成要求:覆盖全场景(不同光照、角度、背景)、类别均衡、标注准确数据标注使用LabelImg/LabelMe等工具标注,贴合物体边缘绘制矩形框并指定类别。YOLO要求纯文本标注格式(.txt),与图像文件名一一对应。数据集目录组织CustomDataset/images/→train/val/test/labels/→train/val/test/data.yaml(数据集配置文件)数据划分按6:2:2或8:1:1比例划分训练集、验证集和测试集,确保数据完全独立无交叉。数据预处理与增强数据清洗通过可视化检查剔除无效样本(模糊、损坏、标注错误),对低质量图像进行去模糊、降噪、归一化处理。数据增强(解决小样本、类不平衡)离线增强:翻转、裁剪、缩放、色彩变换(亮度/对比度/饱和度)、马赛克拼接,扩充样本量在线增强:训练时实时随机增强(YOLO源码已内置,通过配置文件调节增强强度)最终校验

温馨提示

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

最新文档

评论

0/150

提交评论