画像処理でよく使われる類似性評価指標

ガイド

2 つの画像が似ているかどうかを計算したい場合があります。2 つの画像の類似性を測定するために、RMSEPSNRSSIMUQIなどのアルゴリズムが多数使用されますこの記事では、これらの指標の計算と応用を主に紹介します画像の類似度を計算するアルゴリズムについては、後の記事で紹介しますSIFT深度学习RMSEPSNRSSIMUQISIFT

また、これらのアルゴリズムの結果に影響を与える要素も数多くあります (画像噪声平移缩放旋转裁剪など) 透视变换。これらはアルゴリズムの最終結果に影響を与えるため、さまざまなアプリケーション シナリオに応じてさまざまなアルゴリズムを選択する必要があります。

MSEとRMSE

MSE(平均二乗誤差): 画像ピクセル値の二乗誤差
RMSE(二乗平均平方根誤差): 画像ピクセル値の平方根誤差

  • 欠点がある
  1. 2 つの画像のサイズを比較すると、まったく同じである必要があります
  2. スケーリング、回転、トリミングに敏感
  • アドバンテージ
  1. 計算速度
  2. 単純なアルゴリズム
  • 場面に適応する
  1. ビデオの前後 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 を基準とした、元の画像と処理された画像の間の平均二乗誤差です。( 2n1 )対数値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 _ _( 2n1 )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つの画像の品質は、结构相似性歪みのある画像の品質指標と見なすことができる。ピーク信号対雑音比に対する構造の類似性、構造類似性指数は、画質測定における人間の目の画質判断とより一致しています。

xxxyyyの各ケースについて
、次の関数座標があります: 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はい+C3d+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}d信号の共分散、C 1 、C 2 、C 3 C_1、C_2、C_3C1C2C3すべて定数で、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=1C3=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+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 つの要素を組み合わせてさまざまな画像処理アプリケーションに適用でき相关性的损失ますメトリクスは数学的に定義されていますが、人間の視覚システムを利用するものではなく、さまざまな画像の歪みを通じて現れます亮度失真对比度失真UQIUQI与主观质量测量有着惊人的一致性

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バツ^y^=N1i = 1Nバツ私は=N1i = 1Ny私は=N11i = 1N( ×私はバツ^ )2=N11i = 1N( 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、 、ERGASSCCRASESAMD_lambdaD_SQNRなどの他の多くの画質評価指標アルゴリズムも提供しますVIFPSNR-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

参考

  1. https://ece.uwaterloo.ca/~z70wang/publications/uqi.html
  2. https://github.com/andrewekhalel/sewar
  3. https://ece.uwaterloo.ca/~z70wang/publications/quality_2c.pdf

おすすめ

転載: blog.csdn.net/sinat_29957455/article/details/125119550