ヒストグラムマッチング#

この例では、ヒストグラムマッチングの機能を紹介します。入力画像のピクセルを操作して、そのヒストグラムが参照画像のヒストグラムと一致するようにします。画像に複数のチャネルがある場合、入力画像と参照画像のチャネル数が等しい限り、マッチングはチャネルごとに独立して行われます。

ヒストグラムマッチングは、特に画像が異なるソースから、または異なる条件(照明など)で撮影された場合に、特徴マッチングなどの画像処理のための軽量な正規化として使用できます。

import matplotlib.pyplot as plt

from skimage import data
from skimage import exposure
from skimage.exposure import match_histograms

reference = data.coffee()
image = data.chelsea()

matched = match_histograms(image, reference, channel_axis=-1)

fig, (ax1, ax2, ax3) = plt.subplots(
    nrows=1, ncols=3, figsize=(8, 3), sharex=True, sharey=True
)
for aa in (ax1, ax2, ax3):
    aa.set_axis_off()

ax1.imshow(image)
ax1.set_title('Source')
ax2.imshow(reference)
ax2.set_title('Reference')
ax3.imshow(matched)
ax3.set_title('Matched')

plt.tight_layout()
plt.show()
Source, Reference, Matched

ヒストグラムマッチングの効果を説明するために、各RGBチャネルについて、ヒストグラムと累積ヒストグラムをプロットします。明らかに、一致した画像は、各チャネルの参照画像と同じ累積ヒストグラムを持ちます。

fig, axes = plt.subplots(nrows=3, ncols=3, figsize=(8, 8))


for i, img in enumerate((image, reference, matched)):
    for c, c_color in enumerate(('red', 'green', 'blue')):
        img_hist, bins = exposure.histogram(img[..., c], source_range='dtype')
        axes[c, i].plot(bins, img_hist / img_hist.max())
        img_cdf, bins = exposure.cumulative_distribution(img[..., c])
        axes[c, i].plot(bins, img_cdf)
        axes[c, 0].set_ylabel(c_color)

axes[0, 0].set_title('Source')
axes[0, 1].set_title('Reference')
axes[0, 2].set_title('Matched')

plt.tight_layout()
plt.show()
Source, Reference, Matched

**スクリプトの合計実行時間:**(0分1.684秒)

Sphinx-Galleryによって生成されたギャラリー