版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单元6检测物体的边缘OpenCV数字图像处理目录/CONENTS图像的合并运算差分算子边缘检测Canny检测和轮廓查找010203图像的合并运算01图像的算术运算假设一个像素值为a,另一个像素值为b,则饱和运算按如下法则进行:例如,如果相加以后是280则结果调整为255。如果相减以后结果为-10则调整为0图像的算术运算假设一个像素值为a,另一个像素值为b,则模运算按如下法则进行:例如,如果相加以后是280,则结果为280%255=280–255=25。如果相减以后结果为-10,则结果为-10%255=-10+255=245图像的算术运算OpenCV图像以NumPy矩阵方式存在,而NumPy矩阵之间的加减运算是模运算,下面例子把一个图像中的每个像素值增加100,观察模运算的结果#Example6_1importnumpyasnpimportcv2img=cv2.imread("imgs/flower.png")cv2.imshow("original",img)n=np.ones(img.shape,dtype="uint8")*100img2=img+n#NumPy矩阵之间的模运算#img2=img+100cv2.imshow("modular",img2)cv2.waitKey(0)cv2.destroyAllWindows()NumPy矩阵的加运算也可以是一个矩阵加一个数值,例如:img2=img+100模运算的结果不符合视觉习惯,因此OpenCV算术运算都是饱和运算图像的算术运算OpenCV定义的加运算为:dst
=cv2.add(src1,src2,mask=mask,dtype
=-1)其中,src1:参加运算的图像矩阵,或者一个数值。src2:参加运算的另一个图像矩阵,或者一个数值。mask:可选参数,掩膜图像,是一个与src1或src2分辨率一致的NumPy矩阵。dtype:可选参数,指定输出图像像素深度(例如8位或16位),默认值-1表示与src1深度一致。图像的算术运算importnumpy
asnpimportcv2img
=cv2.imread("imgs/flower.png")cv2.imshow("original",img)n=np.ones(img.shape,dtype="uint8")*100img1=cv2.add(img,n)
#opencv函数加运算#img1=cv2.add(img,100)cv2.imshow("saturation",img1)cv2.waitKey(0)cv2.destroyAllWindows()图像的算术运算OpenCV的很多图像处理函数定义中带有一个掩膜参数通过设置掩膜,可以精确地控制图像中哪些区域参与运算处理掩膜是一个与被处理图像分辨率一致的NumPy矩阵,通道数通常为1,即灰度图像,像素值取值为0或255掩膜图像通过像素值0设定被掩盖的区域,通过像素值255设定图像的可见部分importnumpyasnpimportcv2img=cv2.imread("imgs/flower.png")cv2.imshow("original",img)n=np.ones(img.shape,dtype="uint8")*100h,w,_=img.shapem=np.zeros((h,w),dtype="uint8")#设置掩膜窗口m[40:140,60:180]=255img1=cv2.add(img,n,mask=mask)cv2.imshow("saturation",img1)cv2.waitKey(0)cv2.destroyAllWindows()图像的算术运算上一单元通过差分卷积得到的两个方向的边缘图像,可以通过加运算执行合并importcv2importnumpy
asnpimg
=cv2.imread("imgs/lena.png",cv2.IMREAD_GRAYSCALE)k1=np.array([(1,0,-1),(1,0,-1),(1,0,-1)],np.float32)k2=np.array([(1,1,1),(0,0,0),(-1,-1,-1)],np.float32)img1=cv2.filter2D(img,-1,k1)img2=cv2.filter2D(img,-1,k2)img3=cv2.add(img1,img2)cv2.imshow("0",img)cv2.imshow("1",img1)cv2.imshow("2",img2)cv2.imshow("3",img3)cv2.waitKey()cv2.destroyAllWindows()图像的算术运算OpenCV定义的减运算为:dst
=cv2.subtract(src1,src2,mask=mask,dtype
=-1)其中的参数同add()一致。负片图像就是将图像的亮度反转,原本明亮的地方变暗,原本黑暗的地方变亮。在数字图像处理中,我们知道,亮度最大的像素值是255,可以通过255减去每个像素值来实现这种效果下列代码对一个彩色图像执行饱和减运算,使用cv2.subtract()函数,用255减去输入图像的每像素值,获得该图像的负片importnumpyasnpimportcv2img=cv2.imread("imgs/flower.png")cv2.imshow("original",img)img1=cv2.subtract(255,img)
#opencv函数减运算cv2.imshow("saturation",img1)cv2.waitKey(0)图像的算术运算OpenCV定义的加权混合运算为:dst
=cv2.addWeighted(src1,alpha,src2,beta,gamma,dtype
=1)其中,src1和src2是参与运算的两个图像alpha、
beta、gamma是常数例如,当alpha=0.4、beta=0.6、gamma=10,就执行下列饱和运算:dst
=src1*0.4+src2*0.6+10,图像的算术运算下列程序读取一个图像,根据图像大小生成一个数字水印图像,然后对两个图像融合生成一个新的图像importcv2importnumpy
asnpimg1=cv2.imread("imgs/lena.png")img2=np.zeros(img1.shape,img1.dtype)cv2.putText(img2,"HelloOpenCV!",(40,200),cv2.FONT_HERSHEY_SIMPLEX,2,(255,255,0),2)img3=cv2.addWeighted(img1,0.9,img2,0.5,40)cv2.imshow("1",img1)cv2.imshow("2",img2)cv2.imshow("3",img3)cv2.waitKey(0)cv2.destroyAllWindows()涉及二值图像,像素值为0和255,包括按位与、或、异或及非运算,用于图像处理的掩膜、叠加、合成和分析。OpenCV中的位运算01四个基本操作:cv2.bitwise_and()、cv2.bitwise_or()、cv2.bitwise_xor()和cv2.bitwise_not(),对应按位与、或、异或和非运算。位运算操作02按位与用于提取ROI,按位或合并图像特征,按位异或用于图像加密,按位非实现图像反转和负片效果。位运算应用03图像的位运算图像的位运算位运算是二值图像之间的运算。OpenCV中,二值图像的像素值是0和255两个二值图像执行运算,两者必须分辨率一致。位运算是两个图像中对应像素值的逐一运算。位运算共有四种:dst=cv2.bitwise_and(src1,src2,mask=mask)dst=cv2.bitwise_or(src1,src2,mask=mask)dst=cv2.bitwise_xor(src1,src2,mask=mask)dst=cv2.bitwise_not(src,mask=mask)其中,src1:第一个输入图像,或一个整数;src2:第二个输入图像,或一个整数;mask:可选参数,与src1或src2分辨率一致的NumPy矩阵,是一个掩膜图像。前三种位运算是两个图像之间的按位与、按位或和按位异或运算,第四种是对一个图像执行非运算图像的位运算importnumpyasnpimportcv2rectangle=np.zeros((200,200),dtype="uint8")cv2.rectangle(rectangle,(25,25),(175,175),255,-1)cv2.imshow("Rectangle",rectangle)circle=np.zeros((200,200),dtype="uint8")cv2.circle(circle,(100,100),90,255,-1)cv2.imshow("Circle",circle)bitwiseAnd=cv2.bitwise_and(rectangle,circle)cv2.imshow("AND",bitwiseAnd)bitwiseOr=cv2.bitwise_or(rectangle,circle)cv2.imshow("OR",bitwiseOr)bitwiseXOr=cv2.bitwise_xor(rectangle,circle)cv2.imshow("XOR",bitwiseXOr)bitwiseNot=cv2.bitwise_not(rectangle)cv2.imshow("NOT",bitwiseNot)cv2.waitKey(0)cv2.destroyAllWindows()图像的位运算位运算也可以用于灰度图像之间的运算,这时候,表中的运算规则中0相当于较小值,255相当于较大值,and运算取两者的较小值,or运算取两者的较大值图像的位运算cv2.bitwise_or()函数对两个输入图像执行按位或操作将两幅图像进行按位或操作,可以将两幅图像中对应的非零像素合并到一起下列程序通过这一函数,把上一单元提取到的两个方向的外形轮廓合并起来,运行结果见图请大家思考:这里的合并与执行cv2.add()运算有什么差别?图像的位运算cv2.bitwise_xor()函数对两个输入图像执行按位异或操作。按位异或运算的下列特性可以用于对图像执行加密:A⊕B⊕B=A其中,⊕就是按位异或运算符importcv2importnumpyasnpimage=cv2.imread("imgs/lena.png")#创建一个密钥(随机二值图像)key=np.random.randint(0,256,image.shape,dtype=np.uint8)#加密:使用异或运算encrypted_image=cv2.bitwise_xor(image,key)#解密:再次使用异或运算decrypted_image=cv2.bitwise_xor(encrypted_image,key)#显示结果cv2.imshow('OriginalImage',image)cv2.imshow('EncryptedImage',encrypted_image)cv2.imshow('DecryptedImage',decrypted_image)cv2.waitKey(0)cv2.destroyAllWindows()图像的位运算cv2.bitwise_not()是OpenCV中用于对图像进行按位取反操作的函数。它的主要应用包括图像反转,生成负片图像。下列程序通过执行cv2.bitwise_not()对输入图像执行按位取反操作,程序的运行结果生成负片importnumpyasnpimportcv2img=cv2.imread("imgs/flower.png")cv2.imshow("original",img)img1=cv2.bitwise_not(img)
cv2.imshow("bitwise_not",img1)cv2.waitKey(0)cv2.destroyAllWindows()差分算子边缘检测021.边缘检测边缘就是像素值急剧变化的地方,即梯度大的地方通常只能在单一通道,即灰度图像上检测边缘,当然,也可以为RGB图像的每个通道检测边缘检测边缘必须经过浮点运算,否则会丢失很多边缘。检测得到的浮点型矩阵再转化为0-255之间的整数2.Sobel算子Sobel算子是一种差分算子,用于检测像素值有显著变化的地方两个3X3的Sobel卷积核见右图当左右像素值有显著变化时,第一个卷积核能检测到这种垂直方向的边缘当上下像素值有显著变化时,第二个卷积核能检测到这种水平方向的边缘3.Sobel算子检测边缘Sobel函数:cv.Sobel(src,ddepth,dx,dy[,ksize[,scale[,delta[,borderType]]]]])ddepth:输出图像的深度,为保存计算梯度中的精度,取CV_64Fdx,dy:x方向求导阶数,y方向求导阶数
例如1,0时就是上页的第一个核,0,1是第二个核ksize:卷积核大小,默认为3Scale:放缩尺度,默认为1delta:目标图像像素增加值,默认为03.Sobel算子检测边缘这个函数执行一次,只能分别检测水平或垂直方向的边缘,最终还要合并X和Y方向的Sobel图像可以通过位运算bitwise_or()合并,也可以通过addWeighted()importcv2importnumpyasnpimage=cv2.imread("lena.png")image=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)cv2.imshow("Image",image)sobelX=cv2.Sobel(image,cv2.CV_64F,1,0)sobelY=cv2.Sobel(image,cv2.CV_64F,0,1)sobelX=np.uint8(np.absolute(sobelX))sobelY=np.uint8(np.absolute(sobelY))sobel=cv2.bitwise_or(sobelX,sobelY)cv2.imshow("SobelX",sobelX)cv2.imshow("SobelY",sobelY)cv2.imshow("SobelCombined",sobel)cv2.waitKey(0)3.Sobel算子检测边缘课堂练习:1.创建一个像素值相等的灰度图像,使用Sobel算子检测边缘,观察结果2.在灰度值相等的画布图像上绘制一条水平线和垂直线,分别用两种Sobel算子检测边缘,观察结果3.在灰度值相等的画布图像上绘制一个圆,分别用两种Sobel算子检测边缘,观察结果3.Sobel算子检测边缘课堂实训:1.打开摄像头,播放拍摄的视频检测视频帧图像中的边缘,动态播放检测到的边缘4.Scharr算子Scharr算子函数:cv.Scharr(src,ddepth,dx,dy[,dst[,scale[,delta[,borderType]]]])Scharr3X3卷积核见下图,能比Sobel算子更准确的检测边界4.Scharr算子importcv2importnumpyasnpimage=cv2.imread("charuco_board.png")image=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)image=cv2.resize(image,(200,200))cv2.imshow("Image",image)X=cv2.Scharr(image,cv2.CV_64F,1,0)Y=cv2.Scharr(image,cv2.CV_64F,0,1)sobelX=np.uint8(np.absolute(X))sobelY=np.uint8(np.absolute(Y))scharr=cv2.bitwise_or(X,Y)cv2.imshow("X",X)cv2.imshow("Y",Y)cv2.imshow("scharr",scharr)cv2.waitKey(0)5.Laplacian算子Laplacian算子函数cv.Laplacian(src,ddepth[,dst[,ksize[,scale[,delta[,borderType]]]]] )Ksize=1时是右图所示3X3卷积核Laplacian算子具有旋转不变性,能同时检测XY方向的边缘5.Laplacian算子importcv2importnumpyasnpimage=cv2.imread("charuco_board.png")cv2.imshow("Original",image)cv2.waitKey(0)image=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)cv2.imshow("Image",image)lap=cv2.Laplacian(image,cv2.CV_64F)lap=np.uint8(np.absolute(lap))cv2.imshow("Laplacian",lap)cv2.waitKey(0)6.Canny算子课堂练习:读取一个图像,用Scharr算子检测边缘,显示检测结果读取一个图像,用Laplacian算子检测边缘,显示检测结果6.Canny算子Canny边缘检测算子是JohnF.Canny于1986年开发出来的一个多级边缘检测算法Canny检测步骤:降噪:对原始图像使用高斯平滑模板作卷积(去除噪声),得到的图像与原始图像相比有些轻微的模糊(blurred)寻找梯度:Canny算法使用4个mask检测水平、垂直以及对角线方向的边缘,生成每个像素点的亮度梯度图以及亮度梯度的方向跟踪边缘:较高的亮度梯度可能是边缘,但是没有一个确切的值来限定多大的亮度梯度是边缘,所以Canny使用了双阈值6.Canny算子Canny算子函数:cv.Canny(image,threshold1,threshold2[,edges[,apertureSize[,L2gradient]]])threshold1:下界threshold2:上界计算结果低于下界不是边缘,高于上界的是边缘,介于两者之间的根据相邻像素之间的强度关系决定是否为边缘7.用Canny算子检测边缘通过调整上下界调整检测结果例:读取一个图像,用Canny算子检测边缘,显示检测结果
调整上下界,观察结果importcv2im=cv2.imread("lena.png")cv2.imshow("0",im)c=cv2.Canny(im,10,200)cv2.imshow("1",c)cv2.waitKey(0)cv2.destroyAllWindows()7.用Canny算子检测边缘检测边缘以前,通常需要执行高斯平滑去除噪声例:向一个图像中添加100个随机噪声,用Canny算子检测边缘,可以看到,噪声边缘也显示了出来importcv2importrandomim=cv2.imread("lena.png")s=im.shapeforiinrange(100):hang=random.randint(0,s[0]-1)lie=random.randint(0,s[1]-1)im[hang,lie]=(255,255,255)cv2.imshow("0",im)c=cv2.Canny(im,10,200)cv2.imshow("1",c)cv2.waitKey(0)cv2.destroyAllWindows()7.用Canny算子检测边缘课堂练习:对有噪声的图像执行高斯平滑,然后用Canny算子检测边缘调整高斯卷积核的大小,观察检测结果importcv2importrandomim=cv2.imread("lena.png")s=im.shapeforiinrange(100):hang=random.randint(0,s[0]-1)lie=random.randint(0,s[1]-1)im[hang,lie]=(255,255,255)cv2.imshow("0",im)image=cv2.GaussianBlur(im,(7,7),0)cv2.imshow("Gaussian",image)c=cv2.Canny(image,10,100)cv2.imshow("1",c)cv2.waitKey(0)cv2.destroyAllWindows()7.用Canny算子检测边缘课堂实训:1.打开摄像头,播放拍摄的视频用Canny算子检测视频帧图像中的边缘,动态播放检测到的边缘7.用Canny算子检测边缘应用Canny算子检测边缘时:通过调整Canny函数的上下界调整检测结果执行高斯模糊时,高斯核越大,去除噪声效果越好,但会使图像变得更模糊,使得有密集纹理的区域检测不到边缘7.查找轮廓Canny检测以后,以二值图像形式显示物体轮廓每个轮廓对应一组点,这些点表示图像中的一条轮廓线在OpenCV中,轮廓用保存一组点的矩阵表示,矩阵向量中的下一个值就是下一个点的位置函数cv2.findContours()可以根据特定算法从Canny(),threshold(),adaptiveThreshold()返回的二值图像中计算轮廓7.查找轮廓查找轮廓函数:(这个函数在二值图像image中查找轮廓)(cnts,_2)=cv2.findContours(image,mode,method)image:二值图像
mode:轮廓检索算法模式method:轮廓近似模式:返回值:_1:与iamge一致的图像cnts:检测到的轮廓_2:图像拓扑信息。与轮廓的数量一样多。对于第i个轮廓,_2[i][0]、_2[i][1]、_2[i][2]和_3[i][3]被设置为0-基于相同层次级别的下一个和前一个轮廓的轮廓中的索引,分别是第一个子轮廓和父轮廓。如果轮廓i没有下一个、上一个、父级或嵌套轮廓,则层级[i]的相应元素将为负7.查找轮廓cv2.RETR_EXTERNAL仅检索极端的外部轮廓。hierarchy[i][2]=hierarchy[i][3]=-1为所有轮廓设置。cv2.RETR_LIST在不建立任何层次关系的情况下检索所有轮廓。cv2.RETR_CCOMP检索所有轮廓并将它们组织成两级层次结构。在顶层,有组件的外部边界。在第二层,有洞的边界。如果连接组件的孔内有另一个轮廓,它仍然放在顶层。cv2.RETR_TREE检索所有轮廓并重建嵌套轮廓的完整层次结构。cv2.RETR_FLOODFILL
mode取值范围cv2.CHAIN_APPROX_NONE绝对存储所有轮廓点。也就是说,轮廓的任何2个后续点(x1,y1)和(x2,y2)将是水平、垂直或对角线邻居,即max(abs(x1-x2),abs(y2-y1))==1。cv2.CHAIN_APPROX_SIMPLE压缩水平、垂直和对角线段,只留下它们的端点。例如,右上方的矩形轮廓用4个点进行编码。cv2.CHA
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年中国建筑科学研究院秋招面试题及答案
- 浙江金华市永康市2025-2026学年人教PEP版第二学期三年级期末素养评价英语试题
- 救护队自身伤亡分析
- 焊接工程质量工艺评定
- 展览展示代理公司渠道经理述职报告
- 《简单随机抽样》课件
- 2026年神经内科护士分层培训试卷(附答案)
- 2026年露天矿台阶开采规范管控综合测评卷及答案
- 神经行为学检测方法
- 2026年工地应急救援队伍实操培训试题及答案
- 尼得科电机(大连)扩建项目环境影响评价报告表
- 小学语文口语训练案例分析范文
- 人教版二年级全册《体育与健康》全套课件
- GJB3243A-2021电子元器件表面安装要求
- 第一单元第一课我们走在大路上(课件)-初中美术湘美版七年级上册
- GB/T 13403-2008大直径钢制管法兰用垫片
- 海湾-gst-qkp01控制器说明书fas ver
- 【部编人教版】道德与法治二年级上册全册完整课件
- 《汽车文化》中职配套教学课件
- 有机光化学之光催化剂参与的反应课件
- 全国中小学生转学申请表(样表)
评论
0/150
提交评论