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

matplotlib

はじめに

ここではskimage.measureのcompare_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 の使い方(画像の表示)
axes_grid1のImageGridを用いて複数の画像を表示する方法

label = ‘MSE: {:.2f}, SSIM: {:.2f}’としているので、grid[0].set_xlabel(label.format(mse_none, ssim_none))のようにすることで、最初にmseの値, 次にssimの値が表示される。

noise画像とconstant画像のmseは同じ値となっているが、simmはconstantのほうが高くなっており、より類似していることがわかる。

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

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

参考

skimage.metrics — skimage 0.23.2rc2.dev0 documentation
Structural similarity index — skimage 0.23.2rc2.dev0 documentation

コメント