© Fu Xianjun. All Rights Reserved. 今天小赵带大家进入openCV第五章内容的形态学,案例来自我们辛勤的小傅老师,图片素材都是他自己手绘的。
前言
形态学就是对图像进行一些操作,主要目的依然脱不开为了 提取RIO区域,
提示:以下是本篇文章正文内容,下面案例可供参考
一、形态学是什么?
就是让图像的某些区域发生一些变化如膨胀,腐蚀,礼帽,黑帽运算等等。
二、形态学的实现
1.导包
代码:
import cv2
import numpy as np
2.腐蚀操作
代码如下:
img=cv2.imread('j1.bmp',0)
kernel=np.ones((7,7),np.uint8) # 滤波和,越大核心腐蚀的越多
ErodeImg=cv2.erode(img,kernel) #腐蚀,消除多余的部分,使内容核心部分缩放
cv2.imshow('ErodeImg',ErodeImg)
cv2.waitKey()
cv2.destroyAllWindows()
代码效果如下:
我们可以看到小刺消失了
3.膨胀操作
代码如下(示例):
img=cv2.imread('j1.bmp',0) # 这里使用0是为了方便图像处理减少负荷
kernel=np.ones((7,7),np.uint8)
DilateImg=cv2.dilate(img,kernel) #膨胀,想图像中的前景部分,细节放大,边缘点也可以膨胀
cv2.imshow('yuantu',img)
cv2.imshow('DilateImg',DilateImg)
cv2.waitKey()
cv2.destroyAllWindows()
`代码效果如下:
我们可以看到小刺更粗了,ROI区域也被放大了
4.开运算操作
代码如下(示例):
img=cv2.imread('j.bmp',0)
kernel=np.ones((7,7),np.uint8)
OpenImg=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel) #开运算 先腐蚀先把多余的部分不要的给先腐蚀,在膨胀,只要核心内容
cv2.imshow('yuantu',img)
cv2.imshow('OpenImg',OpenImg)
cv2.waitKey()
cv2.destroyAllWindows()
`代码效果如下:
5.闭运算操作
代码如下(示例):
img=cv2.imread('j.bmp',0)
kernel=np.ones((7,7),np.uint8)
CloseImg=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)#闭运算 先膨胀后腐蚀 填充小孔洞,关闭前景图像内部的小孔洞,还可以链接图片
cv2.imshow('yuantu',img)
cv2.imshow('CloseImg',CloseImg)
cv2.waitKey()
cv2.destroyAllWindows()
`代码效果如下:
6.礼帽操作
代码如下(示例):
img=cv2.imread('j1.bmp',0)
kernel=np.ones((7,7),np.uint8)
ErodeImg=cv2.erode(img,kernel)
DilateImg=cv2.dilate(ErodeImg,kernel)
LiMao=img-DilateImg
Result=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel) #礼帽运算 拿原始图像减去开运算(核心内容),剩下得只有核心内容之外感兴趣内容之
#内得东西了
cv2.imshow('yuantu',img)
cv2.imshow('Result',Result)
cv2.waitKey()
cv2.destroyAllWindows()
`代码效果如下:
7.黑帽操作
代码如下(示例):
img=cv2.imread('j.bmp',0)
kernel=np.ones((7,7),np.uint8)
DilateImg=cv2.dilate(img,kernel)
ErodeImg=cv2.erode(DilateImg,kernel)
HeiMao=img-ErodeImg
Result1=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)#黑帽运算 拿闭运算以后的图减去原图,剩下得只有小黑点了
cv2.imshow('yuantu',img)
cv2.imshow('Result1',Result1)
cv2.waitKey()
cv2.destroyAllWindows()
`代码效果如下:
三、形态学的应用
3.1取消文中不想要的字
代码如下
import cv2
import numpy as np
img=cv2.imread('morph_task.png',0)
cv2.imshow('yuantu',img)
binary=cv2.threshold(img,200,255,0)[1] #将原图中不大于200像素的像素点不变,大于的位置变成255
cv2.imshow('binary',binary)
kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(15,1)) #返回形态学所使用的结构元素(矩形),长为15宽为1
DilateImg=cv2.dilate(binary,kernel) #将阈值改变后核心内容变成0的图,然后用核函数扫他之后膨胀,核函数扫
#不进去的就会消失掉
cv2.imshow('yuantu',img)
cv2.imshow('DilateImg',DilateImg)
cv2.waitKey()
cv2.destroyAllWindows()
代码效果如下
总结
提示:这里对文章进行总结:
形态学的操作也是很好玩的大家都可以找图尝试玩玩看,感兴趣一起探讨一下。