Mahotas - 填补图像中的空洞
填补图像中的空洞是指去除图像前景区域中的小间隙或空洞。在填补过程中,首先执行膨胀操作,然后执行腐蚀操作。
膨胀会扩大前景区域的边界。对于每个像素,膨胀操作会根据结构元素检查其相邻像素。
如果任何相邻像素为白色,则中心像素也会变为白色。此过程有助于填补前景区域内的间隙或空洞。
膨胀后,腐蚀会缩小前景区域的边界。同样,使用结构元素,腐蚀会检查每个像素及其相邻像素。如果任何相邻像素为黑色,则中心像素会变为黑色。
此步骤有助于细化和平滑前景区域的轮廓,同时保留主要结构。
在 Mahotas 中关闭图像中的孔
要在 Mahotas 中执行关闭孔的过程,我们使用 mahotas.close_holes() 函数。该方法允许顺序应用膨胀和腐蚀操作。
通过首先应用膨胀操作(扩大区域),然后应用腐蚀操作(细化边界),闭合操作可以有效地关闭二值图像前景区域中的小孔或间隙。
mahotas.close_holes() 函数
Mahotas 中的 close_holes() 函数将二值图像作为输入,并返回孔已关闭的结果图像。
close_holes() 函数会自动检测并关闭孔,而无需明确定义结构元素。
语法
以下是 mahotas − 中 close_holes() 函数的基本语法
mahotas.close_holes(ref, Bc=None)
其中,
ref − 是输入的二值图像。
Bc − 指定用于关闭操作的结构元素或内核。如果未提供(设置为 None),则将使用默认结构元素。
示例
在下面的示例中,我们正在关闭图像中的孔 −
import mahotas as mh import numpy as np import matplotlib.pyplot as plt image = mh.imread('pic.jpg',as_grey = True) closed_holes_image = mh.close_holes(image) # 创建带有子图的图形 fig, axis = plt.subplots(1, 2, figsize=(7,5 )) # 显示原始图像 axes[0].imshow(image) axes[0].set_title('Original Image') axes[0].axis('off') # 显示封闭孔图像 axes[1].imshow(closed_holes_image, cmap='gray') axes[1].set_title('Closed Holes Image') axes[1].axis('off') # 调整布局并显示图 plt.tight_layout() plt.show()
输出
执行上述代码后,我们得到以下输出 −

使用随机二进制图像
我们还可以通过创建随机二进制图像来执行图像中的闭孔过程。
为此,我们首先使用 NumPy 创建一个随机二进制图像,其中像素为 0(背景)或 1(前景)。
一旦我们有了二进制图像,我们就可以继续使用结构元素执行形态学闭合。
它将定义膨胀和腐蚀操作的邻域的形状和大小。最后,我们得到图像中的结果闭合孔。
示例
在这里,我们尝试通过创建随机二进制图像 − 来执行图像中的闭孔过程
import mahotas as mh import numpy as np from pylab import imshow, show # 创建随机二进制图像 image = np.random.randint(0, 2, size=(100, 50), dtype=np.bool_) Bc=np.ones((3,3)) # 使用 3x3 交叉结构元素执行形态学闭合孔洞 result = mh.close_holes(image, Bc) # 显示结果 imshow(result) show()
输出
生成的输出如下所示 −

使用多次迭代来关闭孔洞
对于使用多次迭代来关闭孔洞,我们的目标是逐渐填补较小的孔洞并反复优化结果。
我们首先创建原始二进制图像的副本。此副本将作为每次孔洞关闭过程迭代的起点。然后,使用 for 循环,我们迭代指定的次数。
在每次迭代期间,mahotas.close_holes() 函数都会应用于图像的当前版本。该函数识别图像中的孔洞并进行填充,逐步改善前景区域的连通性和连续性。
示例
现在,我们通过多次迭代 − 来关闭图像中的孔洞
import mahotas import numpy as np import matplotlib.pyplot as plt image = mahotas.imread('pic.jpg', as_grey = True) # 通过多次迭代来关闭二值图像中的孔洞 closed_image = image.copy() for i in range(3): closed_image = mahotas.close_holes(closed_image) # 显示原始图像和闭合图像 fig, axis = plt.subplots(1, 2, figsize=(10, 5)) axes[0].imshow(image, cmap='gray') axes[0].set_title('Original Image') axes[1].imshow(closed_image, cmap='gray') axes[1].set_title('Closed Image') plt.tight_layout() plt.show()
输出
以下是上述代码的输出 −
