图像形态学操作

    科技2026-01-30  6

    文章目录

    一.腐蚀二.膨胀三.通用形态学操作函数四.开运算五.闭操作1.去除黑点2.将断开物体相连 七.礼帽操作七.黑帽操作


    形态学是从图像中提取分量信息,得到图像最本质的特征。形态学操作主要包括:腐蚀,膨胀,开运算,闭运算,,形态学梯度,礼帽运算,黑帽运算。腐蚀和膨胀是基础,其他运算都是二者的混合运算。

    一.腐蚀

    顾名思义,所谓腐蚀就是清除掉图像的一些毛刺和细节。其本质上也是一种空间滤波,设定一个掩模,掩模中心逐次滑过每一个像素点,当前像素点(即掩模中心所对应的位置)的值设为掩模覆盖区域中像素的最小值。 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()

    Processed: 0.012, SQL: 9