python+opencv图像形态学处理详细解释(膨胀、腐蚀、开闭运算、礼帽和黑猫) |
您所在的位置:网站首页 › 二值图像腐蚀与膨胀 › python+opencv图像形态学处理详细解释(膨胀、腐蚀、开闭运算、礼帽和黑猫) |
python+opencv图像形态学处理
本篇博客主要是关于形态学中的腐蚀、膨胀、开运算、闭运算、礼帽和黑帽的函数用法。 内容会比较,为方便查阅。代码的解释会写在代码中。 用于测试的图像原图: 例如: 1 #腐蚀 2 #读取图像 3 img1=cv.imread("oldcat.jpg") 4 5 #将图像进行反向二值化操作,即将白色部分变为黑色,黑色部分变为白色 6 #ret,img2=cv.threshold(img1,80,255,cv.THRESH_BINARY_INV) 7 8 #定义一个3*3的卷积核 9 kernel=np.ones((3,3),np.uint8) 10 11 #图像腐蚀:cv2.erode(输入图像,卷积核,iterations=腐蚀的次数) 12 erosion=cv.erode(img1,kernel,iterations=1) 13 14 #在图像上添加文本,方便分清每个操作相对应的图像 15 cv.putText(img1,"original",(150,230),cv.FONT_HERSHEY_COMPLEX,1,(0,0,255),2,8) 16 cv.putText(erosion,"erosion",(150,230),cv.FONT_HERSHEY_COMPLEX,1,(0,0,255),2,8) 17 18 #将原图像和腐蚀操作的图像放在同一个窗口显示 19 glay=np.hstack((img1,erosion)) 20 cv.imshow("glay",glay) 21 cv.waitKey(0) 22 cv.destroyAllWindows()效果图: 可以发现: 相比于原图,腐蚀并没有变瘦,反而还“胖”了。 原因: 形态学处理是一个对二值化灰度图像的处理,主要是对白色图像的一个卷积操作。 由于原图字体是黑色,底色为白色,所以在进行腐蚀操作的时候,卷积核中只要有一个点为0,卷积核的中心点也会为0。 解决方法: 对原图像进行一个反向二值化处理,即将白色部分变为黑色,黑色部分变为白色 去掉上面代码ret,img2=cv.threshold(img,80,255,cv.THRESH_BINARY_INV)的注释,同时将erosion=cv.erode(img1,kernel,iterations=1)改为erosion=cv.erode(img2,kernel,iterations=1) 效果图: 如图所示:这样腐蚀处理的图像才会变瘦 二、膨胀膨胀:卷积核所对应的原图像的像素值只要有一个是1,中心像素值就是1。一般在除噪是,先腐蚀再膨胀,因为腐蚀在去除白噪声的时候也会使图像缩小,所以我们之后要进行膨胀。当然也可以用来将两者物体分开。 例如: 1 import numpy as np 2 import cv2 as cv 3 #膨胀 4 #读取图像 5 img1=cv.imread("oldcat.jpg",0) 6 7 #将图像进行反向二值化操作,即将白色部分变为黑色,黑色部分变为白色 8 ret,img2=cv.threshold(img1,80,255,cv.THRESH_BINARY_INV) 9 10 #定义一个3*3的卷积核 11 kernel=np.ones((3,3),np.uint8) 12 13 #图像腐蚀:cv2.dilate(输入图像,卷积核,iterations=腐蚀的次数) 14 dilation=cv.dilate(img2,kernel,iterations=1) 15 16 #在图像上添加文本,方便分清每个操作相对应的图像 17 cv.putText(img1,"original",(150,230),cv.FONT_HERSHEY_COMPLEX,1,(0,0,255),2,8) 18 19 #将原图像和膨胀操作的图像放在同一个窗口显示 20 glay=np.hstack((img1,dilation)) 21 cv.imshow("glay",glay) 22 cv.waitKey(0) 23 cv.destroyAllWindows() 效果图: 腐蚀和膨胀是比较简单的。 三、开运算了解形态学基本处理的同学都知道,开运算和闭运算就是将腐蚀和膨胀按照一定的次序进行处理。但这两者并不是可逆的,即先开后闭并不能得到原先的图像。 例如: 1 import numpy as np 2 import cv2 as cv 3 #开运算 4 #先腐蚀,再膨胀 5 img1=cv.imread("oldcat.jpg",0) 6 #反二值化,小于127设为255,即黑变白;大于127的设为 0,即白变黑。 7 ret,img2=cv.threshold(img1,127,255,cv.THRESH_BINARY_INV) 8 9 #定义一个3*3的卷积核 10 kernel=np.ones((3,3),np.uint8) 11 12 #开运算 13 opening2=cv.morphologyEx(img2,cv.MORPH_OPEN,kernel) 14 15 #在图像上添加文本,方便分清每个操作相对应的图像 16 cv.putText(img1,"original",(150,230),cv.FONT_HERSHEY_COMPLEX,1,(0,0,255),2,8) 17 18 #将原图像和开运算操作的图像放在同一个窗口显示 19 glay=np.hstack((img1,opening2)) 20 cv.imshow("glay",glay) 21 cv.waitKey(0) 22 cv.destroyAllWindows()效果图: 闭运算:就是先膨胀,后腐蚀,也是不可逆的。 1 import numpy as np 2 import cv2 as cv 3 #闭运算 4 #先膨胀,后腐蚀 5 img1=cv.imread("oldcat.jpg",0) 6 #反二值化,小于127设为255,即黑变白;大于127的设为 0,即白变黑。 7 ret,img2=cv.threshold(img1,127,255,cv.THRESH_BINARY_INV) 8 9 #定义一个3*3的卷积核 10 kernel=np.ones((3,3),np.uint8) 11 12 #闭运算 13 closing=cv.morphologyEx(img2,cv.MORPH_CLOSE,kernel) 14 15 #在图像上添加文本,方便分清每个操作相对应的图像 16 cv.putText(img1,"original",(150,230),cv.FONT_HERSHEY_COMPLEX,1,(0,0,255),2,8) 17 18 #将原图像和闭运算操作的图像放在同一个窗口显示 19 glay=np.hstack((img1,closing)) 20 cv.imshow("glay",glay) 21 cv.waitKey(0) 22 cv.destroyAllWindows()效果图: 梯度运算,类似于提取轮廓。梯度=膨胀-腐蚀 例如: 1 import numpy as np 2 import cv2 as cv 3 #梯度运算,类似于提取轮廓 4 #梯度=膨胀-腐蚀 5 img1=cv.imread("oldcat.jpg",0) 6 7 #反二值化,小于127设为255,即黑变白;大于127的设为 0,即白变黑。 8 ret,img2=cv.threshold(img1,127,255,cv.THRESH_BINARY_INV) 9 10 #定义一个3*3的卷积核 11 kernel=np.ones((3,3),np.uint8) 12 13 #梯度运算 14 gradient=cv.morphologyEx(img2,cv.MORPH_GRADIENT,kernel) 15 16 #在图像上添加文本,方便分清每个操作相对应的图像 17 cv.putText(img1,"original",(150,230),cv.FONT_HERSHEY_COMPLEX,1,(0,0,255),2,8) 18 19 #将原图像和梯度运算操作的图像放在同一个窗口显示 20 glay=np.hstack((img1,gradient)) 21 cv.imshow("glay",glay) 22 cv.waitKey(0) 23 cv.destroyAllWindows()
效果图: 六、礼帽 礼帽就是原始初入减去开运算结果 例如: 1 import numpy as np 2 import cv2 as cv 3 #礼帽,小线条 4 #礼帽=原始输入-运算结果 5 img1=cv.imread("oldcat.jpg",0) 6 ret,img2=cv.threshold(img1,127,255,cv.THRESH_BINARY_INV) 7 kernel=np.ones((3,3),np.uint8) 8 9 #礼帽 10 tophat=cv.morphologyEx(img2,cv.MORPH_TOPHAT,kernel) 11 12 #在图像上添加文本,方便分清每个操作相对应的图像 13 cv.putText(img1,"original",(150,230),cv.FONT_HERSHEY_COMPLEX,1,(0,0,255),2,8) 14 15 #将原图像和礼帽运算操作的图像放在同一个窗口显示 16 glay=np.hstack((img1,tophat)) 17 cv.imshow("glay",glay) 18 cv.waitKey(0) 19 cv.destroyAllWindows()效果图: 七、黑帽 黑帽=闭运算-原始输入 例如: 1 import numpy as np 2 import cv2 as cv 3 #黑帽。只能看见大概轮廓 4 #黑帽=闭运算-原始输入 5 img1=cv.imread("oldcat.jpg",0) 6 ret,img2=cv.threshold(img1,127,255,cv.THRESH_BINARY_INV) 7 kernel=np.ones((3,3),np.uint8) 8 9 #黑帽 10 blackhat=cv.morphologyEx(img2,cv.MORPH_BLACKHAT,kernel) 11 12 #在图像上添加文本,方便分清每个操作相对应的图像 13 cv.putText(img1,"original",(150,230),cv.FONT_HERSHEY_COMPLEX,1,(0,0,255),2,8) 14 15 #将原图像和开运算操作的图像放在同一个窗口显示 16 glay=np.hstack((img1,blackhat)) 17 cv.imshow("glay",glay) 18 cv.waitKey(0) 19 cv.destroyAllWindows()效果图: 实践出真知,博客的代码很完整,但还需要自己实际写一遍才能更加理解。
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |