注意
转到结尾 下载完整的示例代码。 或者通过 Binder 在您的浏览器中运行此示例
过滤区域最大值#
在这里,我们使用形态重建来创建一个背景图像,我们可以将其从原始图像中减去以隔离明亮的特征(区域最大值)。
首先,我们尝试从图像边缘开始进行膨胀重建。 我们将种子图像初始化为图像的最小强度,并将其边界设置为原始图像中的像素值。 这些最大像素将被膨胀以重建背景图像。
import numpy as np
import matplotlib.pyplot as plt
from scipy.ndimage import gaussian_filter
from skimage import data
from skimage import img_as_float
from skimage.morphology import reconstruction
# Convert to float: Important for subtraction later which won't work with uint8
image = img_as_float(data.coins())
image = gaussian_filter(image, 1)
seed = np.copy(image)
seed[1:-1, 1:-1] = image.min()
mask = image
dilated = reconstruction(seed, mask, method='dilation')
减去膨胀后的图像会留下一个图像,其中只有硬币和一个平坦的黑色背景,如下所示。
fig, (ax0, ax1, ax2) = plt.subplots(
nrows=1, ncols=3, figsize=(8, 2.5), sharex=True, sharey=True
)
ax0.imshow(image, cmap='gray')
ax0.set_title('original image')
ax0.axis('off')
ax1.imshow(dilated, vmin=image.min(), vmax=image.max(), cmap='gray')
ax1.set_title('dilated')
ax1.axis('off')
ax2.imshow(image - dilated, cmap='gray')
ax2.set_title('image - dilated')
ax2.axis('off')
fig.tight_layout()
虽然特征(即硬币)被清晰地隔离,但在原始图像中被明亮背景包围的硬币在减去后的图像中更暗。 我们可以尝试使用不同的种子图像来纠正这一点。
与其创建沿图像边界的最大值的种子图像,不如使用图像本身的特征来作为重建过程的种子。 在这里,种子图像为原始图像减去一个固定值 h
。
为了了解重建过程,我们在图像切片(由红线指示)上绘制了掩码、种子和膨胀图像的强度。
fig, (ax0, ax1, ax2) = plt.subplots(nrows=1, ncols=3, figsize=(8, 2.5))
yslice = 197
ax0.plot(mask[yslice], '0.5', label='mask')
ax0.plot(seed[yslice], 'k', label='seed')
ax0.plot(dilated[yslice], 'r', label='dilated')
ax0.set_ylim(-0.2, 2)
ax0.set_title('image slice')
ax0.set_xticks([])
ax0.legend()
ax1.imshow(dilated, vmin=image.min(), vmax=image.max(), cmap='gray')
ax1.axhline(yslice, color='r', alpha=0.4)
ax1.set_title('dilated')
ax1.axis('off')
ax2.imshow(hdome, cmap='gray')
ax2.axhline(yslice, color='r', alpha=0.4)
ax2.set_title('image - dilated')
ax2.axis('off')
fig.tight_layout()
plt.show()
正如您在图像切片中看到的,每个硬币在重建的图像中都有一个不同的基线强度; 这是因为我们使用了局部强度(移位 h
)作为种子值。 因此,减去后的图像中的硬币具有相似的像素强度。 最终结果被称为图像的 h-dome,因为它倾向于隔离高度为 h
的区域最大值。 当您的图像照明不均匀时,此操作特别有用。
脚本的总运行时间:(0 分钟 0.641 秒)