ガイド
2 つの画像が似ているかどうかを計算したい場合があります。2 つの画像の類似性を測定するために、RMSE
、PSNR
、SSIM
、UQI
などのアルゴリズムが多数使用されます。この記事では、これらの指標の計算と応用を主に紹介します。画像の類似度を計算するアルゴリズムについては、後の記事で紹介します。SIFT
深度学习
RMSE
PSNR
SSIM
UQI
SIFT
また、これらのアルゴリズムの結果に影響を与える要素も数多くあります (画像噪声
、平移
、缩放
、旋转
、裁剪
など) 透视变换
。これらはアルゴリズムの最終結果に影響を与えるため、さまざまなアプリケーション シナリオに応じてさまざまなアルゴリズムを選択する必要があります。
MSEとRMSE
MSE
(平均二乗誤差): 画像ピクセル値の二乗誤差
RMSE
(二乗平均平方根誤差): 画像ピクセル値の平方根誤差
- 欠点がある
- 2 つの画像のサイズを比較すると、まったく同じである必要があります
- スケーリング、回転、トリミングに敏感
- アドバンテージ
- 計算速度
- 単純なアルゴリズム
- 場面に適応する
- ビデオの前後 2 つのフレームの違いを比較してください
- 写真の類似性を計算する
- コード
def mean_squared_error(img1,img2):
#判断两张图片的shape是否一致
assert img1.shape == img2.shape,"images have different shape " \
"{} and {}".format(img1.shape,img2.shape)
#计算两张图像的MSE
img_mse = np.mean((img1.astype(np.float64) - img2.astype(np.float64))**2)
#将图像的MSE量化为相似度
img_sim = img_mse / (255**2)
return img_mse,1 - img_sim
def root_mean_squared_error(img1,img2):
#判断两张图片的shape是否一致
assert img1.shape == img2.shape,"images have different shape " \
"{} and {}".format(img1.shape,img2.shape)
#计算两张图像的MSE
img_rmse = np.sqrt(np.mean((img1.astype(np.float64) - img2.astype(np.float64))**2))
#将图像的MSE量化为相似度
img_sim = img_rmse / 255
return img_rmse,1 - img_sim
2 つの画像のMSE
合計を計算するRMSE
print(mean_squared_error(img1,img2))
#(10826.879833697936, 0.8334966576901509)
print(root_mean_squared_error(img1,img2))
#(104.05229374549096, 0.5919517892333688)
PSNR
PSNR
(ピーク信号雑音比) とも呼ばれます峰值信噪比
。処理された画像の品質を測定するために、プログラムの処理結果が満足できるかどうかを測定するために PSNR を使用することがよくあります。これは、( 2 n − 1 ) 2 (2^n-1)^2 を基準とした、元の画像と処理された画像の間の平均二乗誤差です。( 2n−1 )対数値2 (信号の最大値の 2 乗、n はサンプル値あたりのビット数) の計算式は次のとおりです。
PSNR = 10 ∗ log 10 ( 2 n − 1 ) 2 MSE PSNR = 10 * log_{10}\frac {(2^n-1)^2}{MSE}PSNR_ _ _=1 0∗ログ_ _1 0MSE _ _( 2n−1 )2
-
欠点
PSNR スコアは人間の目で見える品質と完全に一致することはできません。 -
利点
アルゴリズムがシンプルで広く使用されている -
適用シーン
画質の客観量を評価する測定手法を画像類似度の計算にも利用可能 -
コード
def peak_signal_noise_ratio(img1,img2):
#判断两张图片的size是否一致
assert img1.shape == img2.shape,"images hava different shape " \
"{} and {}".format(img1.shape,img2.shape)
#获取数据类型所表示的最大值
MAX = np.iinfo(img1.dtype).max
#计算两张图片的MSE
mse,_ = mean_squared_error(img1,img2)
#计算两张图片的PSNR
psnr = 10 * np.log10(MAX**2 / mse)
return psnr
print(peak_signal_noise_ratio(img1,img2))
#49.24985796979349
注
:PSNR
値の範囲は (0,inf) なので、PSNR的值越大表示图像越相似
. PSNR インデックスを類似度に定量化したい場合は、テスト画像に基づいて最大 PSNR 値を設定し、最大演算を実行してそれを類似度に変換できます。
SSIM
SSIM
(構造類似性指標) 構造類似性: 2 つの画像の類似性を測定するために使用される指標です。2つの画像のうちの一方が歪みのない画像であり、他方が歪みのある画像である場合、2つの画像の品質は、结构相似性
歪みのある画像の品質指標と見なすことができる。ピーク信号対雑音比に対する構造の類似性、構造類似性指数は、画質測定における人間の目の画質判断とより一致しています。。
xxとx和yyyの各ケースについて
、次の関数座標があります: SSIM ( x , y ) = ( l ( x , y ) ) α ( c ( x , y ) ) β ( s ( x , y ) ) γ l ( x , y ) = 2 μ x μ y + C 1 μ x 2 + μ y 2 + C 1 c ( x , y ) = 2 δ x δ y + C 2 δ x 2 + δ y 2 + C 2 s ( x , y ) = δ xy + C 3 δ x δ y + C 3 \begin{aligned} SSIM(x,y) &= (l(x,y))^\alpha(c(x,y)) ^\ beta(s(x,y))^\gamma \\ l(x,y) &= \frac{2\in_x\in_y + C_1}{\in_x^2+\in_y^2+C_1} \\ c( x,y) &= \frac{2\delta_x\delta_y + C_2}{\delta_x^2+\delta_y^2+C_2}\\ s(x,y) &= \frac{\delta_{xy} +C_3 }{\delta_x\delta_y+C_3} \end{整列}S SIM ( x , _ _y )l ( x ,y )c ( x ,y )s ( x ,y )=( l ( x ,よ))a (c(x,よ))b (s(x,よ))c=メートルバツ2+メートルy2+C12m _×メートルはい+C1=dバツ2+dy2+C22日×dはい+C2=d×dはい+C3dxy+C3
上式のl ( x , y ) l(x,y)l ( x ,y )は 2 つの信号c ( x , y ) c(x,y)c ( x ,y ) は2 つの信号s ( x , y ) s(x,y)のコントラストを比較します。s ( x ,y ) 2 つの信号の構造を比較します。ここで、α > 0 、 β > 0 、 γ > 0 \alpha > 0、 \beta > 0、 \gamma > 0ある>0 、b>0 、c>0は主にl ( x , y ) 、 c ( x , y ) 、 s ( x , y ) l(x,y)、 c(x,y)、 s(x,y) を調整するために使用されます。l ( x ,y ) 、c ( x 、y ) 、s ( x 、y )、μ x およびμ y \mu_x および \mu_yメートル×とμはい信号の平均値を表します、δ x とδ y \delta_x と \delta_yd×とδはい信号の標準偏差を表し、δ xy \delta_{xy}dxy信号の共分散、C 1 、C 2 、C 3 C_1、C_2、C_3C1、C2、C3すべて定数で、l ( x , y ) 、 c ( x , y ) 、 s ( x , y ) l(x,y)、 c(x,y)、 s(x,y) を維持するために使用されます。l ( x ,y ) 、c ( x 、y ) 、s ( x 、y )安定性、SSIM的值越大,表示两个信号之间的相似度越高
画像構造の類似性を計算する場合、通常、パラメーターをα = β = γ = 1 および C 3 = C 2 / 2 \alpha=\beta=\gamma=1 および C_3=C_2/2 に設定します。ある=b=c=1とC3=C2/ 2なのでSSIM SSIMS S I M SSIM ( x , y ) = ( 2 µ x µ y + C 1 ) ( 2 δ xy + C 2 ) ) ( µ x 2 + µ y 2 + C 1 ) の平滑化散乱と平滑化。 ) (
δ x 2 + δ y 2 + C 2 ) SSIM(x,y) = \frac{(2\mu_x\mu_y+C_1)(2\delta_{xy}+C_2))}{(\mu_x^2 +\ mu_y^2+C_1)(\delta_x^2+\delta_y^2+C_2)}S SIM ( x , _ _y )=( mバツ2+メートルy2+C1) ( dバツ2+dy2+C2)( 2m _×メートルはい+C1) ( 2日xy+C2) )
通常、イメージ SSIM のSSIMを計算するときS S I Mの場合、モバイルを使用してfilter
計算し
- コード
from scipy import signal
from enum import Enum
def filter2(img,fltr,mode='same'):
return signal.convolve2d(img, np.rot90(fltr,2), mode=mode)
def _get_sums(GT,P,win,mode='same'):
mu1,mu2 = (filter2(GT,win,mode),filter2(P,win,mode))
return mu1*mu1, mu2*mu2, mu1*mu2
def _get_sigmas(GT,P,win,mode='same',**kwargs):
if 'sums' in kwargs:
GT_sum_sq,P_sum_sq,GT_P_sum_mul = kwargs['sums']
else:
GT_sum_sq,P_sum_sq,GT_P_sum_mul = _get_sums(GT,P,win,mode)
return filter2(GT*GT,win,mode) - GT_sum_sq,\
filter2(P*P,win,mode) - P_sum_sq, \
filter2(GT*P,win,mode) - GT_P_sum_mul
class Filter(Enum):
UNIFORM = 0
GAUSSIAN = 1
def fspecial(fltr,ws,**kwargs):
if fltr == Filter.UNIFORM:
return np.ones((ws,ws))/ ws**2
elif fltr == Filter.GAUSSIAN:
x, y = np.mgrid[-ws//2 + 1:ws//2 + 1, -ws//2 + 1:ws//2 + 1]
g = np.exp(-((x**2 + y**2)/(2.0*kwargs['sigma']**2)))
g[ g < np.finfo(g.dtype).eps*g.max() ] = 0
assert g.shape == (ws,ws)
den = g.sum()
if den !=0:
g/=den
return g
return None
def _ssim_single(GT, P, ws, C1, C2, fltr_specs, mode):
win = fspecial(**fltr_specs)
GT_sum_sq, P_sum_sq, GT_P_sum_mul = _get_sums(GT, P, win, mode)
sigmaGT_sq, sigmaP_sq, sigmaGT_P = _get_sigmas(GT, P, win, mode, sums=(GT_sum_sq, P_sum_sq, GT_P_sum_mul))
assert C1 > 0
assert C2 > 0
ssim_map = ((2 * GT_P_sum_mul + C1) * (2 * sigmaGT_P + C2)) / (
(GT_sum_sq + P_sum_sq + C1) * (sigmaGT_sq + sigmaP_sq + C2))
cs_map = (2 * sigmaGT_P + C2) / (sigmaGT_sq + sigmaP_sq + C2)
return np.mean(ssim_map), np.mean(cs_map)
def ssim(GT,P,ws=11,K1=0.01,K2=0.03,MAX=None,fltr_specs=None,mode='valid'):
if MAX is None:
MAX = np.iinfo(GT.dtype).max
assert GT.shape == P.shape, "Supplied images have different sizes " + \
str(GT.shape) + " and " + str(P.shape)
if fltr_specs is None:
fltr_specs=dict(fltr=Filter.UNIFORM,ws=ws)
C1 = (K1*MAX)**2
C2 = (K2*MAX)**2
ssims = []
css = []
for i in range(GT.shape[2]):
ssim,cs = _ssim_single(GT[:,:,i],P[:,:,i],ws,C1,C2,fltr_specs,mode)
ssims.append(ssim)
css.append(cs)
return np.mean(ssims),np.mean(css)
img_sim,_ = ssim(img1,img2)
#0.9459787655432684
QI
UQI
(ユニバーサル品質画像インデックス) とも呼ばれます图像通用质量指标
。これは簡単に計算でき、主に 、 、 の 3 つの要素を組み合わせてさまざまな画像処理アプリケーションに適用でき相关性的损失
ます。メトリクスは数学的に定義されていますが、人間の視覚システムを利用するものではなく、さまざまな画像の歪みを通じて現れます。亮度失真
对比度失真
UQI
UQI与主观质量测量有着惊人的一致性
UQI
次の方程式を与えます。
Q = 4 δ xyx ^ y ^ ( δ x 2 + δ y 2 ) [ ( x ^ ) 2 + ( y ^ ) 2 ] x ^ = 1 N ∑ i = 1 N xiy ^ = N ∑ i = 1 N yi δ x 2 = 1 N − 1 ∑ i = 1 N ( xi − x ^ ) 2 δ y 2 = 1 N − 1 ∑ i = 1 N ( yi − y ^ ) 2 \begin{ aligned } Q &= \frac{4\delta_{xy}\hat{x}\hat{y}}{(\delta^2_x+\delta^2_y)[(\hat{x})^2+(\hat { y})^2]} \\\that{x} &= \frac{1}{N}\sum_{i=1}^{N}x_i \\that{y} &= \frac{1 }{ N}\sum_{i=1}^{N}y_i \\\delta_{x}^2 &= \frac{1}{N - 1}\sum_{i=1}^{N}(x_i -\ hat{x})^2\\\delta_{y}^2 &= \frac{1}{N-1}\sum_{i=1}^{N}(y_i-\hat{y}) ^2 \end{整列}Qバツ^y^dバツ2dy2=( dバツ2+dy2) [ (バツ^ )2+(y^)2 ]4日xyバツ^y^=N1i = 1∑Nバツ私は=N1i = 1∑Ny私は=N−11i = 1∑N( ×私は−バツ^ )2=N−11i = 1∑N( y私は−y^)2
Q
値の範囲は [-1,1] です。
- コード
import numpy as np
from scipy.ndimage import uniform_filter
def _uqi_single(GT,P,ws):
N = ws**2
window = np.ones((ws,ws))
GT_sq = GT*GT
P_sq = P*P
GT_P = GT*P
GT_sum = uniform_filter(GT, ws)
P_sum = uniform_filter(P, ws)
GT_sq_sum = uniform_filter(GT_sq, ws)
P_sq_sum = uniform_filter(P_sq, ws)
GT_P_sum = uniform_filter(GT_P, ws)
GT_P_sum_mul = GT_sum*P_sum
GT_P_sum_sq_sum_mul = GT_sum*GT_sum + P_sum*P_sum
numerator = 4*(N*GT_P_sum - GT_P_sum_mul)*GT_P_sum_mul
denominator1 = N*(GT_sq_sum + P_sq_sum) - GT_P_sum_sq_sum_mul
denominator = denominator1*GT_P_sum_sq_sum_mul
q_map = np.ones(denominator.shape)
index = np.logical_and((denominator1 == 0) , (GT_P_sum_sq_sum_mul != 0))
q_map[index] = 2*GT_P_sum_mul[index]/GT_P_sum_sq_sum_mul[index]
index = (denominator != 0)
q_map[index] = numerator[index]/denominator[index]
s = int(np.round(ws/2))
return np.mean(q_map[s:-s,s:-s])
def uqi (GT,P,ws=8):
if len(GT.shape) == 2:
GT = GT[:, :, np.newaxis]
P = P[:, :, np.newaxis]
GT = GT.astype(np.float64)
P = P.astype(np.float64)
return np.mean([_uqi_single(GT[:,:,i],P[:,:,i],ws) for i in range(GT.shape[2])])
要約する
上記の画像類似性評価指標に加えて、Sewar はMS-SSIM
、 、ERGAS
、、SCC
、RASE
、SAM
、D_lambda
、D_S
、QNR
などの他の多くの画質評価指標アルゴリズムも提供します。VIF
PSNR-B
さまざまなノイズを追加したときに、一般的に使用されるいくつかのインジケーターの類似度の計算結果の違いを比較してみましょう。画像にノイズを追加するには、私の記事「画像 (ガウス/ソルト コショウ/ポアソン/スポット) ノイズの追加」を
参照してください。
評価アルゴリズム | 元の画像 | ガウスノイズ | ガウスぼかし | ポアソンノイズ | 塩とコショウのノイズ | スペックルノイズ |
---|---|---|---|---|---|---|
MSE | 0.00 | 548.66 | 79.78 | 0.77 | 885.12 | 10826.88 |
RMSE | 0.00 | 23.42 | 8.93 | 0.88 | 29.75 | 104.05 |
PSNR | 無限 | 20.74 | 11月29日 | 49.25 | 18.66 | 7.79 |
SSIM | 1.00 | 0.25 | 0.94 | 0.99 | 0.45 | 0.06 |
QI | 1.00 | 0.98 | 0.99 | 1.00 | 0.98 | 0.80 |
MS-SSIM | 1.00+0.00u | 0.76+0.00u | 0.98+0.00u | 1.00+0.00u | 0.86+0.00u | 0.32+0.00u |
活気ある | 0.00 | 8031.33 | 2322.77 | 225.79 | 11187.33 | 26741.73 |
SCC | 0.89 | 0.08 | 0.17 | 0.48 | 0.35 | 0.02 |
ラセ | 0.00 | 1158.13 | 333.25 | 32.21 | 1600.90 | 3814.14 |
サム | 0.00 | 0.13 | 0.05 | 0.00 | 0.13 | 0.58 |
D_ラムダ | 0.00 | 0.02 | 0.00 | 0.00 | 0.03 | 0.20 |
VIFP | 1.00 | 0.23 | 0.49 | 0.93 | 0.44 | 0.06 |
PSNR-B | 無限 | 20.70 | 28.93 | 49.59 | 無限 | 8.10 |