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

python
スポンサーリンク
スポンサーリンク

はじめに

ここではskimage.measureのcompare_ssimにより、画像の構造類似性を求める方法について説明する。

スポンサーリンク

コード

コードをダウンロード
スポンサーリンク

解説

モジュールのインポート

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

rgb2grayによりグレースケールとし、img_as_floatによりデータをfloat型に変換した。

ノイズの生成

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を用いて複数の画像を表示する方法

grid.axes_llc.set_yticks([0, 200, 400,600])によりすべての画像のytickに目盛りを設定している。

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

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

スポンサーリンク

参考

Structural similarity index — skimage v0.15.0 docs
にほんブログ村 IT技術ブログへ
にほんブログ村 IT技術ブログ Pythonへ
スポンサーリンク
python画像処理
スポンサーリンク
この記事をシェアする
sabopy.comをフォローする
スポンサーリンク
サボテンパイソン

コメント