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)
# Create a figure with subplots
fig, axes = plt.subplots(1, 2, figsize=(7,5 ))
# Display the original image
axes[0].imshow(image)
axes[0].set_title('Original Image')
axes[0].axis('off')
# Display the closed holes image
axes[1].imshow(closed_holes_image, cmap='gray')
axes[1].set_title('Closed Holes Image')
axes[1].axis('off')
# Adjust the layout and display the plot
plt.tight_layout()
plt.show()

输出

执行上述代码后,我们将获得以下输出:

Closing Holes Image

使用随机二值图像

我们还可以通过创建随机二值图像来执行填充图像孔洞的过程。

为此,我们首先使用 NumPy 创建一个随机二值图像,其中像素为 0(背景)或 1(前景)。

获得二值图像后,我们可以通过使用结构元素执行形态学闭运算。

它将定义膨胀和腐蚀操作的邻域的形状和大小。最后,我们得到图像中已填充的孔洞的结果。

示例

在这里,我们尝试通过创建随机二值图像来执行填充图像孔洞的过程:

import mahotas as mh
import numpy as np
from pylab import imshow, show
# Create a random binary image
image = np.random.randint(0, 2, size=(100, 50), dtype=np.bool_)
Bc=np.ones((3,3))
# Perform morphological closing holes with a 3x3 cross structuring element
result = mh.close_holes(image, Bc)
# Show the result
imshow(result)
show()

输出

产生的输出如下所示:

Closing Holes Image

多次迭代填充孔洞

对于多次迭代填充孔洞,我们的目标是逐渐填充较小的孔洞并反复细化结果。

我们首先创建原始二值图像的副本。此副本将作为孔洞填充过程每次迭代的起点。然后,使用 for 循环,我们迭代指定的次数。

在每次迭代中,mahotas.close_holes() 函数应用于图像的当前版本。该函数识别图像中的孔洞并填充它们,逐渐改善前景区域的连通性和连续性。

示例

现在,我们正在多次迭代填充图像中的孔洞:

import mahotas
import numpy as np
import matplotlib.pyplot as plt
image = mahotas.imread('pic.jpg', as_grey = True)
# Close the holes in the binary image with multiple iterations
closed_image = image.copy()
for i in range(3):
   closed_image = mahotas.close_holes(closed_image)
# Display the original and closed images
fig, axes = 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()

输出

以下是上述代码的输出:

Closing Holes Multiple Images
广告