Python数字图像处理:skimage形态学滤波详解与实战

Mason
Mason
发布时间:2026-10-12| 2人浏览过
原创

本文详解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数字图像形态学滤波的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。