形态学是从图像中提取分量信息,得到图像最本质的特征。形态学操作主要包括:腐蚀,膨胀,开运算,闭运算,,形态学梯度,礼帽运算,黑帽运算。腐蚀和膨胀是基础,其他运算都是二者的混合运算。
顾名思义,所谓腐蚀就是清除掉图像的一些毛刺和细节。其本质上也是一种空间滤波,设定一个掩模,掩模中心逐次滑过每一个像素点,当前像素点(即掩模中心所对应的位置)的值设为掩模覆盖区域中像素的最小值。 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()运行结果:
闭操作与开操作相反,其是先进膨胀,再对膨胀后的图像进行腐蚀。其可以用于取出图像内部的一些小黑点,也可以将两个相距很近的图形进行相连。
运行结果:
运行结果: #六.形态学梯度 梯度就是用膨胀后的图像减去腐蚀后的图像,这样就可以得到原始图像的边界。
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()