滤除区域极大值

在这里,我们使用形态重建来创建背景图像,我们可以从原始图像中减去背景图像来分离出明亮的特征(区域极大值)。

首先,我们尝试从图像边缘开始进行膨胀重建。我们将种子图像初始化为图像的最小亮度,并将其边界设置为原始图像中的像素值。这些最大像素将被放大以重建背景图像。

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()
original image, dilated, image - dilated

虽然这些特征(即硬币)明显是孤立的,但在原始图像中,被明亮背景包围的硬币在减去的图像中会变得较暗。我们可以尝试使用不同的种子图像来纠正这一点。

我们可以使用图像本身的特征来填充重建过程,而不是沿着图像边界创建具有最大值的种子图像。这里,种子图像是原始图像减去固定值, h

h = 0.4
seed = image - h
dilated = reconstruction(seed, mask, method='dilation')
hdome = image - dilated

为了获得重建过程的感觉,我们沿着图像的一个切片(用红线表示)绘制蒙版、种子和放大图像的强度。

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()
image slice, dilated, image - dilated

正如您在图像切片中看到的那样,在重建的图像中,每个硬币都被赋予了不同的基线强度;这是因为我们使用了局部强度(偏移了 h )作为种子值。结果,相减图像中的硬币具有相似的像素强度。最终的结果被称为图像的h型穹顶,因为这往往会分离出区域最大高度 h 。当图像的照明不均匀时,此操作特别有用。

脚本的总运行时间: (0分0.312秒)

Gallery generated by Sphinx-Gallery