腐蚀
img=np.zeros((5,5),np.uint8)
img[1:4,1:4]=1
kernel=np.ones((3,1),np.uint8)
erosion=cv2.erode(img,kernel)
print("img=\n",img)
print("kernel=\n",kernel)
print("erosion=\n",erosion)
img=
[[0 0 0 0 0]
[0 1 1 1 0]
[0 1 1 1 0]
[0 1 1 1 0]
[0 0 0 0 0]]
kernel=
[[1]
[1]
[1]]
erosion=
[[0 0 0 0 0]
[0 0 0 0 0]
[0 1 1 1 0]
[0 0 0 0 0]
[0 0 0 0 0]]
img = cv2.imread("erode.png")
#img2 = cv2.medianBlur(img,5)
kernel = np.ones((2,2),np.uint8)
img2 = cv2.erode(img,kernel,iterations=5)
#
cv2.imshow("i",img2)
cv2.imshow("i1",img)
iterations=5:迭代五次
迭代次数为1时:
毛刺还没有腐蚀掉。
膨胀
膨胀操作是形态学中另外一种基本的操作。膨胀操作和腐蚀操作的作用是相反的,膨胀操作能对图像的边界进行扩张。膨胀操作将与当前对象(前景)接触到的背景点合并到当前对象内,从而实现将图像的边界点向外扩张。如果图像内两个对象的距离较近,那么在膨胀的过程中,两个对象可能会连通在一起。膨胀操作对填补图像分割后图像内所存在的空白相当有帮助。
只要当核kernel的任意一点处于前景图像中时,就将当前中心点所对应的膨胀结果图像内像素点的值置为1。
开运算
先腐蚀,再膨胀,可以用于去噪 计数
img = cv2.imread("erode.png")
#img2 = cv2.medianBlur(img,5)
kernel = np.ones((3,3),np.uint8)
r1 = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
cv2.imshow("i",r1)
cv2.imshow("i1",img)
cv2.waitKey()
闭运算
闭运算是先膨胀、后腐蚀的运算,它有助于关闭前景物体内部的小孔,或去除物体上的小黑点,还可以将不同的前景图像进行连接。
closing=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)
形态学梯度运算
形态学梯度运算是用图像的膨胀图像减腐蚀图像的操作,该操作可以获取原始图像中前景图像的边缘。 形态学梯度运算使用膨胀图像(扩张亮度)减腐蚀图像(收缩亮度),得到原始图像中前景对象的边缘。
img = cv2.imread("erode.png")
#img2 = cv2.medianBlur(img,5)
kernel = np.ones((5,5),np.uint8)
r1 = cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
cv2.imshow("i",r1)
cv2.imshow("i1",img)
cv2.waitKey()
礼帽运算
可获取图像噪声信息
img = cv2.imread("erode.png")
#img2 = cv2.medianBlur(img,5)
kernel = np.ones((5,5),np.uint8)
r1 = cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
cv2.imshow("i",r1)
cv2.imshow("i1",img)
核函数
例使用函数cv2.getStructuringElement()生成不同结构的核。 根据题目要求,编写程序如下:
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT,(5, 5))
kernel2 = cv2.getStructuringElement(cv2.MORPH_CROSS,(5, 5))
kernel3 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5, 5))
print("kernel1=\n", kernel1)
print("kernel2=\n", kernel2)
print("kernel3=\n", kernel3)
kernel1=
[[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]]
kernel2=
[[0 0 1 0 0]
[0 0 1 0 0]
[1 1 1 1 1]
[0 0 1 0 0]
[0 0 1 0 0]]
kernel3=
[[0 0 1 0 0]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[0 0 1 0 0]]
用不同的核做膨胀运算:
r1 = cv2.dilate(img,kernel1)