[scikit-image] 30. 画像の構造類似性(skimage.measure compare_ssim)

matplotlib

はじめに

この記事では、scikit-imageライブラリのcompare_ssim関数を使用して画像の構造類似性(SSIM)を計算する方法について解説します。SSIMは画像間の類似性を評価するための指標で、ピクセル単位の比較ではなく人間の視覚システムに近い方法で類似性を測定します。

コード

解説

モジュールのインポート

バージョン

画像データの読み込みと変換

rgb2grayを使用して画像をグレースケールに変換し、img_as_floatでデータをfloat型に変換しました。読み込んだ画像をimshowで表示すると、以下のようになります。

ノイズの生成

np.ones_like(img)は、imgと同じ形状で、すべての要素が1の配列を生成します。

noise[np.random.random(size=noise.shape) > 0.5] *= -1は、まずnoiseと同じ形状のランダム配列を生成し、値が0.5より大きい位置のnoiseに-1を乗算します。これにより、正と負の値が均等に分布するノイズデータが得られます。

画像にノイズを加える

img_constはノイズの絶対値を元の画像に加えています。

平均二乗誤差を求める関数

配列xとyの平均二乗誤差は、np.linalg.norm(x-y)を使用して計算できます。

各画像間の平均二乗誤差と構造類似性

平均二乗誤差はmse関数によって計算します。

構造類似性はssim関数で求めます。data_rangeパラメータには画像の最大値と最小値の差を設定します。

ssim_noneは同一画像間(imgとimg)の構造類似性を計算するため、完全に一致して値は1になります。この値は低いほど画像間の類似性が低いことを示します。

画像と平均二乗誤差と構造類似性の表示

ImageGridにより、画像を表示しました。

[matplotlib] 19. mpl_toolkits.axes_grid1 の使い方(画像の表示)
Matplotlib の拡張モジュール mpl_toolkits.axes_grid1 を使って複数画像を効率的に表示する方法を解説。ImageGrid による整然としたレイアウト、スケールバー・カラーバーの追加など、科学計算や画像処理に役立つ可視化テクニックを紹介しています。

label = ‘MSE: {:.2f}, SSIM: {:.2f}’と設定しているため、grid[0].set_xlabel(label.format(mse_none, ssim_none))を使用すると、グラフの下部にMSEの値とSSIMの値が順番に表示されます。

興味深いことに、noise画像とconstant画像のMSE値は同じですが、SSIM値はconstant画像のほうが高くなっています。これはconstant画像がオリジナル画像により類似していることを示しています。

コードをダウンロード(.pyファイル)

コードをダウンロード(.ipynbファイル)

まとめ

本記事では、scikit-imageのcompare_ssim関数を使用して画像の構造類似性を評価する方法を解説しました。SSIMは従来のMSEやPSNRと比較して人間の視覚に近い評価が可能であり、画像処理や機械学習における品質評価に有用なツールです。実装例を通じて、SSIMの基本概念から実際の応用方法までを学ぶことができました。

参考

skimage.metrics — skimage 0.26.0rc0.dev0 documentation
Structural similarity index — skimage 0.26.0rc0.dev0 documentation

コメント