腐蚀:其原理是在原图的小区域内取局部最小值。这个核也叫结构元素,因为形态学操作其实也是应用卷积来实现的,结构元素可以是矩形、椭圆、十字架,可以用cv2.getStructuringElement()来生成不同形状的结构元素
import numpy as np
import matplotlib.pyplot as plt
import cv2
#图像形态学
def show(image):
plt.imshow(image)
plt.axis('off')
plt.show()
def imread(image):
image=cv2.imread(image)
#把图像的BGR转换成RGB
image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
return image
image=imread('im.jpg')
#矩形结构
kernel1=cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
#椭圆结构
kernel2=cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
#十字架结构
kernel3=cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
# erosion=cv2.erode(image,kernel1)
# show(image)
#可以进行多次腐蚀
for i in range(3):
erosion = cv2.erode(image, kernel1,iterations=i+1)
show(erosion)
腐蚀几次之后的效果: 腐蚀之后黑色越来越多
#Dilation膨胀 #膨胀与腐蚀相反,取的是局部最大值。cv2.dilate()
import numpy as np
import matplotlib.pyplot as plt
import cv2
#图像形态学
def show(image):
plt.imshow(image)
plt.axis('off')
plt.show()
def imread(image):
image=cv2.imread(image)
#把图像的BGR转换成RGB
image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
return image
#Dilation膨胀
#膨胀与腐蚀相反,取的是局部最大值。cv2.dilate()
for i in range(3):
dilation = cv2.dilate(image, kernel1,iterations=i+1)
show(dilation)
效果展示:膨胀之后白色越来越多
#开运算
#先腐蚀后膨胀胶开运算,其作用是消除小白点。这类形态学操作作用cv2.morphologyEx()函数实现
openging=cv2.morphologyEx(image,cv2.MORPH_OPEN,kernel1)
show(openging)
效果展示:
#闭运算 #闭运算则相反,先膨胀后腐蚀。其作用是消除小黑点。
closeing=cv2.morphologyEx(image,cv2.MORPH_CLOSE,kernel1)
show(closeing)
先开运算,再进行闭运算(消除白点和黑点)
openging=cv2.morphologyEx(image,cv2.MORPH_OPEN,kernel1)
show(openging)
closeing=cv2.morphologyEx(openging,cv2.MORPH_CLOSE,kernel1)
show(closeing)
效果展示:
#Gradient形态学梯度 #膨胀图减去腐蚀图,dilation-erosion,得到物体的轮廓
gradient=cv2.morphologyEx(image,cv2.MORPH_GRADIENT,kernel1)
show(gradient)
#TopHat顶帽/White Hat白帽(把开运算去除掉的白点显示出来) #原图减去开运算后的图:src-opening
tophat=cv2.morphologyEx(image,cv2.MORPH_TOPHAT,kernel1)
show(tophat)
#balckHat黑帽 #闭运算后的图减去原图:closing-src
blackhat=cv2.morphologyEx(image,cv2.MORPH_BLACKHAT,kernel1)
show(blackhat)