はじめに
ここでは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により、画像を表示した。
label = ‘MSE: {:.2f}, SSIM: {:.2f}’としているので、grid[0].set_xlabel(label.format(mse_none, ssim_none))のようにすることで、最初にmseの値, 次にssimの値が表示される。
noise画像とconstant画像のmseは同じ値となっているが、simmはconstantのほうが高くなっており、より類似していることがわかる。
コードをダウンロード(.pyファイル) コードをダウンロード(.ipynbファイル)
コメント