>>> from env_helper import info; info()
页面更新时间: 2024-04-03 23:07:45
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-18-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

2.6. Python数字图像处理:基本形态学滤波

对图像进行形态学变换。变换对象一般为灰度图或二值图,功能函数放在morphology子模块内。

2.6.1. 膨胀(dilation)

原理:一般对二值图像进行操作。找到像素值为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()

用边长为5的正方形滤波器进行膨胀滤波:

>>> dst1=sm.dilation(img,sm.square(5))

用边长为15的正方形滤波器进行膨胀滤波:

>>> dst2=sm.dilation(img,sm.square(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)
<matplotlib.image.AxesImage at 0x7fa48a124d50>
_images/sec13_morphology_6_1.png

分别用边长为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.6.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()

用边长为5的正方形滤波器进行膨胀滤波:

>>> dst1=sm.erosion(img,sm.square(5))

用边长为25的正方形滤波器进行膨胀滤波:

>>> dst2=sm.erosion(img,sm.square(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)
<matplotlib.image.AxesImage at 0x7fa487bc5390>
_images/sec13_morphology_12_1.png

注意,如果处理图像为二值图像(只有0和1两个值),则可以调用:

skimage.morphology.binary_erosion(image, selem=None)

用此函数比处理灰度图像要快。

2.6.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('./sec09_xzv8.png'))

用边长为9的圆形滤波器进行膨胀滤波:

>>> dst=sm.opening(img,sm.disk(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.5, 511.5, 511.5, -0.5)
_images/sec13_morphology_16_1.png

注意,如果处理图像为二值图像(只有0和1两个值),则可以调用:

skimage.morphology.binary_opening(image, selem=None)

用此函数比处理灰度图像要快。

2.6.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('./sec09_xzv8.png'))

用边长为5的圆形滤波器进行膨胀滤波:

>>> dst=sm.closing(img,sm.disk(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.5, 511.5, 511.5, -0.5)
_images/sec13_morphology_20_1.png

注意,如果处理图像为二值图像(只有0和1两个值),则可以调用:

skimage.morphology.binary_closing(image, selem=None)

用此函数比处理灰度图像要快。

2.6.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('./sec09_xzv8.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')
(-0.5, 511.5, 511.5, -0.5)
_images/sec13_morphology_22_1.png

2.6.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('./sec09_xzv8.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')
(-0.5, 511.5, 511.5, -0.5)
_images/sec13_morphology_24_1.png