La relación pico de señal a ruido (PSNR) es la relación entre la potencia máxima posible de una imagen y la potencia del ruido corruptor que afecta la calidad de su representación. Para estimar el PSNR de una imagen, es necesario comparar esa imagen con una imagen limpia ideal con la máxima potencia posible.
El PSNR se define de la siguiente manera:
Aquí, L es el número de niveles de intensidad máximos posibles (se supone que el nivel de intensidad mínimo es 0) en una imagen.
MSE es el error cuadrático medio y se define como:
Donde, O representa los datos de la array de la imagen original. D representa los datos de la array de la imagen degradada. m representa el número de filas de píxeles e i representa el índice de esa fila de la imagen. n representa el número de columnas de píxeles y j representa el índice de esa columna de la imagen.
RMSE es la raíz del error cuadrático medio.
Aquí tenemos una imagen original y su versión comprimida, veamos el valor PSNR para estas imágenes,
Imagen original: Imagen
comprimida:
A continuación se muestra la implementación de Python:
from math import log10, sqrt import cv2 import numpy as np def PSNR(original, compressed): mse = np.mean((original - compressed) ** 2) if(mse == 0): # MSE is zero means no noise is present in the signal . # Therefore PSNR have no importance. return 100 max_pixel = 255.0 psnr = 20 * log10(max_pixel / sqrt(mse)) return psnr def main(): original = cv2.imread("original_image.png") compressed = cv2.imread("compressed_image.png", 1) value = PSNR(original, compressed) print(f"PSNR value is {value} dB") if __name__ == "__main__": main()
Producción:
PSNR value is 43.862955653517126 dB
PSNR se usa más comúnmente para estimar la eficiencia de compresores, filtros, etc. Cuanto mayor sea el valor de PSNR, más eficiente será el método de compresión o filtro correspondiente.