注意
转到最后 下载完整的示例代码。
2.6.8.20. 使用数学形态学清理分割¶
一个展示如何使用数学形态学清理分割的例子:去除小区域和孔洞。
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
rng = np.random.default_rng(27446968)
n = 10
l = 256
im = np.zeros((l, l))
points = l * rng.random((2, n**2))
im[(points[0]).astype(int), (points[1]).astype(int)] = 1
im = sp.ndimage.gaussian_filter(im, sigma=l / (4.0 * n))
mask = (im > im.mean()).astype(float)
img = mask + 0.3 * rng.normal(size=mask.shape)
binary_img = img > 0.5
# Remove small white regions
open_img = sp.ndimage.binary_opening(binary_img)
# Remove small black hole
close_img = sp.ndimage.binary_closing(open_img)
plt.figure(figsize=(12, 3))
l = 128
plt.subplot(141)
plt.imshow(binary_img[:l, :l], cmap="gray")
plt.axis("off")
plt.subplot(142)
plt.imshow(open_img[:l, :l], cmap="gray")
plt.axis("off")
plt.subplot(143)
plt.imshow(close_img[:l, :l], cmap="gray")
plt.axis("off")
plt.subplot(144)
plt.imshow(mask[:l, :l], cmap="gray")
plt.contour(close_img[:l, :l], [0.5], linewidths=2, colors="r")
plt.axis("off")
plt.subplots_adjust(wspace=0.02, hspace=0.3, top=1, bottom=0.1, left=0, right=1)
plt.show()
脚本总运行时间:(0 分钟 0.086 秒)