Mahotas - 形态运算符
形态运算符是一组图像处理技术,有助于修改图像中对象的形状、大小和空间关系。它们就像用于重塑或操纵图像中对象的工具。
假设您有一张包含各种对象(如圆形、正方形和线条)的图片。形态运算符允许您以不同的方式更改这些对象的外观。
例如,您可以使它们变大或变小、平滑它们的边缘、删除微小的细节或填补空白。
为了实现这些转换,形态运算符使用数学运算,这些运算涉及使用称为结构元素的特殊模式扫描图像。此结构元素定义操作期间将考虑的每个像素周围的邻域的形状和大小。
Mahotas 和形态运算符
Mahotas 提供了一套全面的形态运算符,可应用于二值、灰度或多通道图像。这些运算符使用优化算法高效实现,适合用于具有大规模数据集的实际应用。
让我们看看可以在 mahotas − 中执行的几个形态运算
扩张
扩张是一种形态运算,可扩大图像中对象边界上的像素。它涉及使用结构元素扫描图像,并用结构元素定义的相应邻域内的最大值替换每个像素。
让我们看看下面的扩张图像和原始图像 −

腐蚀
腐蚀是一种基本的形态学运算符,它可以收缩或腐蚀图像中对象边界上的像素。
以下是腐蚀图像及其原始图像 −

开运算
开运算是腐蚀和扩张的组合。它会移除小物体并填充前景中的小孔,同时保留较大物体的整体形状和连通性。
让我们看看 mahotas − 中的打开图像

关闭
关闭是打开的逆操作,包括膨胀和腐蚀。它填充前景中的小间隙和孔,确保物体的连通性。
现在,让我们看看 mahotas − 中的闭合图像

条件侵蚀
条件侵蚀是一种形态学操作,它根据用户定义的条件保留图像中的结构。它根据第二个图像(称为标记图像)指定的条件选择性地侵蚀图像区域。
该操作仅在标记图像具有非零值时侵蚀图像。
下图显示条件侵蚀 −

条件扩张
条件扩张类似于条件侵蚀,但操作方式相反。它根据标记图像指定的条件选择性地扩大图像的区域。
该操作仅在标记图像具有非零值时扩大图像。
下图显示了条件扩张 −

区域最大值
区域最大值是图像中其邻域内强度最高的点。它们表示图像中的局部峰值或显著特征。
Mahotas 中的区域最大值运算符可识别这些局部最大值并将其标记为前景像素。
下图表示区域最大值 −

区域最小值
区域最小值是图像中其邻域内强度最低的点。它们表示图像中的局部盆地或凹陷。
Mahotas 中的区域最小值运算符识别这些局部最小值并将其标记为背景像素。
下图表示区域最小值 −

示例
在下面的例子中,我们尝试执行上面解释的所有形态学操作 −
import mahotas as mh import matplotlib.pyplot as plt import numpy as np image = mh.imread('nature.jpeg', as_grey=True).astype(np.uint8) # 膨胀 dilated_image = mh.dilate(image, Bc=mh.disk(8)) plt.title("Dilated Image") plt.imshow(dilated_image) plt.show() # 侵蚀 plt.title("Eroded Image") eroded_image = mh.erode(image, Bc=mh.disk(8)) plt.imshow(eroded_image) plt.show() # 打开 plt.title("Opened Image") opened_image = mh.open(image) plt.imshow(opened_image) plt.show() # 关闭 plt.title("Closed Image") closed_image = mh.close(image) plt.imshow(closed_image) plt.show() # 条件扩张 plt.title("Conditional Dilation") g = image * 6 cdilated_image = mh.cdilate(image, g) plt.imshow(cdilated_image) plt.show() # 条件侵蚀 plt.title("Conditional Erosion") scaled_image = image * 0.5 scaled_image = scaled_image.astype(np.uint8) ceroded_image = mh.cerode(image, scaled_image) plt.imshow(ceroded_image) plt.show() # 区域最大值 plt.title("Regional Maxima") regional_maxima = mh.regmax(image) plt.imshow(regional_maxima) plt.show() # 区域最小值 plt.title("Regional Minima") regional_minima = mh.regmin(image) plt.imshow(regional_minima) plt.show()
输出
得到的输出如下所示 −
扩张:

侵蚀:

打开的图像:

关闭的图像:

条件扩张:

条件侵蚀:

区域最大值:

区域最小值:

我们将在本节的其余章节中详细讨论所有形态算子。