形态学处理在消除小物体,排除黑洞,白洞时很好用
最基本的形态学操作是:膨胀(dilation)和腐蚀(erosion)。
腐蚀可以简单理解为黑色区域变大,膨胀可以理解为白色区域变大。
效果如图所示:
实现代码:
# -*- coding: utf-8 -*-
"""
Created on Wed Aug 28 16:39:08 2019
运行环境python==3.6 opencv-contrib-python== 4.1 win10系统
第一行“# -*- coding: utf-8 -*-”告诉Python解释器,按照UTF-8编码读取源代码
"""
#图像获取
import cv2
import numpy as np
import copy
#
dir1='lena.jpg' #读取要处理的图片
image=cv2.imread(dir1)
#cv2.imshow("image", image)
#
imgray =cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) #彩色转灰度
#cv2.imshow("imgray", imgray)
#
thresh=120
ret,binary =cv2.threshold(imgray,thresh,255,cv2.THRESH_BINARY) #输入灰度图,输出二值图
cv2.imshow('binary',binary)
#
binary2 =copy.deepcopy(binary) #二值图拷贝一份
kernel =cv2.getStructuringElement(cv2.MORPH_RECT,(5, 5))
eroded = cv2.erode(binary2,kernel) #腐蚀图像
cv2.imshow("ErodedImage",eroded); #显示腐蚀后的图像
#
dilated = cv2.dilate(binary2,kernel) #膨胀图像
cv2.imshow("dilated",dilated) #显示膨胀后的图像
#
binary = cv2.morphologyEx(binary2,cv2.MORPH_OPEN, kernel) #开运算
cv2.imshow("open-result", binary)
#
binary = cv2.morphologyEx(binary2,cv2.MORPH_CLOSE, kernel) #闭运算
cv2.imshow("close-result",binary)
#
top_dst = cv2.morphologyEx(binary2,cv2.MORPH_TOPHAT, kernel) #顶帽
cv2.imshow("top_dst", top_dst)
#
black_dst = cv2.morphologyEx(binary2,cv2.MORPH_BLACKHAT, kernel) #黑帽
cv2.imshow("black_dst",black_dst)
#
basic_dst = cv2.morphologyEx(binary2,cv2.MORPH_GRADIENT, kernel) #形态学梯度
cv2.imshow("basic_dst",basic_dst)
#
cv2.waitKey(0)
cv2.destroyAllWindows()
开运算,其实就是先腐蚀后膨胀的操作。作用:去除噪声,消除小物体在纤细点处分离物平滑较大物体的边界的同时并不明显改变其面积。
闭运算:操作为先膨胀后腐蚀,作用:排除小型空洞(指黑色区域)平滑物体轮廓弥合(连接)窄的间断点,沟壑填补轮廓线断裂。
顶帽:原图像与开运算之间的差值图像
黑帽:闭运算与原图像的差值图像
形态学梯度:用膨胀后的图像减去腐蚀后的图像,得到的差值图像称为梯度图像
领取专属 10元无门槛券
私享最新 技术干货