Python数字图像处理:skimage形态学滤波详解与实战
本文详解Python中skimage库的形态学滤波功能,涵盖膨胀、腐蚀、开运算、闭运算及白黑帽算法。通过具体代码示例,展示不同结构元素对二值及灰度图像的处理效果,解析参数设置与运算原理,帮助开发者掌握图像边缘处理与噪声去除的核心技术。
引言
对图像执行形态学变换操作时,处理对象通常限定为灰度图或二值图,相关功能函数均封装在morphology子模块中。
1、膨胀(dilation)
原理:该操作主要面向二值图像。算法逻辑为定位像素值为1的点,并将其邻近像素点的值也设为1。在二值图中,1代表白色,0代表黑色,因此膨胀操作能扩大白色区域范围,同时压缩黑色区域。此方法常用于扩充物体边缘或填充内部微小孔洞。
功能函数:skimage.morphology.dilation(image, selem=None)
其中selem参数代表结构元素,用于定义局部区域的形状与尺寸大小。
from skimage import data
import skimage.morphology as sm
import matplotlib.pyplot as plt
img=data.checkerboard()
dst1=sm.dilation(img,sm.square(5)) #用边长为5的正方形滤波器进行膨胀滤波
dst2=sm.dilation(img,sm.square(15)) #用边长为15的正方形滤波器进行膨胀滤波
plt.figure('morphology',figsize=(8,8))
plt.subplot(131)
plt.title('origin image')
plt.imshow(img,plt.cm.gray)
plt.subplot(132)
plt.title('morphological image')
plt.imshow(dst1,plt.cm.gray)
plt.subplot(133)
plt.title('morphological image')
plt.imshow(dst2,plt.cm.gray)分别使用边长为5和15的正方形滤波器对棋盘格图片执行膨胀操作,处理结果如下:

从结果可见,滤波器尺寸对最终操作效果影响显著。在实际应用中,滤波器尺寸通常建议设置为奇数。
除正方形滤波器外,系统还支持多种其他形状的滤波器,具体列举如下:
morphology.square: 正方形
morphology.disk: 平面圆形
morphology.ball: 球形
morphology.cube: 立方体形
morphology.diamond: 钻石形
morphology.rectangle: 矩形
morphology.star: 星形
morphology.octagon: 八角形
morphology.octahedron: 八面体
需注意,若处理的图像为仅含0和1两个值的二值图像,可调用以下专用函数:
skimage.morphology.binary_dilation(image, selem=None)
相较于处理灰度图像,使用此专用函数处理二值图像的速度更快。
2、腐蚀(erosion)
函数:skimage.morphology.erosion(image, selem=None)
selem参数同样表示结构元素,用于设定局部区域的形状和大小。
腐蚀是与膨胀相反的操作,它将0值(黑色)扩展至邻近像素。该操作旨在扩大黑色部分,缩小白色部分,常用于提取物体骨干信息、去除毛刺或消除孤立像素点。
from skimage import data
import skimage.morphology as sm
import matplotlib.pyplot as plt
img=data.checkerboard()
dst1=sm.erosion(img,sm.square(5)) #用边长为5的正方形滤波器进行膨胀滤波
dst2=sm.erosion(img,sm.square(25)) #用边长为25的正方形滤波器进行膨胀滤波
plt.figure('morphology',figsize=(8,8))
plt.subplot(131)
plt.title('origin image')
plt.imshow(img,plt.cm.gray)
plt.subplot(132)
plt.title('morphological image')
plt.imshow(dst1,plt.cm.gray)
plt.subplot(133)
plt.title('morphological image')
plt.imshow(dst2,plt.cm.gray)
注意,如果处理图像为二值图像(只有0和1两个值),则可以调用:
skimage.morphology.binary_erosion(image, selem=None)
用此函数比处理灰度图像要快。
3、开运算(opening)
函数:skimage.morphology.openning(image, selem=None)
selem表示结构元素,用于设定局部区域的形状和大小。
开运算的执行顺序为先腐蚀后膨胀,其主要作用是消除图像中的小物体或微小斑块。
from skimage import io,color
import skimage.morphology as sm
import matplotlib.pyplot as plt
img=color.rgb2gray(io.imread('d:/pic/mor.png'))
dst=sm.opening(img,sm.disk(9)) #用边长为9的圆形滤波器进行膨胀滤波
plt.figure('morphology',figsize=(8,8))
plt.subplot(121)
plt.title('origin image')
plt.imshow(img,plt.cm.gray)
plt.axis('off')
plt.subplot(122)
plt.title('morphological image')
plt.imshow(dst,plt.cm.gray)
plt.axis('off')
注意,如果处理图像为二值图像(只有0和1两个值),则可以调用:
skimage.morphology.binary_opening(image, selem=None)
用此函数比处理灰度图像要快。
4、闭运算(closing)
函数:skimage.morphology.closing(image, selem=None)
selem表示结构元素,用于设定局部区域的形状和大小。
闭运算的执行顺序为先膨胀后腐蚀,主要用途是填充图像内部的孔洞。
from skimage import io,color
import skimage.morphology as sm
import matplotlib.pyplot as plt
img=color.rgb2gray(io.imread('d:/pic/mor.png'))
dst=sm.closing(img,sm.disk(9)) #用边长为5的圆形滤波器进行膨胀滤波
plt.figure('morphology',figsize=(8,8))
plt.subplot(121)
plt.title('origin image')
plt.imshow(img,plt.cm.gray)
plt.axis('off')
plt.subplot(122)
plt.title('morphological image')
plt.imshow(dst,plt.cm.gray)
plt.axis('off')
注意,如果处理图像为二值图像(只有0和1两个值),则可以调用:
skimage.morphology.binary_closing(image, selem=None)
用此函数比处理灰度图像要快。
5、白帽(white-tophat)
函数:skimage.morphology.white_tophat(image, selem=None)
selem表示结构元素,用于设定局部区域的形状和大小。
白帽运算通过从原图像中减去其开运算结果,从而提取出比结构元素更小的亮色(白色)点。
from skimage import io,color
import skimage.morphology as sm
import matplotlib.pyplot as plt
img=color.rgb2gray(io.imread('d:/pic/mor.png'))
dst=sm.white_tophat(img,sm.square(21))
plt.figure('morphology',figsize=(8,8))
plt.subplot(121)
plt.title('origin image')
plt.imshow(img,plt.cm.gray)
plt.axis('off')
plt.subplot(122)
plt.title('morphological image')
plt.imshow(dst,plt.cm.gray)
plt.axis('off')
6、黑帽(black-tophat)
函数:skimage.morphology.black_tophat(image, selem=None)
selem表示结构元素,用于设定局部区域的形状和大小。
黑帽运算通过从原图像中减去其闭运算结果,提取出比结构元素更小的暗色(黑色)点,并将这些黑点进行反色处理。
from skimage import io,color
import skimage.morphology as sm
import matplotlib.pyplot as plt
img=color.rgb2gray(io.imread('d:/pic/mor.png'))
dst=sm.black_tophat(img,sm.square(21))
plt.figure('morphology',figsize=(8,8))
plt.subplot(121)
plt.title('origin image')
plt.imshow(img,plt.cm.gray)
plt.axis('off')
plt.subplot(122)
plt.title('morphological image')
plt.imshow(dst,plt.cm.gray)
plt.axis('off')
以上就是python数字图像处理之基本形态学滤波的详细内容,更多关于python数字图像形态学滤波的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













