版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
获取图像边缘信息知识目标技能目标熟练掌握图像形态学操作。包括腐蚀、膨胀、开运算、闭运算、顶帽运算、黑帽运算。掌握使用canny边缘检测进行图像的预处理。素质目标l培养学生逻辑思维。形态学操作,如腐蚀、膨胀、开运算和闭运算等,涉及对图像进行特定的数学变换。学生在学习和应用这些操作时,需要理解每种操作的基本原理、作用以及适用场景,助于培养他们的逻辑思维能力。l培养学生应用技术解决社会问题的能力。将形态学操作与实际应用紧密结合,例如利用形态学操作去除噪声、填补空洞等,学生可以锻炼自己的问题解决能力。项目背景
图像的边缘承载着丰富的结构与形态信息,是理解图像内容的关键。形态学操作与Canny边缘检测技术,可以精准地捕捉这些细微而关键的边缘细节。形态学操作,如同图像处理的魔术师,通过腐蚀与膨胀的巧妙组合,实现开运算与闭运算的精妙转换,从而有效去除噪声,填补空洞,增强图像的边缘特征。顶帽运算与黑帽运算则进一步拓展了形态学的应用范围,为我们提供了更为精细的图像处理手段。
形态学的应用领域非常广泛,可以用于医学图像分析(形态学操作常用于增强血管、肿瘤等生物结构的可视化)、卫星图像处理(形态学用于改善卫星图像的质量,如云层的去除,使用开运算可以消除云层中的小洞,而闭运算可以填补云层的断裂)、材料学科中的微观结构分析(如金属的晶粒结构,通过形态学梯度可以突出晶界)、工业产品中的产品表面检测(形态学操作可以识别和测量产品表面的缺陷,如孔洞、裂纹等)、交通监控中车辆检测和计数、生物特征识别(在指纹识别系统中,形态学操作可以用于增强指纹图像,提取指纹的脊线和谷线)等各个方面。任务引入
作为一位机器视觉工程师,您需要设计一项图像处理流程,精准识别墙面上的插座并勾勒其轮廓。借助OpenCV库对相机捕捉的图像进行预处理,包括运用形态学操作以剔除噪声与干扰,应用Canny边缘检测算法,提取插座的边缘信息,为后续的图像分析与识别奠定坚实基础。任务准备
完成该项任务,需要具备以下知识基础:
形态学操作:主要包括膨胀(Dilation)、腐蚀(Erosion)、开运算(Opening)、闭运算(Closing)、形态学梯度(MorphologicalGradient)、顶帽(Top-hat)、黑帽(Black-hat)、击中或丢失变换(Hit-or-missTransform)
canny边缘检测谢谢!腐蚀腐蚀的概念图4.1腐蚀前后的图像对比腐蚀是最基本的形态学操作之一,腐蚀操作是将结构元素的中心放置在每个像素上,并检查结构元素覆盖的区域是否全部为非零像素。如果不是,则将中心像素设置为零。这会使得图像中的物体边界向内收缩。
腐蚀操作能够将图像的边界点消除,使图像沿着边界向内收缩,也可以将小于指定结构体元素的部分去除。图4.1(a)是腐蚀前的图像,4.1(b)是腐蚀后的图。(a)原始图像
(b)腐蚀后的图像腐蚀的原理图4.3腐蚀原理腐蚀操作中通常使用一个结构元素来逐个扫描被腐蚀的图像,并根据结构元素和被腐蚀的图像关系来确定腐蚀结果。如图4.2所示,图像左上角的深色小方块是遍历图像所使用的结构元素(结构元素也称为核),在腐蚀过程中,要将该结构元逐个像素地遍历整幅图像,并根据结构元与被腐蚀图像的关系来确定腐蚀结果图像中对应结构元中心点位置的像素点的值。规则如下:如果结构元完全处于前景图像中,如4.3(a)图,将结构元中心点所对应的腐蚀结果图像的像素点处理为前景色,即白色。如果结构元没有完全处于前景图像中,如4.3(b)图,将结构元中心点对应的腐蚀结果图像中的像素点处理为背景色,即黑色。(a)结构元完全在前景中
(b)结构元未完全在前景中图4.2结构元腐蚀图像过程腐蚀的原理假如图像image的像素矩阵如图4.4,其中1表示白色前景,0表示黑色背景。有一个结构元k,值如图4.5:0000001110011100111000000图4.4图像img的像素矩阵
111图4.5结构元k腐蚀的过程图4.6图像腐蚀过程腐蚀的结果图4.7腐蚀结果0000000000011100000000000腐蚀函数在opencv中,使用函数cv2.erode()实现腐蚀操作,其语法结构如下:dst=cv2.erode(src,kernel,iterations=None,borderType=None,borderValue=None)
src:输入图像
kernel:定义了腐蚀操作的结构,通常是一个矩形、圆形或者自定义的结构
iterations:可选参数,定义了腐蚀操作的次数,如果未指定,默认为1
borderType:可选参数,定义了边界类型,如果未指定,默认为cv2.BORDER_CONSTANT,取值如表1.1所示。
borderValue:可选参数,定义了边界的颜色,如果边界类型为cv2.BORDER_CONSTANT,则需要指定该值
dst:返回值,腐蚀后的图像腐蚀函数类型说明BORDER_CONSTANT使用常数扩展,即用指定的边界值填充边界。BORDER_REFLECT使用镜像反射的方式扩展边界BORDER_TRANSPARENT透明边界,即不扩展边界,允许边界外的像素保持不变BORDER_DEFAULT根据图像的数据类型自动选择合适的边界类型BORDER_ISOLATED将图像的每个通道视为独立的图像进行处理,适用于多通道图像BORDER_WRAP使用周期性扩展的方式处理边界表4.1borderType取值腐蚀案例-使用像素矩阵演示腐蚀过程importcv2importnumpyasnpimg=np.zeros((5,5),np.uint8)img[1:4,1:4]=1k=np.ones((3,1),np.uint8)erosion=cv2.erode(img,k)print("img=\n",img)print("kernel=\n",k)print("erosion=\n",erosion)【例4.1erode_pixel.py】使用像素演示腐蚀过程。img=[[00000][01110][01110][01110][00000]]k=[[1][1][1]]erosion=[[00000][00000][01110][00000][00000]]结果可见,腐蚀后前景由9个像素点变为3个像素点,前景变小。腐蚀案例-对图片进行腐蚀importcv2importnumpyasnpimg=cv2.imread("image\\erode.jpg",cv2.IMREAD_UNCHANGED)k1=np.ones((5,5),np.uint8)k2=np.ones((12,12),np.uint8)erosion1=cv2.erode(img,k1)erosion2=cv2.erode(img,k2)cv2.imshow("img",img)cv2.imshow("erosion1",erosion1)cv2.imshow("erosion2",erosion2)cv2.waitKey()cv2.destroyAllWindows()【例4.2erode_img.py】使用大小不同的核对图像进行腐蚀,查看腐蚀后的结果。输出结果结果解析图4.8(a)为原图,原图中有白色的噪声点,图4.8(b)是使用5*5的核腐蚀后的结果,此时并未完全腐蚀掉噪声点,图4.8(c)是使用12*2的核腐蚀后的结果,将噪声点完全腐蚀掉,同时前景变小,可见核越大腐蚀的程度越严重,腐蚀后图像的整体轮廓越小。输出结果
(a)
(b)(c)谢谢!膨胀膨胀的概念图4.9二值图像膨胀效果
膨胀是形态学的基本操作之一,与腐蚀过程相反,膨胀操作是通过将结构元素的中心放置在图像的每个像素上,并检查结构元素覆盖的区域像素值是否全部为零,如果是,则将中心点像素设置为0,如果不是,则将中心像素设置为最大值(通常是255)。这会使得图像中的物体边界向外扩展,膨胀操作能够增加图像或数据矩阵中对象的尺寸,如图4.9所示,(a)图为原图,(b)图为膨胀后的图像。(a)原始图像
(b)膨胀后图像膨胀的原理图4.10膨胀原理
图像的膨胀过程是结构元依次遍历整个图像,与腐蚀操作的遍历过程完全相同,膨胀过程中根据结构元与前景的关系不同,做如下操作:
如果结构元中任意一点处于前景图中,如图4.10(a),将膨胀结果图像中对应像素点处理为前景色;
如果结构元完全处于背景色中,如图4.10(b),将结构元对应图像
的像素处理为背景色。(a)结构元中有像素处于前景中
(b)结构元完全处于背景中图4.10膨胀的结果就是白色的前景直径变大。膨胀的原理假如有图像image像素矩阵如图4.11,其中1表示白色前景,0表示黑色背景。有一个结构元k,值如图4.12:0000000000011100000000000图4.11图像image的像素矩阵
111图4.12结构元k图4.13膨胀结果0000001110011100111000000膨胀函数
在opencv中,使用函数cv2.dilate()实现膨胀操作,其语法结构如下:dst=cv2.dilate(src,kernel[,dst[,anchor[,iterations[,borderType[,borderValue]]]]])
src:输入图像(必需参数)。类型:单通道灰度图或二值图像
kernel:结构元素(必需参数),通常是一个矩形、圆形或者自定义的结构
dst:输出图像(可选参数)anchor:结构元素的锚点位置(可选参数)。类型:元组(x,y),默认值为(-1,-1),表示锚点在结构元素的中心。
iterations:膨胀操作的迭代次数(可选参数)。默认值为1。数值越大,膨胀效果越明显。
borderType:图像边界处理方式(可选参数)。默认值为cv2.BORDER_CONSTANT,表示用常量值填充边界。
borderValue:边界填充的常量值(可选参数)。默认值为0(黑色),仅在borderType=cv2.BORDER_CONSTANT时生效。膨胀案例-使用像素矩阵演示膨胀效果importcv2importnumpyasnpimg=np.zeros((5,5),np.uint8)img[2:3,1:4]=1k=np.ones((3,1),np.uint8)dilation=cv2.dilate(img,k)print("img=\n",img)print("k=\n",k)print("dilation\n",dilation)【例4.3dilate_pixel.py】使用像素演示膨胀过程。img=[[00000][00000][01110][00000][00000]]k=[[1][1][1]]dilation=[[00000][01110][01110][01110][00000]]结果解析:膨胀后前景由3个像素点变为9个像素点。膨胀案例-对图像进行膨胀操作importcv2importnumpyasnpimg=cv2.imread("image//dilation.jpg",cv2.IMREAD_UNCHANGED)k1=np.ones((7,7),np.uint8)k2=np.ones((15,15),np.uint8)dilation1=cv2.dilate(img,k1)dilation2=cv2.dilate(img,k2)cv2.imshow("original",img)cv2.imshow("dilation1",dilation1)cv2.imshow("dilation2",dilation2)cv2.waitKey()cv2.destroyAllWindows()【例4.4dilate_image.py】使用大小不同的核对图像dilation.jpg进行膨胀,查看膨胀后的结果。膨胀案例-对图像进行膨胀操作结果解析
图4.14(a)为原始图像,图4.14(b)是结构元大小为7*7的膨胀结果,此时并未完全消除噪声点,图4.14(c)是结构元大小为12*12的膨胀结果,此时所有孔洞均被消除,同时前景轮廓变大。可见,结构元越大,膨胀效果越明显。例4.4输出结果
(a)
(b)(c)谢谢!通用形态学函数通用形态学函数
通用形态学操作主要包括腐蚀、膨胀、开运算、闭运算、形态学梯度、礼帽运算(Top-Hat)和黑帽运算等,通过将腐蚀和膨胀操作进行组合,可以实现多种形态学操作。OpenCV提供了通用形态学操作函数cv2.morphologyEx()实现上述的形态学运算,语法结构如下:dst=cv2.morphologyEx(src,op,kernel[,dst[,anchor]])
src:源图像,必须是单通道的灰度图像。
op:形态学操作的类型,如表1.2所示,op可以有多种选项,如表4.2所示。
kernel:形态学操作的核,通常是一个矩形、椭圆或十字形的小矩阵。核的大小可以是正奇数。
dst(可选):输出图像,如果未指定,则函数会创建一个新的输出图像。
anchor(可选):核的锚点,默认是核的中心。参数op的取值op的取值说明含义cv2.MORPH_ERODE腐蚀操作腐蚀cv2.MORPH_DILATE膨胀操作膨胀cv2.MORPH_OPEN开运算先腐蚀后膨胀cv2.MORPH_CLOSE闭运算先膨胀后腐蚀cv2.MORPH_GRADIENT形态学梯度膨胀图像减去腐蚀图像cv2.MORPH_TOPHAT顶帽运算原始图像减去膨胀图像cv2.MORPH_BLACKHAT黑帽运算闭运算所得图像减去原始图像cv2.MORPH_HITMISS击中击不中前景背景图像腐蚀运算的交集,仅支持CV_8UC1二进制图像表4.2op类型通用形态学函数实现
通过将函数dst=cv2.morphologyEx(src,op,kernel[,dst[,anchor]])中的参数op设置为不同值,可以实现不同类型的形态学操作。谢谢!开运算开运算概念
开运算是先进行腐蚀操作再进行膨胀操作的过程,有助于消除小物体、平滑物体轮廓、断开细长连接,不改变物体的基本形状和大小。通过将函数cv2.morphologyEx()的参数op设置为cv2.MORPH_OPEN实现。
图4.15中(a)是原始图像,4.15(b)是腐蚀后的图像,4.15(c)是对4.15(b)进行膨胀后的图像。由图可见,开运算先通过腐蚀操作去掉噪声点,再通过膨胀操作将图像膨胀为和原来轮廓大小相等的图像。图4.15图像开运算示意图(a)原始图像
(b)腐蚀后的图像(c)对(b)进行膨胀后的图像开运算案例importcv2importnumpyasnpimg=cv2.imread("image//erode.jpg")k=np.ones((10,10),np.uint8)r=cv2.morphologyEx(img,cv2.MORPH_OPEN,k)cv2.imshow("img",img)cv2.imshow("result1",r)cv2.waitKey()cv2.destroyAllWindows()【例4.5open.py】使用开运算对图像erode.jpg进行去噪。开运算案例
结果解析图4.16(a)是原图,图4.16(b)是经过开运算后的结果,结果可见,开运算可以实现去噪功能,并且不改变图像轮廓大小。图4.16例4.5输出结果
(a)
(b)
动动手
同学们可以尝试对图像openning.bmp进行开运算操作,查看输出效果,并分析原因,同时可以修改核的大小,查看不同的核大小对开运算结果有什么影响?谢谢!闭运算闭运算概念
闭运算是先进行膨胀,然后进行腐蚀。闭运算有助于填充小的孔洞和缝隙、连接临近对象、去除小对象等功能,同时保持物体的大致形状。通过将函数cv2.morphologyEx()的参数op设置为cv2.MORPH_CLOSE实现。
图4.17(a)是原始图像,4.17(b)是膨胀后的图像,4.17(c)是对(b)进行腐蚀后的图像。由图可以看出,闭运算先通过膨胀操作封闭孔洞,然后通过腐蚀操作将图像收缩到与原图轮廓大小相同,具有封闭孔洞的功能。图4.17图像闭运算示意图(a)原始图像
(b)膨胀后的图像(c)对(b)进行腐蚀后的图像闭运算案例importcv2importnumpyasnpimg=cv2.imread("image//close.bmp")k=np.ones((5,5),np.uint8)r1=cv2.morphologyEx(img,cv2.MORPH_CLOSE,k)#未设置迭代次数,默认为1r2=cv2.morphologyEx(img,cv2.MORPH_CLOSE,k,iterations=3)#增加迭代次数cv2.imshow("img1",img)cv2.imshow("result1",r1)cv2.imshow("result2",r2)cv2.waitKey()cv2.destroyAllWindows()【例4.6close.py】使用闭运算实现填充小孔洞。闭运算案例结果解析
图4.18(a)是原始图像,图4.18(b)是第一次进行闭运算的结果,小的孔洞被填充,但是大的孔洞并未被填充,图4.18(c)是第二次进行闭运算的结果,第二次闭运算设置iterations=3,表示迭代了3次,大的孔洞也被填充。图4.18例4.6输出结果
(a)
(b)
(c)
动动手同学们可以将结构元减小或者增大,然后查看运行结果。对图像close2.bmp进行闭运算,如果两个图像无法连接,思考如何操作能够将其连接?谢谢!形态学梯度运算形态学梯度运算的概念
形态学梯度运算是膨胀操作和腐蚀操作结果的差值,可以用来突出显示物体的边缘。可以用来进行边缘检测、特征提取、图像分割等。
图4.19(a)为原始图像,4.19(b)为膨胀操作结果,4.19(c)为腐蚀操作结果,4.19(d)为膨胀操作减去腐蚀操作的结果。由图可以看出,膨胀后图像轮廓增大,
腐蚀后图像轮廓减小,将膨胀的图像减去腐蚀的图像后,背景像素值均为0,相减后仍然是0,保持黑色,膨胀图像与腐蚀图像重叠的白色部分相减像素值也变为0,变为黑色,膨胀图像剩余的白色部分保持不变,因此最后得到的图像是保留边缘信息。图4.19形态学运算示例图(a)原始图像(b)膨胀后的图像(c)腐蚀后的图像(d)(b)减去(c)形态学梯度运算案例importcv2importnumpyasnpimg=cv2.imread("image//gradient.jpg",cv2.IMREAD_UNCHANGED)k1=np.ones((5,5),np.uint8)k2=np.ones((10,10),np.uint8)r1=cv2.morphologyEx(img,cv2.MORPH_GRADIENT,k1)r2=cv2.morphologyEx(img,cv2.MORPH_GRADIENT,k2)cv2.imshow("original",img)cv2.imshow("result1",r1)cv2.imshow("result2",r2)cv2.waitKey()cv2.destroyAllWindows()【例4.7gradient.py】使用形态学梯度运算获取图像边缘信息。形态学梯度运算案例结果解析
图4.20(a)是原始图像,图4.20(b)是使用大小为5*5的结构元进行梯度运算的结果,图4.20(c)是使用大小为10*10的结构元进行梯度运算的结果,可见,结构元越大,保留的边缘越粗。图4.20例4.7输出结果
(a)
(b)
(c)
动动手同学们可以对图像gray_fish.jpg进行梯度运算,通过设置不同大小的结构元来比较处理结果。思考:形态学操作是针对灰度或者二值图像进行操作,如果要对彩色图像fish.jpg进行梯度运算,应该如何操作?谢谢!顶帽运算顶帽运算的概念
顶帽运算也叫礼帽运算,是用原始图像减去开运算结果,可用于突出显示图像中的小物体或细节,进行细节增强、小物体检测等。
图4.21(a)为原始图像,4.21(b)为开运算的结果,4.21(c)为原始图像减去开运算的结果。由图可见,开运算去除了原始图像的噪声点,再用原始图像减去开运算后,背景部分像素值仍然是0,保持不变,原图中白色部分减去开运算中白色部分后,白色重叠的位置像素值也变为0,而毛刺部分的像素点保持不变,因此结果只保留了噪声点。图4.21顶帽运算示意图(a)原始图像(b)开运算的结果(c)原图减去开运算顶帽运算案例importcv2importnumpyasnpimg=cv2.imread("image\\erode.jpg")k=np.ones((15,15),np.uint8)result=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,k)cv2.imshow("img",img)cv2.imshow("result",result)cv2.waitKey()cv2.destroyAllWindows()【例4.8tophat.py】使用顶帽运算获取图像噪声信息。1.7顶帽运算结果解析
图4.22(a)是原图,图4.22(b)是顶帽运算的结果,可见,顶帽运算保留了图像的噪声信息。同学们可以调整结构元的大小,比较输出结果有何不同。例4.8输出结果
(a)
(b)
谢谢!黑帽运算黑帽运算的概念
黑帽运算是闭运算结果与原始图像的差,可以用来突出显示比周围区域暗的区域。
图4.23(a)为原始图像,4.23(b)为闭运算的结果,4.23(c)为闭运算图像减去原图的结果。由图可见,闭运算封闭了图像中的孔洞,再用闭运算图像减去原始图像后,背景部分像素值相减仍然是0,保持不变,孔洞部分相减后变为白色,因此结果只保留了孔洞信息。图4.23黑帽运算示意图(a)原始图像(b)闭运算的结果(c)闭运算的图像减去原黑帽运算案例importcv2importnumpyasnpimg=cv2.imread("image\\dilation.jpg")k=np.ones((8,8),np.uint8)result=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,k)cv2.imshow("img",img)cv2.imshow("result",result)cv2.waitKey()cv2.destroyAllWindows()【例4.9blackhat.py】使用黑帽运算获取图像噪声信息。黑帽运算案例结果解析
图4.24(a)是原图,4.24(b)是黑帽运算的结果,可见,黑帽运算获得了图像的孔洞信息,同学们可以调整结构元大小,查看输出结果有何不同,并思考原因。图4.22例4.8输出结果
(a)
(b)
谢谢!核函数核函数
在上面所进行的形态学操作中,结构元均是自定义生成,OpenCV提供了cv2.getStructuringElement()函数用于构造并返回一个用于形态学处理所使用的结构元素。函数的语法结构为:cv2.getStructuringElement(shape,ksize[,anchor])。
shape
参数用于指定要创建的结构元素的形状,可以是以下几种之一:
cv2.MORPH_RECT表示矩形形状。
cv2.MORPH_ELLIPSE
表示椭圆形形状。
cv2.MORPH_CROSS
表示十字形形状。
ksize
参数用于指定结构元素的大小,必须是一个奇数,如3、5、7等,表示结构元素的宽度和高度。
anchor参数用于指定形态学操作的锚点位置,默认为(-1,-1),表示位于结构元素的中心。核函数案例-定义不同的核函数importcv2k1=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))k2=cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))k3=cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(11,11))print("k1=\n",k1)#输出结构元Kernel1print("k2=\n",k2)#输出结构元Kernel2print("k3=\n",k3)#输出结构元Kernel3【例4.10struct_element.py】使用cv2.getStructuringElement()函数定义不同的结构元。输出结果:1.9核函数结果解析k1的参数为cv2.MORPH_RECT,因此结果是用元素1组成了一个长方形,k2的参数是cv2.MORPH_CROSS,因此结果是用1组成了一个十字形,k3的参数是cv2.MORPH_ELLIPSE,结果是用1组成了一个椭圆形。k1=[[11111][11111][11111][11111][11111]]k2=[[00100][00100][11111][00100][00100]]k3=[[00000100000][00111111100][01111111110][11111111111][11111111111][11111111111][11111111111][11111111111][01111111110][00111111100][00000100000]]核函数案例-使用不同结构元进行膨胀操作importcv2img=cv2.imread("image//rectangle.jpg",cv2.IMREAD_UNCHANGED)k1=cv2.getStructuringElement(cv2.MORPH_RECT,(50,50))k2=cv2.getStructuringElement(cv2.MORPH_CROSS,(50,50))k3=cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(50,50))dst1=cv2.dilate(img,k1)#使用k1对图像进行腐蚀
dst2=cv2.dilate(img,k2)#使用k2对图像进行腐蚀
dst3=cv2.dilate(img,k3)#使用k3对图像进行腐蚀
cv2.imshow("orriginal",img)cv2.imshow("dst1",dst1)cv2.imshow("dst2",dst2)cv2.imshow("dst3",dst3)cv2.waitKey()cv2.destroyAllWindows()【例4.11kernel_dilate.py】使用不同的结构元进行膨胀操作,查看膨胀效果。结果解析
图4.25(a)是原图,图4.25(b)是使用矩形结构元膨胀的结果,图4.25(c)是使用十字形结构元膨胀的结果结果可见,图4.25(d)是使用椭圆形结构元膨胀的结果。可见,结构元为矩形,膨胀后的图像形状也是矩形,结构元为十字形,膨胀后的图像是十字形,结构元为椭圆,膨胀后的图像也是椭圆。核函数案例-使用不同结构元进行膨胀操作(a)
(b)
(c)
(d)
例4.11输出结果谢谢!canny边缘检测canny边缘检测介绍
Canny边缘检测是一种经典的边缘检测算法,由JohnF.Canny在1986年提出,被广泛应用于计算机视觉和图像处理领域。它是一种多阶段的边缘检测算法,旨在有效地检测图像中的边缘并抑制噪声。Canny边缘检测算法的主要步骤包括噪声抑制、计算梯度幅值和方向、非极大值抑制、双阈值处理和边缘连接。这些步骤共同作用,可以得到清晰准确的边缘信息,并且对噪声具有一定的鲁棒性。canny边缘检测过程0102030405噪声抑制canny边缘检测一般包括以下几个步骤:非极大值抑制边缘链接梯度计算双阈值处理canny边缘检测过程Canny边缘检测算法通过计算图像的梯度来确定边缘的位置。然而,图像中往往存在噪声,这些噪声也会对梯度的计算产生影响,从而导致检测到的边缘不准确。为了解决这个问题,Canny边缘检测算法在处理图像之前会先进行滤波处理,主要是通过应用高斯滤波或均值滤波等方法来平滑图像,减少图像中的随机噪声。这样做可以有效地降低噪声对边缘检测结果的干扰,提高边缘检测的准确性和可靠性。
高斯滤波是一种常用的滤波方法,它通过生成一个滤波器对图像进行滤波操作。这个过程可以平滑图像,减少噪声,同时保持边缘的清晰度,为后续的边缘检测步骤提供一个较好的基础。(1)噪声抑制
canny边缘检测过程(1)噪声抑制
图4.26为高斯滤波的一次卷积,计算像素点20的高斯滤波后的值,公式为:(99*1+104*2+92*1+107*2+20*8+112*2+99*1+100*2+102*1)/(1+2+1+2+8+2+1+2+1)=70图4.26高斯滤波过程
通过滤波器对周围像素点进行加权平均,获得最终滤波结果,一般越靠近中心位置的点,权重越大,滤波器不是固定的,可以调整大小和权重。但是要注意,滤波器的核越大,对噪声的敏感度越底,一般用5×5的核就能够满足大多数需求。canny边缘检测过程Canny边缘检测算法通过计算图像中像素点的梯度幅值和方向来检测边缘。
梯度幅值(GradientMagnitude):表示边缘强度,即边缘的粗细或明显程度。在Canny边缘检测中,梯度幅值是通过计算图像中每个像素点在x和y方向上的梯度得到的。这些梯度值是通过应用Sobel等算子计算得出的,这些算子能够捕捉到图像中水平、垂直以及对角线方向的边缘变化。
梯度方向(GradientDirection):表示边缘的方向,即边缘是如何在图像中延伸的。Canny算法使用arctan函数来计算每个像素点的梯度方向,这个方向信息对于后续的非极大值抑制步骤非常重要,因为它可以帮助确定哪些边缘是真实的,哪些可能是噪声或不必要的。通常取值为水平(左、右)、垂直(上、下)、对角线(右上、左上、左下、右下)8个不同的方向。(2)计算梯度幅值和方向图4.27梯度示例5↑7↓9↑3↑6↑8↑3↑5↓7↑9↑5→7↑6↑2↗5↑8←1↑5↑2↑4↑6↑7↑2↑7←canny边缘检测过程
在获得梯度幅度和方向后,遍历图像中的每个像素点,判断当前像素点是否是周围像素点中具有相同梯度方向的最大值。如果是,则保留该点作为边缘上的点;否则,认为该点为非边缘点并抑制。这一步骤通过细化边缘,确保边缘的连续性和准确性。处理过程为:
如果该点是正/负梯度方向上的局部最大值,则保留该点。
如果不是,则抑制该点,将该点值归零。(3)非极大值抑制canny边缘检测过程图4.28非极大值抑制图示
图4.28为非极大值抑制示例,图4.28(a)中梯度方向为x轴方向,图中可见,A点和C的在X方向的梯度为0,而B点的左右像素值差不为0,因此B点在X方向的梯度值最大,保留该点。图4.28(b)的梯度方向为y轴方向,由图可见,A和C两点在y轴方向的梯度值也是0,B点在y方向的梯度值不为0,因此保留B点,其余的点A和C均被抑制,即归零。
针对图4.28的梯度示例,根据上述规则进行抑制后,仅保留深色背景部分的值,其余像素点均抑制,如图4.29所示。图4.29非极大值抑制示例(a)
(b)canny边缘检测过程
为了区分图像中的像素点是否是边缘,将梯度幅值图像中的像素点分为强边缘、弱边缘和非边缘三类。强边缘为真正的边缘,非边缘点进行抑制,虚边缘需要根据情况进一步处理。为了确定哪些边缘是真正的边缘,需要设定两个阈值minVal和maxVal。处理规则如下:
当像素点梯度高于maxVal时,认为该点是强边缘,保留该点。
当像素点的梯度幅值小于低阈值,认为该点是非边缘,抑制该点。
当像素点的梯度幅值处于高阈值和低阈值之间。则认为该点是虚边缘,如果虚边缘与强边缘有连接,则认为是边缘,否则进行抑制,认为不是边缘。最后,通过连接强边缘像素点和与之相邻的弱边缘像素点,得到完整的边缘图像。
图4.30是双阈值处理的示意图,A像素值大于maxVal,因此确定为强边缘,保留;D像素值小于minVal,是非边缘,抑制;B和C两点的值位于maxVal和minVal之间,为虚边缘,需做进一步处理,B与强边缘A有连接,因此保留,C与强边缘没有连接,因此抑制。(4)双阈值处理图4.30双阈值处理示意图谢谢!canny边缘测的实现canny边缘测函数opencv提供了函数cv2.Canny()实现Canny边缘检测,语法格式如下;edges=cv2.Canny(image,threshold1,threshold2[[,apertureSize[,L2gradient]]])
image是输入图像,通常是灰度图像。
threshold1和threshold2
是两个阈值参数,用于边缘检测。threshold1通常设置为较低的值,而threshold2设置为较高的值。这两个阈值用于判断像素点的梯度强度是否属于边缘。
edges
是输出边缘图像,与输入图像大小和类型相同。
apertureSize是Sobel算子的大小,必须是奇数,如3、5、7等,默认值为3。这个参数影响Sobel算子对图像的处理程度,从而影响边缘检测的效果。
L2gradient
是一个布尔值,默认为False,表示使用L1范数(直接将两个方向导数的绝对值相加),如果设置为True,表示使用更精确的L2范数来计算图像梯度幅值。canny边缘测的案例importcv2img=cv2.imread("image//peony2.jpg",cv2.IMREAD_GRAYSCALE)r1=cv2.Canny(img,128,200)r2=cv2.Canny(img,32,128)cv2.imshow("original",img)cv2.imshow("result1",r1)cv2.imshow("result2",r2)cv2.waitKey()cv2.destroyAllWindows()【例4.12Canny.py】使用不同的阈值函数cv2.Canny()获取peony.jpg的图像边缘。canny边缘测的实现结果解析
图4.31(a)是原始图像,图4.31(b)是将阈值设置为(128,200)时获取的边缘信息,图4.31(c)是将阈值设置为(32,128)时的边缘信息,可见,阈值越低,保留的边缘信息越多,同学们可以调整阈值比较输出结果。例4.12输出结果
(a)
(b)
(c)
动动手
修改例4.12中的阈值,观察输出结果,思考阈值大小对保留细节多少的影响,阈值越大保留的细节越多还是阈值越小保留的细节越多?谢谢!任务实施任务实施
某机器视觉工程师,需要设计一个图像处理流程,识别墙体上的插座并获取轮廓,该流程首先使用OpenCV库对相机捕获的图像进行预处理,包括形态学操作以去除噪声和干扰,然后应用Canny边缘检测算法提取标志的边缘,以便于后续的图像分析和识别。分析步骤(1)读取相机捕获的产品图像,图片保存在image/switch.jpg。(2)将图像转换为灰度图,并进行适当的滤波处理以减少噪声。(3)应用形态学操作(腐蚀和膨胀)以去除图像中的小噪声点和不必要的细节。(4)使用Canny边缘检测算法提取产品标志的边缘。(5)显示并保存处理后的图像,特别是边缘检测结果,以便于后续分析。项目代码importcv2importnumpyasnp#步骤1:读取产品图像
product_image=cv2.imread('image//switch.jpg')#替换为你的产品图像路径ifproduct_imageisNone:print("Error:图像无法加载。")exit()#步骤2:转换为灰度图product_image=cv2.resize(product_image,(252,252))gray_image=cv2.cvtColor(product_image,cv2.COLOR_BGR2GRAY)#步骤3:滤波处理(这里使用高斯滤波)blurred_image=cv2.GaussianBlur(gray_image,(5,5),0)#步骤4:形态学操作
kernel=np.ones((3,3),np.uint8)#先腐蚀后膨胀(开运算)以去除小噪声
opened_image=cv2.morphologyEx(blurred_image,cv2.MORPH_OPEN,kernel)【项目四】任务实施。2.项目代码#可选:如果图像中有较大的孔洞需要填充,可以使用闭运算
closed_image=cv2.morphologyEx(opened_image,cv2.MORPH_CLOSE,kernel)#步骤5:Canny边缘检测canny_edges=cv2.Canny(opened_image,50,150)cv2.imshow('OriginalProductImage',product_image)#显示原始图像
cv2.imshow('ProcessedImage',opened_image)#显示处理后的图像cv2.imshow('CannyEdgesofProductLabel',canny_edges)#显示边缘检测结果cv2.imwrite('image//canny_edges.jpg',canny_edges)#保存边缘检测结
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 硅片研磨工安全意识评优考核试卷含答案
- 稳定土拌和设备操作工安全知识宣贯竞赛考核试卷含答案
- 2026年疑难病例讨论制度培训课件
- 酶制剂提取工8S执行考核试卷含答案
- 餐厅服务员理论测试考核试卷含答案
- 金属炊具及器皿制作工安全技能能力考核试卷含答案
- 高空作业机械维修工安全综合水平考核试卷含答案
- 气体分馏装置操作工岗位绩效目标考核试卷含答案
- 有机介质电容器装配工改进竞赛考核试卷含答案
- 变压器绝缘件装配工班组评比测试考核试卷含答案
- 国家能源社会招聘考试试题及答案
- 2026年二建《施工管理》真题及答案
- 2025年地质调查员地质灾害方向职业技能竞赛模拟试题(附答案)
- GB/T 3033-2025船舶与海上技术管路系统内含物的识别颜色
- 《变频技术及应用(三菱)(第三版)》中职全套教学课件
- 物业服务酬金制合同范本及风险提示
- 防汛抗旱基本知识培训课件
- 高校网络舆情课件
- 学校交通安全知识培训课件
- 工程地质学 第3版 课件全套 第1-9章 绪论-工程勘察
- 糖尿病专科护士选拔试题题库及答案
评论
0/150
提交评论