腐蚀
原理:是在原图的小区域内取局部最小值。因为是二值化图,只有 0 和 255,所以小区域内有一个是 0 该像素点就为 0:
作用:图像中的物体变小
代码
erode(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)#腐蚀函数
import cv2
import numpy as np
# 腐蚀
image = cv2.imread('2.png')
kernel1 = np.ones((3,3),np.uint8) # 腐蚀单元
kernel2 = np.ones((5,5),np.uint8)
kernel3 = np.ones((7,7),np.uint8)
erosion1 = cv2.erode(image, kernel1) # 腐蚀函数
erosion2 = cv2.erode(image, kernel2)
erosion3 = cv2.erode(image, kernel3)
cv2.imshow("original", image)
cv2.imshow("erosion1", erosion1)
cv2.imshow("erosion2", erosion2)
cv2.imshow("erosion3", erosion3)
cv2.waitKey(0)
效果
膨胀
原理:膨胀与腐蚀相反,取的是局部最大值。
作用:先腐蚀后膨胀,连接两个分开的物体,图像中的物体变大。
代码
import cv2
import numpy as np
# 腐蚀
image = cv2.imread('3.jpg')
kernel1 = np.ones((3, 3), np.uint8) # 3个不同尺度的膨胀单元
kernel2 = np.ones((5, 5), np.uint8)
kernel3 = np.ones((9, 9), np.uint8)
dilation1 = cv2.dilate(image, kernel1) # 膨胀函数
dilation2 = cv2.dilate(image, kernel2)
dilation3 = cv2.dilate(image, kernel3)
cv2.imshow("original", image)
cv2.imshow("dilation1", dilation1)
cv2.imshow("dilation2", dilation2)
cv2.imshow("dilation3", dilation3)
cv2.waitKey(0)
效果
开运算/闭运算
开运算就是先腐蚀后膨胀,可以直接通过opencv的morphologyEx进行处理,cv2.MORPH_OPEN指定开运算
代码
开运算:
import cv2
image = cv2.imread('2.png')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
opening = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)
cv2.imshow('original', image)
cv2.imshow('deal', opening)
cv2.waitKey(0)
闭运算:
闭运算就是先膨胀后腐蚀,可以直接调用morphologyEx,cv2.MORPH_CLOSE指定闭运算
import cv2
import numpy as np
image = cv2.imread('2.png')
close_img = cv2.morphologyEx(image,cv2.MORPH_CLOSE,kernel=np.ones((7,7),np.uint8))
cv2.imshow('original', image)
cv2.imshow('deal', close_img)
cv2.waitKey(0)