注1:本文是“MATLAB/Python编程教程”系列的一部分,专注于使用Python和Matlab实现特定的功能。本篇我们将实现的功能是:图片的形态学处理。
形态学处理是一种处理二值图像的方法,主要基于图像的形状和结构来进行操作。其基本操作包括腐蚀(Erosion)、膨胀(Dilation)、开操作(Opening)和闭操作(Closing)。接下来,我们将通过Python和Matlab来实现这些基本操作。
腐蚀(Erosion): 是一种侵蚀图像边界的操作。在二值图像中,它将与结构元素相匹配的所有像素置为0。
膨胀(Dilation): 是一种扩大图像边界的操作。在二值图像中,它将与结构元素有重叠的所有像素置为1。
开操作(Opening): 是先腐蚀后膨胀的操作。这种操作可以消除小物体,保持大物体的形状,并平滑边界。
闭操作(Closing): 是先膨胀后腐蚀的操作。这种操作可以填充小孔,保持大孔的形状,并平滑边界。
在Python中,skimage
库提供了形态学处理的功能。以下是一个基本的代码示例:
from skimage import io, morphology
import matplotlib.pyplot as plt
# 读取图像
img = io.imread('sample.png', as_gray=True)
# 定义结构元素
selem = morphology.square(3)
# 进行形态学操作
eroded = morphology.erosion(img, selem)
dilated = morphology.dilation(img, selem)
opened = morphology.opening(img, selem)
closed = morphology.closing(img, selem)
# 显示结果
plt.figure(figsize=(12, 8))
plt.subplot(221); plt.imshow(eroded, cmap='gray'); plt.title('Erosion')
plt.subplot(222); plt.imshow(dilated, cmap='gray'); plt.title('Dilation')
plt.subplot(223); plt.imshow(opened, cmap='gray'); plt.title('Opening')
plt.subplot(224); plt.imshow(closed, cmap='gray'); plt.title('Closing')
plt.show()
在Matlab中,图像处理工具箱(Image Processing Toolbox)提供了形态学处理的功能。以下是一个基本的代码示例:
% 读取图像
img = imread('sample.png');
img = im2bw(img);
% 定义结构元素
se = strel('square', 3);
% 进行形态学操作
eroded = imerode(img, se);
dilated = imdilate(img, se);
opened = imopen(img, se);
closed = imclose(img, se);
% 显示结果
subplot(2,2,1); imshow(eroded); title('Erosion');
subplot(2,2,2); imshow(dilated); title('Dilation');
subplot(2,2,3); imshow(opened); title('Opening');
subplot(2,2,4); imshow(closed); title('Closing');
通过观察结果,你可以看到各种形态学操作对图像的影响。腐蚀操作可以消除图像中的小物体,膨胀操作可以增大图像中的物体。开操作对于消除小物体和平滑边界特别有效,而闭操作对于填充小孔和平滑边界特别有效。