形态学是从图像中提取分量信息,得到图像最本质的特征。形态学操作主要包括:腐蚀,膨胀,开运算,闭运算,,形态学梯度,礼帽运算,黑帽运算。腐蚀和膨胀是基础,其他运算都是二者的混合运算。
一.腐蚀
顾名思义,所谓腐蚀就是清除掉图像的一些毛刺和细节。其本质上也是一种空间滤波,设定一个掩模,掩模中心逐次滑过每一个像素点,当前像素点(即掩模中心所对应的位置)的值设为掩模覆盖区域中像素的最小值。
opencv中提供的腐蚀处理函数为cv2.erode(),其语法格式为:
dst=cv2.erode(src,kernel,[anchor[,iterations[,borderType)
参数说明:
dst:目标输出图像
src:原始输入图像
kernel:核即掩模的结构,可以自定义生成。
anchor:瞄点,即当前像素点在掩模中的对应位置,一般默认为(-1,-1),即在核的中心。
iteration:迭代次数,即进行掩模的次数。
borderType:边间像素的处理方式。
使用数组演示掩模的原理:
import cv2
import numpy as np
arr=np.zeros((5,5),dtype=np.uint8)
arr[1:4,1:4]=1
kernel=np.array([[1],[1],[1]])
arr1=cv2.erode(arr,kernel)
print("arr",arr)
print("arr1",arr1)
运行结果:
image=np.ones((5,5),dtype=np.uint8)
image[2,1:4]=0
image1=cv2.erode(image,kernel)
print("image",image)
print("image1",image1)
运行结果:
用图像演示掩模的效果:
image=cv2.imread("wb3.png")
kernel=np.ones((3,3))
erosion=cv2.erode(image,kernel)
cv2.imshow("image",image)
cv2.imshow("erosion",erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:
二.膨胀
顾名思义,所谓膨胀就是扩大图像的一些毛刺和细节。其本质上也是一种空间滤波,设定一个掩模,掩模中心逐次滑过每一个像素点,当前像素点(即掩模中心所对应的位置)的值设为掩模覆盖区域中像素的最大值。
opencv中提供的腐蚀处理函数为cv2dilate(),其语法格式为:
dst=cv2.dilate(src,kernel,[anchor[,iterations[,borderType)
参数说明:
dst:目标输出图像
src:原始输入图像
kernel:核即掩模的结构,可以自定义生成。
anchor:瞄点,即当前像素点在掩模中的对应位置,一般默认为(-1,-1),即在核的中心。
iteration:迭代次数,即进行掩模的次数。
borderType:边间像素的处理方式。
使用数组演示掩模的原理:
import cv2
import numpy as np
arr=np.zeros((5,5),dtype=np.uint8)
arr[1:4,1:4]=255
kernel=np.array([[1],[1],[1]])
arr1=cv2.dilate(arr,kernel)
print("arr",arr)
print("arr1",arr1)
运行结果:
用图像演示掩模的效果:
image=cv2.imread("wb3.png")
kernel=np.ones((3,3))
erosion=cv2.dilate(image,kernel,iterations=5)
cv2.imshow("image",image)
cv2.imshow("erosion",erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:
三.通用形态学操作函数
其他形态学操作为以上两种操作的不同组合,opencv提供了通用性形态学操作函数cv2.morphologyEx(),其可以通过不同参数实现不同的操作。
函数语法格式:
dst=cv2.morphologyEx(src,op,kernel,,[anchor[,iterations[,borderType)
参数说明:
dst:目标输出图像
src:原始输入图像
op:代表操作类型,常见形式有:
kernel:核即掩模的结构,可以自定义生成。
anchor:瞄点,即当前像素点在掩模中的对应位置,一般默认为(-1,-1),即在核的中心。
iteration:迭代次数,即进行掩模的次数。
borderType:边间像素的处理方式。
四.开运算
开运算是先将图像腐蚀,在对腐蚀的图像进行膨胀。其可以用于去噪,即先腐蚀去噪,在膨胀,使图像除噪声外的其他点恢复原状。还可以用于计数,因为其可以将图像中相连的地方进行分开。
用于去噪:
image=cv2.imread("wb1.png")
image=255-image
kernel=np.ones((3,3))
after=cv2.morphologyEx(image,cv2.MORPH_OPEN,kernel)
cv2.imshow("image",image)
cv2.imshow("after",after)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:
五.闭操作
闭操作与开操作相反,其是先进膨胀,再对膨胀后的图像进行腐蚀。其可以用于取出图像内部的一些小黑点,也可以将两个相距很近的图形进行相连。
1.去除黑点
image=cv2.imread("wb6.png")
image=255-image
kernel=np.ones((9,9))
after=cv2.morphologyEx(image,cv2.MORPH_CLOSE,kernel)
cv2.imshow("image",image)
cv2.imshow("after",after)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:
2.将断开物体相连
image=cv2.imread("wb5.png")
image=255-image
kernel=np.ones((50,50))
after=cv2.morphologyEx(image,cv2.MORPH_CLOSE,kernel)
cv2.imshow("image",image)
cv2.imshow("after",after)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:
#六.形态学梯度
梯度就是用膨胀后的图像减去腐蚀后的图像,这样就可以得到原始图像的边界。
image=cv2.imread("wb6.png")
image=255-image
kernel=np.ones((5,5))
gradient=cv2.morphologyEx(image,cv2.MORPH_GRADIENT,kernel)
cv2.imshow("image",image)
cv2.imshow("after",gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:
七.礼帽操作
礼帽就是用原始图像减去开运算后的结果,这样就可以得到原始图像的噪声信息。
image=cv2.imread("wb3.png")
kernel=np.ones((5,5))
tophat=cv2.morphologyEx(image,cv2.MORPH_TOPHAT,kernel)
cv2.imshow("image",image)
cv2.imshow("after",tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:
七.黑帽操作
礼帽就是用闭运算的结果减去原始图像的结果,这样就可以得到原始图像的黑点或小孔信息。
image=cv2.imread("wb6.png")
image=255-image
kernel=np.ones((5,5))
after=cv2.morphologyEx(image,cv2.MORPH_BLACKHAT,kernel)
cv2.imshow("image",image)
cv2.imshow("after",after)
cv2.waitKey(0)
cv2.destroyAllWindows()