局所的な最大値のフィルタリング#

ここでは、形態学的再構成を使用して、明るい特徴(局所的最大の値)を分離するために元の画像から差し引くことができる背景画像を作成します。

最初に、画像の端部で開始する膨張を使用した再構成を試します。画像の最小強度をシード画像に初期化し、境界を元の画像のピクセル値にします。これらの最大ピクセルは膨張されて、背景画像が再構成されます。

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.872秒)

ギャラリーはSphinxギャラリーにより生成されています。