[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
画像の圧縮等を行い、その変換後の画像がどれ程劣化したかを客観的に評価する指標の一つにPSNR(Peak Signal-to-Noise Ratio)というものがある。
式にすると以下のようになる。
単位はデシベル[dB]
MAXは元画像がとりうる最大画素値のことである。
また、この式の中であらわされるMSEとは平均二乗誤差(Mean Squere Error)のことであり、以下の式になる。
m, nが画像の縦、横のサイズ。
Xが元画像、X'が劣化画像を示す。
平均二乗誤差 = ((原画の輝度 - デコード後の輝度) ^ 2) の総和 / 画素数
PSNR = 10 * log(255*255 / 平均二乗誤差)
引用:PSNRとは - Mov日記 - Fraternity7
一般に高画質とされるのは35~40dB以上とされている。
また0.2dB違えば、主観的にみても変化があるとされる。
参考:tobinaka's forum • トピック表示 - 画質指標 PSNR, SSIM と psy 的オプションと
このPSNRを求めるプログラムは次のとおり。
【引数】
srcImg: 元画像
trsImg: 劣化画像
rows: 行数
cols: 列数
返り値にPSNRをdouble型で返す。
#include<math.h> double calcPSNR(double *srcImg, double *trsImg, int rows, int cols) { int i, j, icols; double e, E, psnr, mse, max; E = max = 0.0; for(i = 0; i < rows; i++){ icols = i * cols; for(j = 0; j < cols; j++){ if(max < *(srcImg + icols + j)) max = *(srcImg + icols + j); e = *(srcImg + icols + j) - *(trsImg + icols + j); E += e * e; } } mse = E / (rows * cols); psnr = 10.0 * log10(max * max / mse); return psnr; }
一般にPSNRはモノクロ画像に対して行われる。
カラー画像に対して行う場合は、Y値で取る方法や、RGBそれぞれの画素値で求める方法などがある。
参考:画像の評価法
MAXの値については、255と固定しても良いかもしれない。
(むしろ、そちらの方が正しい?)