Calcul PSNR

PSNR : Peak Signal to Noise Ratio

Analyse : C’est une mesure de distorsion utilisée en image numérique, tout particulièrement en compression d’image.

Elle permet de quantifier la performance des codeurs en mesurant la qualité de reconstruction de l’image compressée par rapport à l’image originale. Les formats récents (tels que webp) intègrent nativement des paramètres évalués de ce type à la compression (en boucle).

Le calcul du PSNR ne prend pas en compte la qualité visuelle de reconstruction, il est purement technique. On ne peut pas l’utiliser pour une mesure objective de la qualité visuelle d’une image (en gros, on peut très bien compresser un truc moche et le rendre tout autant moche, ou pire…).

De plus, il est reconnu que dans l’évaluation de qualité (pré-/ post-) compression, il existe d’autres algorithmes (mais hors de sujet ici).

La formule du PSNR :

d = dynamique du signal (sur 8bits = 255)
EQM = erreur Quadratique moyenne, pour deux images Io et Ir, de taille mxn

Cela se code relativement simplement en Python :

def ComputePSNR(signal, noise):
    #Peak signal-to-noise ratio, PSNR, is the ratio between 
    #the maximum possible power of a signal and the power of corrupting 
    #noise that affects the fidelity of its representation. 
    #Because many signals have a very wide dynamic range, PSNR is usually  
    #expressed in terms of the logarithmic decibel scale.
    # Applied to 3 color planes (BGR Mode), compute globally and for each 
    D = np.array(noise - signal, dtype=np.int64)
    D[:,:,:] = D[:,:,:]**2
    #we assume 16bits stored image with a mex 14 bits RAW
    R= float(16384.**2)
    #compute for each RMSE (root-mean-square error) then PSNR
    RMSE = D[:,:,:].sum()/signal.size
    psnr = 10*math.log10(R/RMSE)

    RMSE = D[:,:,2].sum()/signal.size
    psnrr = 10*math.log10(R/RMSE)

    RMSE = D[:,:,1].sum()/signal.size
    psnrg = 10*math.log10(R/RMSE)

    RMSE = D[:,:,0].sum()/signal.size
    psnrb = 10*math.log10(R/RMSE)
    return psnr,psnrr,psnrg,psnrb
https://en.wikipedia.org/wiki/Peak_signal-to-noise_ratio

Dans le cas commun d’utilisation du PSNR, le “Signal” est l’image originale et le “Noise” est l’image après phase de compression / décompression.

Cette valeur devient donc une “approximation” de la qualité de reconstruction, au plus haute elle se trouve = au meilleure est la fidélité.
On pourra donc utiliser cette fonction pour évaluer des images compressées vis-à-vis d’un usage ou l’autre (ex: impression, web, présentation).

Je renvoie le lecteur aux discussions sur les formats, tel que webp.