Full text
Equation Chapter 1 Section 1 Desarrollo de una herramienta para la medida de calidad de vídeo Autor: Francisco García Izquierdo Tutor: José Ramón Cerquides Bueno Dep. Teoría de la Señal y Comunicaciones Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2017 Trabajo Fin de Grado Grado en Ingeniería de las Tecnologías de Telecomunicación
Trabajo Fin de Grado Grado en Ingeniería de las Tecnologías de Telecomunicación Desarrollo de una herramienta para la medida de calidad de vídeo Autor: Francisco García Izquierdo Tutor: José Ramón Cerquides Bueno Profesor titular Dep. de Teoría de la Señal y Comunicaciones Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2017
5 Índice Índice 5 1 Introducción 7 2 Medidas de calidad de vídeo 9 2.1 Medidas subjetivas de calidad 9 2.1.1 Métodos de estímulo único 10 2.1.2 Métodos de estímulo doble 10 2.2 Medidas objetivas de calidad 11 2.2.1 Clasificación de las medidas objetivas de calidad 12 2.3 Bases de datos de vídeo 13 2.3.1 LIVE Video Quality Assessment Database 13 3 Medidas objetivas de calidad 15 3.1 PSNR 16 3.2 SSIM 18 3.3 MS-SSIM 22 3.4 M-SVD 25 3.5 Modelo General VQM (NTIA) 29 3.6 Métrica de Okamoto et al. 35 3.7 MOSp 39 3.8 VQM 41 3.9 VQR 43 3.10 PVQM 46 4 Comparación y Resultados 53 4.1 Método de comparación 53 4.1.1 Coeficiente de correlación de Pearson (PCC) 54 4.1.2 Coeficiente de correlación de Spearman (SROCC) 54 4.1.3 Ratio de outliers (OR) 54 4.1.4 Error cuadrático medio (RMSE) 54 4.2 Resultados 55 4.3 Comentario de los resultados 58 4.3.1 Características en común de las mejores métricas 58 4.3.2 Análisis de las métricas por tipos de distorsión 59 5 Conclusiones y futuros trabajos 61 5.1 Futuros trabajos 61 Referencias 63 Índice de Tablas y Figuras 65 Glosario 67
6
7 1 INTRODUCCIÓN on la masificación de Internet y el acceso de un gran público a los sistemas de comunicaciones, han surgido en los últimos años multitud de servicios de distribución de vídeo. La transmisión de contenido en forma de vídeo ocupa una fracción cada vez mayor del tráfico global sobre redes IP: en el año 2015, ya supuso el 63% del tráfico a nivel mundial, pero su continuo crecimiento hace que se espere que el vídeo digital alcance el 79% del tráfico de Internet para el año 2020. No sólo crece la demanda de vídeo, sino que éste se solicita cada vez más en alta definición, lo que implica que aumente aún más el volumen de datos que se transmiten. En la inmensa mayoría de las aplicaciones, transmitir el vídeo en bruto resulta inviable por el elevado flujo de datos que supondría. Vamos a comprobarlo. Por ejemplo, una señal de vídeo (considerando sólo la secuencia de imágenes, sin el canal de audio) en alta definición 720p (1280x720 píxeles), a 25 fotogramas por segundo, con tres planos de color a 8 bits (por ejemplo YUV) muestreados en formato 4:2:0 (que implica que los planos de color U y V tienen la mitad de píxeles en cada fila y en cada columna que el plano de luminancia Y), requeriría 276’48 Mbps, esto es, más de 2 GB por cada minuto de vídeo. Si se desea vídeo de mayor resolución o mayor tasa de imágenes por segundo, formatos que resultan habituales, el volumen de datos crecería aún más, por no hablar de cómo se dispararía al aumentar la duración de la secuencia, ya que el ejemplo anterior contemplaba un solo minuto de duración. Esto nos lleva a la necesidad de comprimir el vídeo digital antes de su transmisión. Existen dos grandes grupos de algoritmos de compresión: con pérdidas y sin pérdidas. Los algoritmos sin pérdidas alcanzan tasas de compresión de 3 a 1 en el mejor de los casos, mientras que los algoritmos con pérdidas pueden lograr reducir los datos a menos de 100 veces su tamaño original. Sin embargo, estos últimos degradan la señal, la distorsionan, lo que se va a traducir en mayor o menor medida en una pérdida de calidad del vídeo que repercutirá directamente sobre la calidad de la experiencia del usuario, y en base a la cual valorará la calidad del servicio de distribución de vídeo. Normalmente, la tasa de compresión que ofrecen los algoritmos sin pérdidas resulta insuficiente, por lo que se necesita recurrir a los algoritmos con pérdidas y, por tanto, a distorsionar la señal para poder transmitirla. Hay que alcanzar un compromiso entre nivel de compresión y degradación de la señal, pues aumentar uno también hace crecer el otro. Surge así el problema de conocer en qué medida afecta a la calidad del vídeo la compresión del mismo. Además del proceso de compresión, el vídeo puede distorsionarse durante la propia transmisión debido a la pérdida de paquetes en la red. Compresión y transmisión constituyen las causas más habituales por las que se daña la calidad de una secuencia, y son las que vamos a considerar en este trabajo. Debido a que sabemos que el vídeo se distorsiona al comprimirlo y transmitirlo, necesitamos de herramientas que nos permitan medir el grado de distorsión sufrido, y controlar de este modo la visibilidad de los artefactos introducidos al procesarlo. Así, seremos capaces de C
8 detectar cuándo la calidad de un servicio de distribución de vídeo resulte insuficiente, antes de que el usuario lo notifique. Un método de evaluación de calidad fiable nos hará saber si la compresión aplicada al vídeo es excesiva, o si ocurre un problema durante la transmisión que haga llegar una señal muy degradada al receptor. Este trabajo se centra en el estudio de las métricas que se utilizan para evaluar la calidad de secuencias de vídeo. En el capítulo 2 veremos que los métodos para evaluar la calidad de una secuencia pueden clasificarse en subjetivos y objetivos. Los subjetivos son precisos pero costosos en tiempo y recursos, los objetivos son imprecisos pero automatizables. Nos centraremos en éstos últimos, cuyo objetivó será lograr una precisión lo más cercana posible a la de los subjetivos. En el capítulo 3 se describirán diez métricas objetivas de calidad, en términos generales, y se proponen implementaciones en lenguaje Matlab de cada algoritmo. En el cuarto capítulo, compararemos la eficacia de los métodos vistos en el capítulo 3. Por último, el quinto capítulo corresponde a las conclusiones finales.
9 2 MEDIDAS DE CALIDAD DE VÍDEO n este capítulo vamos a describir los diferentes métodos que podemos utilizar para evaluar la calidad de una secuencia de vídeo. Los clasificaremos en dos grandes grupos: medidas subjetivas y objetivas de calidad. Veremos en qué consisten cada uno de ellos, qué modalidades existen dentro de cada categoría y cuáles son sus ventajas e inconvenientes. Además, hablaremos de las bases de datos de vídeo públicas de las que disponemos para realizar pruebas con las técnicas de medición de calidad que deseemos evaluar. Aquí nos centraremos en la LIVE Video Quality Assessment Database [1] [2], de cuyas secuencias nos hemos servido para probar los algoritmos de medición de calidad estudiados en este trabajo. 2.1 Medidas subjetivas de calidad Llamamos evaluación o medida subjetiva de calidad a aquella que es realizada según el juicio personal de uno o varios observadores, que puntúan en base a su opinión la calidad de una o más secuencias de vídeo. Representa, por tanto, el criterio del sistema visual humano (HVS) y es considerada por ello el tipo de medida más fiable [3]. Con el propósito de obtener puntuaciones o medidas subjetivas de calidad para una base de datos de vídeo se realizan tests de calidad subjetivos, en los que un grupo de observadores puntúan las diferentes secuencias que se les presentan. Posteriormente, los datos obtenidos se procesan para normalizarlos y promediarlos. Las secuencias de vídeo que se elijan deben cubrir un amplio abanico de posibilidades para garantizar una base de datos fiable. Por ejemplo: se utilizarán desde secuencias estáticas o con poco movimiento hasta secuencias con gran cantidad de movimiento, secuencias con mucho contraste o texturas y secuencias muy homogéneas, con pocos cambios espaciales. Se recomienda que la duración de los vídeos sea de 10 segundos, aproximadamente. La cantidad de observadores que valorarán las secuencias recomendada por la ITU (International Telecommunication Union) es de entre 4 y 40 [4]. Por debajo de 4 no habrá garantías estadísticas de obtener resultados fiables, y con más de 40 la mejora será mínima. Las condiciones del entorno en el que se visionan las secuencias pueden influir en las valoraciones, por lo que se intentará utilizar uno lo más neutral posible, y se recogerán por escrito las condiciones del test tales como el monitor utilizado, la distancia del observador a éste o la iluminación. Una vez finalizado el test, los resultados se post-procesan. Es típico expresar los resultados finales como Mean Opinion Score (MOS) o Difference Mean Opinion Score (DMOS). En el primer caso, el post-procesado corresponde a un simple promedio. En el segundo, los resultados (que son la diferencia de dos valoraciones) se normalizan por su media y su desviación típica antes de promediarlos. Como principal ventaja de las evaluaciones subjetivas de calidad destaca su fiabilidad: las puntuaciones representan el juicio del HVS y corresponden estadísticamente a la valoración de un observador aleatorio. Por contraposición, tienen un elevado coste tanto de tiempo (se E
16 Figura 4: Clasificación de las métricas 3.1 PSNR La PSNR (Peak Signal to Noise Ratio) es probablemente la medida de calidad objetiva más simple y puede aplicarse a cualquier tipo de señal, no sólo de vídeo [11]. Se define como el cociente entre la energía máxima que puede alcanzar la señal y el ruido presente en ella. En el ámbito que nos ocupa, la calidad de vídeo, se considera como ruido el error cuadrático medio entre la señal original y la distorsionada. Suele expresarse en unidades logarítmicas. Siendo L el valor máximo que puede tomar la señal. Si el vídeo es digital y utiliza B bits, 𝐿𝐿= 2𝐵𝐵−1. MSE denota el error cuadrático medio, y se define como sigue para imágenes con tres planos de color: Aquí M y N denotan las dimensiones de cada cuadro del vídeo, O un frame de la secuencia original y D el correspondiente de la secuencia distorsionada. La expresión (1) debe aplicarse a cada cuadro del vídeo, y luego promediar los resultados para obtener un único índice de calidad para la secuencia de vídeo. El siguiente diagrama esquematiza el algoritmo PSNR. Clasificación de métricas Métricas tradicionales PSNR Orientadas a características naturales visuales Características estadísticas SSIM MS-SSIM M-SVD Características VIsuales Modelo General VQM Métrica de Okamoto MOSp Orientadas al HVS Dominio de la frecuencia VQM VQR Dominio del píxel PVQM 𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃= 10 ·log10�𝐿𝐿2 𝑀𝑀𝑃𝑃𝑀𝑀� (1) 𝑀𝑀𝑃𝑃𝑀𝑀= 1 3 𝑀𝑀 𝑃𝑃���[𝑂𝑂(𝑖𝑖,𝑗𝑗,𝑘𝑘)−𝐷𝐷(𝑖𝑖,𝑗𝑗,𝑘𝑘)]2 3 𝑘𝑘=1 𝑁𝑁−1 𝑗𝑗=0 𝑀𝑀−1 𝑖𝑖=0 (2)
17 Figura 5: Diagrama de PSNR A continuación, se incluye el código en Matlab para calcular la PSNR. function PSNRdB = metrica_PSNR( secuenciaOriginal, secuenciaDistorsionada, k) % Función que calcula la PSNR en dB entre una secuencia de video % referencia y otra distorsionada. Ambas secuencias deben estar en formato % cell, de una columna y tantas filas como cuadros tenga el video. Cada % cell contendrá otros tres, que corresponden a los tres planos de color. % % Recibe: % secuenciaOriginal: la secuencia de video sin distorsionar % secuenciaDistorsionada: la secuencia distorsionada % k: profundidad de pixel en bits % Devuelve % PSNRdB: medida de PSNR en dB if nargin < 3 k = 8; % Si no se indica, se supone que la profundidad de color es de 8 bits end % Calculo del numero de pixeles de la imagen entre los tres planos [height1 width1] = size(secuenciaOriginal{1}{1}); [height2 width2] = size(secuenciaOriginal{1}{2}); nPixels = height1*width1 + 2*height2*width2; PSNR = 0; numFrames = length(secuenciaOriginal); % Recorremos la secuencia cuadro a cuadro for frame = 1:numFrames frameOrig = secuenciaOriginal{frame}; frameDist = secuenciaDistorsionada{frame}; % Cálculo del MSE MSE = 0; for plano = 1:3 planoOrig = double(frameOrig{plano}); planoDist = double(frameDist{plano}); MSE = MSE + sum(sum((planoOrig - planoDist).^2)); end MSE = MSE / nPixels; % Si el frame actual tiene MSE = 0 la PSNR es infinita, pero tomamos % PSNR = 100dB para poder promediar con otros frames if MSE ~= 0 PSNR = PSNR + 10*log10((2^k -1)^2 / MSE);
18 else PSNR = PSNR + 100; end end % Promedio de la PSNR de todos los cuadros PSNRdB = PSNR / numFrames; end Tabla 1: código de PSNR 3.2 SSIM El SSIM (Structural Similarity Index) es un indicador de calidad de imagen muy utilizado también para evaluar la calidad de secuencias de video [12] [13]. Parte de la idea fundamental de que las señales de imagen están muy estructuradas, lo que significa que los píxeles dependen en gran medida unos de otros, sobre todo los que se encuentran próximos en la imagen. Además, persigue el hecho de que el HVS funciona extrayendo esta información estructural de su campo de visión, por lo que para medir la distorsión de una imagen deberíamos medir la distorsión sufrida en su información estructural. La medida de distorsión estructural se complementa con la distorsión que la imagen sufre en luminancia y en contraste, utilizando para ello la media de valores en el entorno vecindad de un píxel como estimador de luminancia, y la desviación típica en el mismo entorno como estimador de contraste. Para determinar cómo de diferentes son estos estimadores entre la imagen original y distorsionada nos servimos de la covarianza. Así, se definen los siguientes tres índices que comparan la luminancia, el contraste y la estructura del par de imágenes: En las expresiones (3-5) 𝜇𝜇 denota la media, 𝜎𝜎 la desviación típica y 𝜎𝜎𝑥𝑥𝑥𝑥 la covarianza. Los subíndices x e y se refieren a las imágenes original y distorsionada, respectivamente. 𝐶𝐶1, 𝐶𝐶2 y 𝐶𝐶3 son constantes que se añaden para evitar la división por cero. En concreto: 𝐶𝐶1= (𝐾𝐾1𝐿𝐿)2, 𝐶𝐶2= (𝐾𝐾2𝐿𝐿)2 y 𝐶𝐶3=𝐶𝐶2/2 , con L el rango dinámico de la imagen y K1, K2 constantes. Los tres índices se multiplican para dar lugar a la medida de SSIM para el píxel en la posición (i, j): 𝑙𝑙(𝑖𝑖,𝑗𝑗)= 2𝜇𝜇𝑥𝑥𝜇𝜇𝑥𝑥+𝐶𝐶1 𝜇𝜇𝑥𝑥2 + 𝜇𝜇𝑥𝑥2+𝐶𝐶1 (3) 𝑐𝑐(𝑖𝑖,𝑗𝑗)=2𝜎𝜎𝑥𝑥𝜎𝜎𝑥𝑥+𝐶𝐶2 𝜎𝜎𝑥𝑥2+𝜎𝜎𝑥𝑥2+𝐶𝐶2 (4) 𝑠𝑠(𝑖𝑖,𝑗𝑗)=𝜎𝜎𝑥𝑥𝑥𝑥+𝐶𝐶3 𝜎𝜎𝑥𝑥𝜎𝜎𝑥𝑥+𝐶𝐶3 (5) 𝑃𝑃𝑃𝑃𝑆𝑆𝑀𝑀(𝑖𝑖,𝑗𝑗)=(2𝜇𝜇𝑥𝑥𝜇𝜇𝑥𝑥+𝐶𝐶1)(2𝜎𝜎𝑥𝑥𝑥𝑥+𝐶𝐶2) (𝜇𝜇𝑥𝑥2 + 𝜇𝜇𝑥𝑥2+𝐶𝐶1)(𝜎𝜎𝑥𝑥2+𝜎𝜎𝑥𝑥2+𝐶𝐶2) (6)
19 La ecuación (6) se aplica a cada pixel de la imagen para cada plano de color, utilizando una ventana de 8x8 que se desplaza píxel a píxel. De este modo resultan tres mapas de índices SSIM, uno por plano de color. En [13] se recomienda utilizar una ventana de 11x11 gaussiana normalizada, para evitar posibles artefactos de bloques en el mapa SSIM. Los tres mapas se combinan linealmente en uno, habitualmente otorgando un 80% del peso a la luminancia y dejando un 10% a cada plano de croma. Para pasar de un índice de calidad por píxel a uno por cuadro, la vía más simple es promediar las medidas de píxel. Otra opción es dar más peso a aquellos píxeles en los que existe más componente de luminancia, teniendo en cuenta la mayor atención que el HVS presta a las zonas con más brillo [12]. Para finalizar debemos convertir la medición a nivel de cuadro en una única medida para la secuencia completa. Nuevamente lo más sencillo es promediar los índices obtenidos en cada cuadro. Sin embargo, ciertos tipos de distorsiones (sobre todo el emborronado) resultan menos molestas cuando existe mucho movimiento en la escena, por lo que se podría incorporar un algoritmo de estimación de movimiento con el objeto de dar más peso a aquellos cuadros en los que se detecte menor movimiento. El diagrama que sigue corresponde al algoritmo SSIM. Figura 6: Diagrama de SSIM A continuación, se incluye el código en Matlab para calcular el índice SSIM, dividido en dos funciones. function [ SSIM ] = metrica_SSIM( secuenciaOriginal, secuenciaDistorsionada, formato, k) % Función que calcula la métrica de calidad SSIM entre dos secuencias de % vídeo yuv (en formato cell), con estructura de muestreo 4:4:4, 4:2:2, o % 4:2:0. Llama a la subfunción calculaSSIMcuadro. % % Recibe: % secuenciaOriginal: secuencia original (cell) % secuenciaDistorsionada: secuencia distorsionada (cell) % formato: cadena con el formato del vídeo de entrada % (444, 422 o 420)
20 % k: profundidad de pixel en bits % % Devuelve % SSIM: métrica SSIM para la secuencia de vídeo % Calculamos el rango dinámico (se presuponen 8 bits si no se indica k) if nargin == 4 L = (2^k) - 1; else L = 255; end % Recorremos la secuencia de vídeo numFrames = length(secuenciaOriginal); SSIM_cuadro = zeros(numFrames, 1); for frame = 1:numFrames % Formato: 444, 422 o 420 if strcmp(formato, '420') % Convertimos a 444 si está en 420 frameOrig=conv420to444(secuenciaOriginal{frame},'nearest'); frameDist=conv420to444(secuenciaDistorsionada{frame},'nearest'); elseif strcmp(formato, '422') % Convertimos a 444 si está en 422 frameOrig=conv422to444(secuenciaOriginal{frame},'nearest'); frameDist=conv422to444(secuenciaDistorsionada{frame},'nearest'); elseif strcmp(formato, '444') % No cambiamos el formato si ya está en 444 frameOrig = secuenciaOriginal{frame}; frameDist = secuenciaDistorsionada{frame}; else disp 'formato incorrecto' return; end % Cálculo de SSIM para el frame actual, llamada a subfunción SSIM_cuadro(frame) = calculaSSIMcuadro(frameOrig,frameDist,L); end % Cálculo de SSIM a nivel de secuencia SSIM = mean(SSIM_cuadro); end Tabla 2: código de SSIM (función principal) function [ SSIM_cuadro ] = calculaSSIMcuadro( frameOriginal, frameDistorsionado, L) % Función que calcula la métrica de calidad SSIM entre dos cuadros de % vídeo, de tres planos de color (YUV 4:4:4). % Esta función es llamada por metrica_SSIM. % % Recibe: % frameOriginal: cell con los planos de color originales % frameDistorsionado: cell con los planos de color distorsionados % L: rango dinámico
21 % % Devuelve % SSIM_cuadro: métrica SSIM para el frame recibido % Rango dinámico (por defecto se presuponen 8 bits) if nargin < 3 L = 255; end % Ventana para calcular SSIM a nivel de bloques mask = fspecial('gaussian', 11, 1.5); % 11x11 pixels mask = mask / sum(sum(mask)); % normalizada % Aplicación de la máscara por bloques % Constantes K1 = 0.01; K2 = 0.03; C1 = (K1*L)^2; C2 = (K2*L)^2; % Dimensiones del frame I1 = double(frameOriginal{1}); [M, N] = size(I1); % Inicialización de SSIM a nivel de bloque (para los tres planos de color) SSIM_bloque = zeros(M,N,3); % Pesos de los bloques w = zeros(M,N); % Recorremos los tres planos de color for plano = 1:3 % Lectura del plano I1 = double(frameOriginal{plano}); I2 = double(frameDistorsionado{plano}); % Medias mu1 = imfilter(I1, mask, 'replicate'); mu2 = imfilter(I2, mask, 'replicate'); % Varianzas y covarianza var1 = imfilter(I1.*I1, mask, 'replicate') - mu1.*mu1; var2 = imfilter(I2.*I2, mask, 'replicate') - mu2.*mu2; covar12 = imfilter(I1.*I2, mask, 'replicate') - mu1.*mu2; % Cálculo de SSIM numerador = (2*mu1.*mu2 + C1) .* (2*covar12 + C2); denominador = (mu1.^2 + mu2.^2 + C1) .* (var1 + var2 + C2); SSIM_bloque(:,:,plano) = numerador ./ denominador; % Cálculo del valor del peso correspondiente (solo para el plano Y) if plano == 1 w(mu1 <= 40) = 0; w(mu1 > 40 & mu1 <= 50) = (mu1(mu1 > 40 & mu1 <= 50) - 40) / 10; w(mu1 > 50) = 1; end
22 end % Cálculo de SSIM para el frame completo (síntesis de los tres planos) % Y 80% de peso, U 10% de peso, V 10% de peso SSIM_YUV= 0.8*SSIM_bloque(:,:,1) + 0.1*SSIM_bloque(:,:,2) + 0.1*SSIM_bloque(:,:,3); % Conversión de las medidas a nivel de bloque a una medida a nivel de frame SSIM_cuadro = sum(sum(w.*SSIM_YUV)) / sum(sum(w)); end Tabla 3: código de SSIM (subfunción) 3.3 MS-SSIM La métrica de calidad MS-SSIM (MultiScale-SSIM) se deriva del anterior índice SSIM [14]. Su funcionamiento consiste en aplicar un proceso iterativo con M etapas o escalas. En cada escala, la imagen original y la distorsionada son procesadas con un filtro paso de baja y submuestreadas a la mitad de resolución. Por último, se calculan los tres índices (3-5) de la métrica SSIM para la escala correspondiente. Con este sistema se logra representar cómo varía el grado de perceptibilidad de los detalles de una imagen con la tasa de muestreo. Los índices de contraste y estructura (4-5) se calculan para todas las escalas, mientras que el índice de luminancia (3) se calcula solo para la última escala, la de menor resolución. Finalmente se combinan todos los índices de la siguiente forma: Los exponentes 𝛼𝛼𝑀𝑀, 𝛽𝛽𝑚𝑚 y 𝛾𝛾𝑚𝑚 se ajustan para seleccionar el peso que tiene cada índice en cada escala. Se suelen tomar como iguales los exponentes de una misma escala, y normalizados de forma que la suma de un exponente para todas las escalas resulte uno. La variación de éstos con las escalas debe representar la función de sensibilidad al contraste (CSF) del HVS, que tiene su máximo en las frecuencias medias y decrece en alta frecuencia. De esta forma se consigue que el algoritmo esté correlado con la percepción subjetiva. La métrica MS-SSIM utiliza sólo la información de luminancia de la secuencia, y no calcula los índices para los planos de croma. Para convertir la medida de nivel de píxel a nivel de cuadro, y de éste a nivel secuencia, se promedian los resultados. El siguiente diagrama ilustra el método MS-SSIM. 𝑀𝑀𝑃𝑃−𝑃𝑃𝑃𝑃𝑆𝑆𝑀𝑀(𝑖𝑖,𝑗𝑗)=𝑙𝑙𝑀𝑀(𝑖𝑖,𝑗𝑗)𝛼𝛼 𝑀𝑀 ∙�𝑐𝑐𝑚𝑚(𝑖𝑖,𝑗𝑗)𝛽𝛽 𝑚𝑚 ·𝑠𝑠𝑚𝑚(𝑖𝑖,𝑗𝑗)𝛾𝛾 𝑚𝑚 𝑀𝑀 𝑚𝑚=1 (7)
23 Figura 7: Diagrama de MS-SSIM Sigue a continuación el código en Matlab para calcular la métrica MS-SSIM, dividido en dos funciones. function [ MS_SSIM ] = metrica_MS_SSIM( secuenciaOriginal, secuenciaDistorsionada, k) % Función que calcula la métrica de calidad MS-SSIM entre dos secuencias de % vídeo yuv (en formato cell), con estructura de muestreo. Llama a la % subfunción calculaMS_SSIMcuadro. % % Recibe: % secuenciaOriginal: secuencia original (cell) % secuenciaDistorsionada: secuencia distorsionada (cell) % k: profundidad de pixel en bits % % Devuelve % MS_SSIM: métrica MS-SSIM para la secuencia de vídeo % Calculamos el rango dinámico (se presuponen 8 bits si no se indica k) if nargin == 3 L = (2^k) - 1; else L = 255; end % Recorremos la secuencia de vídeo numFrames = length(secuenciaOriginal); MS_SSIM_cuadro = zeros(numFrames, 1); for frame = 1:numFrames % Lectura del frame correspondiente frameOrig = secuenciaOriginal{frame}; frameDist = secuenciaDistorsionada{frame}; % Cálculo de MS-SSIM para el frame actual % La función recibe los tres planos de color de los frames, pero % internamente utilizará solo el de luminancia para el cálculo de la % métrica MS-SSIM a nivel de cuadro MS_SSIM_cuadro(frame) = calculaMS_SSIMcuadro(frameOrig,frameDist,L); end % Cálculo de MS-SSIM a nivel de secuencia % Promediamos todos los cuadros MS_SSIM = mean(MS_SSIM_cuadro); end Tabla 4: código de MS-SSIM (función principal)
24 function [ MS_SSIM_cuadro ] = calculaMS_SSIMcuadro( frameOriginal, frameDistorsionado, L) % Función que calcula la métrica de calidad MS-SSIM entre dos cuadros de % vídeo de formato yuv, teniendo en cuenta solo el plano Y. % Esta función es llamada por metrica_MS_SSIM. % % Recibe: % frameOriginal: cell con los planos de color originales % frameDistorsionado: cell con los planos de color distorsionados % L: rango dinámico % % Devuelve % MS_SSIM_cuadro: métrica MS-SSIM para el frame recibido % Rango dinámico (por defecto se presuponen 8 bits) if nargin < 3 L = 255; end % Ventana para calcular MS-SSIM a nivel de bloques mask = fspecial('gaussian', 8, 1.5); % 8x8 pixels mask = mask / sum(sum(mask)); % normalizada % Aplicación de la máscara por bloques % Constantes K1 = 0.01; K2 = 0.03; C1 = (K1*L)^2; C2 = (K2*L)^2; C3 = C2 / 2; % Peso de las componentes de MS-SSIM y escala máxima M = 5; alpha = 0.1333; beta = [0.0448, 0.2856, 0.3001, 0.2363, 0.1333]; gamma = [0.0448, 0.2856, 0.3001, 0.2363, 0.1333]; % Máscara de filtro paso de baja para las escalas maskSuav = (1/9) * ones(3,3); % Inicialización de las componentes de SSIM para las 5 escalas SSIM_bloque_l = cell(1,1); SSIM_bloque_c = cell(1,M); SSIM_bloque_s = cell(1,M); % Lectura del plano Y Y1 = double(frameOriginal{1}); Y2 = double(frameDistorsionado{1}); % Bucle para las M escalas for m = 1:M % Medias para la escala m mu1_Y = imfilter(Y1, mask, 'replicate'); mu2_Y = imfilter(Y2, mask, 'replicate');
25 % Varianzas y covarianza para la escala m var1_Y = imfilter(Y1.*Y1, mask, 'replicate') - mu1_Y.*mu1_Y; var2_Y = imfilter(Y2.*Y2, mask, 'replicate') - mu2_Y.*mu2_Y; covar12_Y = imfilter(Y1.*Y2, mask, 'replicate') - mu1_Y.*mu2_Y; % Cálculo de las componentes de SSIM, l solo para la última escala if m == M SSIM_bloque_l{1,1} = (2*mu1_Y.*mu2_Y + C1) ./ (mu1_Y.^2 + mu2_Y.^2 + C1); end SSIM_bloque_c{1,m} = (2*(var1_Y.^(0.5)).*(var2_Y.^(0.5)) + C2) ./ (var1_Y + var2_Y + C2); SSIM_bloque_s{1,m} = (covar12_Y + C3) ./ ((var1_Y.^(0.5)).*(var2_Y.^(0.5)) + C3); if m ~= M % Filtro paso de baja y submuestreo Y1 = imfilter(Y1, maskSuav, 'replicate'); Y2 = imfilter(Y2, maskSuav, 'replicate'); Y1 = Y1(1:2:end,1:2:end); Y2 = Y2(1:2:end,1:2:end); end end % Cálculo de MS-SSIM para el frame multiplicando todas las componentes calculadas % Calculamos los valores medios de las componentes en cada escala y los % elevamos al coeficiente que marca su peso luma = mean2(SSIM_bloque_l{1,1})^alpha; contraste = zeros(1,M); estructura = zeros(1,M); for m = 1:M contraste(1,m) = mean2(SSIM_bloque_c{1,m})^beta(m); estructura(1,m) = mean2(SSIM_bloque_s{1,m})^gamma(m); end % Multiplicamos todas las componentes calculadas MS_SSIM_cuadro = abs(prod([luma,contraste,estructura])); end Tabla 5: código de MS-SSIM (subfunción) 3.4 M-SVD La M-SVD (Multidimensional – Singular Value Decomposition) es una métrica de calidad desarrollada originalmente para imágenes en escala de grises [15], pero que ha sido adaptada para evaluar secuencias de vídeo con tres planos de color [16]. Su idea fundamental reside en interpretar las imágenes monocromáticas como matrices, descomponerlas en valores singulares y medir el error sobre éstos. La descomposición en valores singulares es un proceso algebraico de factorización que puede aplicarse a cualquier matriz 𝐴𝐴 [17], por el que ésta se transforma en el producto de tres matrices 𝐴𝐴=𝑈𝑈𝑃𝑃𝑉𝑉𝑇𝑇. Aquí, 𝑃𝑃 es una matriz diagonal cuyos elementos reciben el nombre de valores singulares de 𝐴𝐴.
32 % Parámetro hv_loss f1 = max([mean(bloque_HV1); 3*ones(1, numBloques_S)]) ./ max([mean(bloque_HV_1); 3*ones(1, numBloques_S)]); % Umbral a 3 f2 = max([mean(bloque_HV2); 3*ones(1, numBloques_S)]) ./ max([mean(bloque_HV_2); 3*ones(1, numBloques_S)]); % Comparación de ratio, valores positivos se hacen 0 (función de pérdidas) hv_loss_S = min([(f2-f1)./f1; zeros(1, numBloques_S)]); % Parámetro hv_gain (f1 y f2 son los mismos de hv_loss, los reaprovechamos) % Comparación logarítmica, valores negativos se hacen 0 (función de ganancias) hv_gain_S = max([log10(f2./f1); zeros(1,numBloques_S)]); % Parámetro si_gain f1 = max([std(bloque_R1); 8*ones(1, numBloques_S)]); % Umbral a 8 f2 = max([std(bloque_R2); 8*ones(1, numBloques_S)]); % Comparación logarítmica, valores negativos se hacen 0 (función de ganancias) si_gain_S = max([log10(f2./f1); zeros(1, numBloques_S)]); % Parámetro ct_ati_gain f1 = max([std(bloque_ATI1); 3*ones(1, numBloques_S)]) .* max([std(bloque_Y1); 3*ones(1, numBloques_S)]); % Umbral a 3 f2 = max([std(bloque_ATI2); 3*ones(1, numBloques_S)]) .* max([std(bloque_Y2); 3*ones(1, numBloques_S)]); % Comparación de ratio, valores negativos se hacen 0 (función de ganancias) ct_ati_gain_S = max([(f2-f1)./f1; zeros(1, numBloques_S)]); % Colapso espacial para parámetros de luminancia % si_loss si_loss_S_ord = sort(si_loss_S); si_loss_T((frame+numFrames_T-1)/numFrames_T) = mean(si_loss_S_ord(1:round(0.05*M*N/64))); % hv_loss hv_loss_S_ord = sort(hv_loss_S); hv_loss_T((frame+numFrames_T-1)/numFrames_T) = mean(hv_loss_S_ord(1:round(0.05*M*N/64))); % hv_gain hv_gain_S_ord = sort(hv_gain_S); hv_gain_T((frame+numFrames_T-1)/numFrames_T) = mean(hv_gain_S_ord(round(0.95*M*N/64):end)); % si_gain si_gain_T((frame+numFrames_T-1)/numFrames_T) = mean(si_gain_S); % ct_ati_gain ct_ati_gain_T((frame+numFrames_T-1)/numFrames_T) = mean(ct_ati_gain_S); end % Colapso temporal para parámetros de luminancia % si_loss si_loss_T = sort(si_loss_T); si_loss = si_loss_T(round(0.1*numBloques_T)); % hv_loss hv_loss = max(mean(hv_loss_T)^2,0.06)-0.06; % Clip a 0.06
33 % hv_gain hv_gain = mean(hv_gain_T); % si_gain si_gain = max(mean(si_gain_T),0.004)-0.004; % Clip a 0.004 % Limitamos a 0.14, para prevenir excesiva mejora de calidad por realce de bordes si_gain = min(0.14,si_gain); % ct_ati_gain ct_ati_gain_T = sort(ct_ati_gain_T); ct_ati_gain = ct_ati_gain_T(round(0.1*numBloques_T)); % Recorremos U y V por bloques S-T de 8 pixels x 8 pixels x 1 frame % Número de bloques por frame (se rellena con ceros si es necesario) numBloques_S_croma = ceil(N_croma/8)*ceil(M_croma/8); % Inicialización de parámetros a calcular a nivel temporal chroma_spread_T = zeros(1,numFrames); chroma_extreme_T = zeros(1,numFrames); for frame = 1:numFrames % Reordenamos los bloques por columnas bloque_U1 = im2col(double(secuenciaOriginal{frame}{2}), [8 8], 'distinct'); bloque_U2 = im2col(double(secuenciaDistorsionada{frame}{2}), [8 8], 'distinct'); bloque_V1 = im2col(double(secuenciaOriginal{frame}{3}), [8 8], 'distinct'); bloque_V2 = im2col(double(secuenciaDistorsionada{frame}{3}), [8 8], 'distinct'); % Parámetro chroma_spread f1_U = mean(bloque_U1); f1_V = mean(bloque_U2); f2_U = mean(bloque_V1); f2_V = mean(bloque_V2); chroma_spread_S = sqrt((f1_U + f2_U).^2+(f1_V + f2_V).^2); % Colapso espacial para parámetros de croma % chroma_spread chroma_spread_T(frame) = std(chroma_spread_S); % chroma_extreme chroma_extreme_S_ord = sort(chroma_spread_S); chroma_extreme_T(frame) = mean(chroma_extreme_S_ord(round(0.99*numBloques_S_croma):end)) - chroma_extreme_S_ord(round(0.99*numBloques_S_croma)); end % Colapso temporal para parámetros de croma % chroma_spread chroma_spread_T = sort(chroma_spread_T); chroma_spread = max(chroma_spread_T(round(0.1*numFrames)),0.6)-0.6; % Clip a 0.6 % chroma_extreme chroma_extreme = std(chroma_extreme_T); % Combinación lineal de los parámetros calculados
34 VQM = -0.2097*si_loss +0.5969*hv_loss +0.2483*hv_gain + 0.0192*chroma_spread - 2.3416*si_gain +0.0431*ct_ati_gain +0.0076*chroma_extreme; % Prevenir valores negativos, no puede haber ganancia global de calidad en la secuencia VQM = max(VQM,0); % Prevenir valores excesivamente altos para vídeos muy distorsionados if VQM > 1 c = 0.5; VQM = (1 + c) * VQM / (c + VQM); end end function [ R1, R2, HV1, HV2, HV_1, HV_2 ] = filtradoSI13( planoOrig, planoDist ) % Función que filtra dos planos de vídeo (original y distorsionado) con el % filtro SI13 y devuelve su salida. Es llamada por metrica_VQM_general. % % Recibe: % planoOrig: plano original (tipo double) % planoDist: plano distorsionado (tipo double) % % Devuelve % R1: módulo de la salida del filtro para el plano original % R2: módulo de la salida del filtro para el plano distorsionado % HV1: módulo de la salida del filtro para bordes verticales y % horizontales del plano original % HV2: módulo de la salida del filtro para bordes verticales y % horizontales del plano distorsionado % HV_1: módulo de la salida del filtro para bordes diagonales % del plano original % HV_2: módulo de la salida del filtro para bordes diagonales % del plano distorsionado % Filtro SI13 v=[-0.0052625, -0.0173446, -0.0427401, -0.0768961, -0.0957739, -0.0696751, 0, 0.0696751, 0.0957739, 0.0768961, 0.0427401, 0.0173446, 0.0052625]; % Umbrales para considerar borde vertical u horizontal / diagonal r_min = 20; umbral_theta = tan(0.225); % Dimensiones [M, N] = size(planoOrig); % Filtrado con SI13 H1 = conv2(planoOrig,v,'same'); H1 = conv2(H1,ones(13,1),'same'); H2 = conv2(planoDist,v,'same'); H2 = conv2(H2,ones(13,1),'same'); V1 = conv2(planoOrig,v','same'); V1 = conv2(V1,ones(1,13),'same'); V2 = conv2(planoDist,v','same'); V2 = conv2(V2,ones(1,13),'same'); % Convertimos H y V a módulo
35 R1 = sqrt(H1.^2 + V1.^2); R2 = sqrt(H2.^2 + V2.^2); % Construimos HV y HV_ % Calculamos la tangente de cada punto H1=abs(H1);V1=abs(V1);H2=abs(H2);V2=abs(V2); ratio1 = min(H1,V1) ./ max(H1,V1); ratio2 = min(H2,V2) ./ max(H2,V2); % Índices donde el ángulo indica borde vertical u horizontal ind_angulo1 = find(ratio1 < umbral_theta); ind_angulo2 = find(ratio2 < umbral_theta); % HV1 y HV_1 HV_1 = R1; HV_1(R1 <= r_min) = 0; HV1 = zeros(M,N); HV1(ind_angulo1) = HV_1(ind_angulo1); HV_1(ind_angulo1) = 0; % HV2 y HV_2 HV_2 = R2; HV_2(R2 <= r_min) = 0; HV2 = zeros(M,N); HV2(ind_angulo2) = HV_2(ind_angulo2); HV_2(ind_angulo2) = 0; end Tabla 8: código de VQM – Modelo general 3.6 Métrica de Okamoto et al. El algoritmo propuesto por Okamoto et al. [20] parte de un estudio que hacen sus autores sobre la precisión de la métrica Average Edge Energy Difference (Ave_EE) de ANSI [21]. La métrica Ave_EE trata de determinar el error que hay en los bordes de un par de vídeos, normalizando por los bordes de la secuencia original para tener en cuenta el efecto de enmascaramiento (los errores se perciben menos donde existen más contornos). En la ecuación (14), SI indica una imagen de bordes, el sufijo 𝑖𝑖𝑛𝑛 se refiere al vídeo original, 𝑜𝑜𝑢𝑢𝑜𝑜 al vídeo procesado, y 𝑇𝑇 es el número de cuadros en cada secuencia. Estudiando Ave_EE Okamoto et al. concluyen que esta métrica, aunque resulta útil para captar las distorsiones que se producen sobre los contornos en las imágenes, tiene tres principales deficiencias: es insensible a la distorsión de bloques, no tiene en cuenta la información temporal para el cálculo de calidad, y cada cuadro se procesa uniformemente, sin considerar la posible presencia local de las degradaciones. Por ello deciden incluir Ave_EE como un 𝐴𝐴𝐴𝐴𝐴𝐴_𝑀𝑀𝑀𝑀= �1 𝑇𝑇��𝑃𝑃𝑆𝑆 𝑖𝑖𝑛𝑛 (𝑜𝑜)−𝑃𝑃𝑆𝑆 𝑜𝑜𝑜𝑜𝑜𝑜 (𝑜𝑜) 𝑃𝑃𝑆𝑆𝑖𝑖𝑛𝑛(𝑜𝑜)�2 𝑇𝑇−1 𝑜𝑜=0 (14)
36 parámetro de su algoritmo, complementándolo con dos adicionales que están basados también en otros de ANSI, pero a los que incluyen modificaciones. Son Minimun HV-(Horizontal or Vertical) to non-HV-edge energy difference (Min_HV) y Average moving energy of blocks (Ave_MEB). El primero, Min_HV, calcula la razón entre la energía en bordes que son verticales u horizontales y la energía en bordes que son diagonales, para cada cuadro de la secuencia original de vídeo y de la distorsionada. Luego sustrae cada cociente calculado en el vídeo distorsionado a su correspondiente del original, normaliza y elige el menor de los valores resultantes. El motivo de utilizar el operador mínimo es que la distorsión de bloques supone un incremento de bordes verticales y horizontales en la secuencia distorsionada, lo que hace crecer la componente negativa de (15). El otro parámetro, Ave_MEB, captura las distorsiones en la información temporal del vídeo, actuando por bloques de 8x8 píxeles. Donde 𝑃𝑃𝐶𝐶 es el número de bloques por cuadro, y 𝑇𝑇𝑆𝑆 es la diferencia cuadrática media entre los píxeles de un bloque y los píxeles del mismo bloque en el cuadro anterior. La normalización en (15) y (16) sirve para considerar el efecto de enmascaramiento, de forma que se reducen las distorsiones medidas si la información en el vídeo original es alta. El último paso es combinar linealmente los tres parámetros calculados, obteniendo una única medida de calidad para el par de secuencias. El siguiente diagrama esquematiza la métrica de Okamoto et al. Figura 10: Diagrama de la métrica de Okamoto 𝑀𝑀𝑖𝑖𝑛𝑛_𝐻𝐻𝑉𝑉= min 𝑜𝑜�𝐻𝐻𝑉𝑉𝑃𝑃𝑖𝑖𝑛𝑛(𝑜𝑜)−𝐻𝐻𝑉𝑉𝑃𝑃𝑜𝑜𝑜𝑜𝑜𝑜(𝑜𝑜) 𝐻𝐻𝑉𝑉𝑃𝑃𝑖𝑖𝑛𝑛(𝑜𝑜)� (15) 𝐴𝐴𝐴𝐴𝐴𝐴_𝑀𝑀𝑀𝑀𝑀𝑀= 1 𝑇𝑇�1 𝑃𝑃𝐶𝐶���𝑇𝑇𝑆𝑆 𝐶𝐶𝑖𝑖𝑖𝑖 (𝑘𝑘,𝑙𝑙,𝑜𝑜)−𝑇𝑇𝑆𝑆 𝐶𝐶_𝑜𝑜𝑜𝑜𝑜𝑜 (𝑘𝑘,𝑙𝑙,𝑜𝑜) 𝑇𝑇𝑆𝑆𝐶𝐶_𝑖𝑖𝑛𝑛(𝑘𝑘,𝑙𝑙,𝑜𝑜)�2 𝑘𝑘,𝑙𝑙 𝑇𝑇−1 𝑜𝑜=0 (16)
37 A continuación, se incluye el código Matlab que implementa la métrica de Okamoto et al. function Q = metrica_Okamoto( secuenciaOriginal, secuenciaDistorsionada ) % Función que calcula la métrica de calidad propuesta por Okamoto, % Hayashi, Takahashi y Kurita, basada en el parámetro Average Edge Energy % Difference (Ave_EE) estandarizado por ANSI. % % Recibe: % secuenciaOriginal: secuencia original % secuenciaDistorsionada: secuencia distorsionada % % Devuelve % Q: medida objetiva de calidad % Número de frames y resolución numFrames = length(secuenciaOriginal); [M, N] = size(secuenciaOriginal{1}{1}); % Filtros de Sobel maskSobel_h = (1/4) * [-1, 0, 1; -2, 0, 2; -1, 0, 1]; maskSobel_v = (1/4) * [-1, -2, -1; 0, 0, 0; 1, 2, 1]; % Umbrales para detectar bordes horizontales y verticales r_min = 20; umbral_theta = tan(0.05236); % Inicializamos los parámetros para cada frame min_HV_cuadro = zeros(1, numFrames); ave_EE_cuadro = zeros(1, numFrames); ave_MEB_cuadro = zeros(1, numFrames-1); % Recorremos las secuencias for frame = 1:numFrames % Pasamos a formato double los frames actuales frameOrig = double(secuenciaOriginal{frame}{1}); frameDist = double(secuenciaDistorsionada{frame}{1}); %1-. Operaciones relativas al prámetro min_HV % Obtenemos SIh y SIv SIh_Orig = imfilter(frameOrig, maskSobel_h, 'conv', 'replicate'); % Para la imagen original SIv_Orig = imfilter(frameOrig, maskSobel_v, 'conv', 'replicate'); SIh_Dist = imfilter(frameDist, maskSobel_h, 'conv', 'replicate'); % Para la imagen distorsionada SIv_Dist = imfilter(frameDist, maskSobel_v, 'conv', 'replicate'); % Obtenemos el módulo SIr_Orig = sqrt(SIh_Orig.^2 + SIv_Orig.^2); SIr_Dist = sqrt(SIh_Dist.^2 + SIv_Dist.^2); % Calculamos la tangente de cada punto SIh_Orig=abs(SIh_Orig);SIv_Orig=abs(SIv_Orig);SIh_Dist=abs(SIh_Dist);SIv_Dist=abs(S Iv_Dist); ratio1 = min(SIh_Orig,SIv_Orig) ./ max(SIh_Orig,SIv_Orig); ratio2 = min(SIh_Dist,SIv_Dist) ./ max(SIh_Dist,SIv_Dist);
38 % Índices donde el ángulo indica borde vertical u horizontal ind_angulo1 = ratio1 < umbral_theta; ind_angulo2 = ratio2 < umbral_theta; % Índices donde el módulo supera el umbral ind_modulo1 = SIr_Orig > r_min; ind_modulo2 = SIr_Dist > r_min; % Módulo de aquellos píxeles considerados como bordes verticales u % horizontales (calculamos su media) HV1 = mean(SIr_Orig(ind_angulo1 & ind_modulo1)); HV2 = mean(SIr_Dist(ind_angulo2 & ind_modulo2)); % Módulo de aquellos píxeles considerados como bordes oblicuos % (calculamos su media) HV_1 = mean(SIr_Orig(~ind_angulo1 & ind_modulo1)); HV_2 = mean(SIr_Dist(~ind_angulo2 & ind_modulo2)); % Ratio entre bordes verticales u horizontales y bordes oblicuos HVR_Orig = (HV1 + 0.5) / (HV_1 + 0.5); HVR_Dist = (HV2 + 0.5) / (HV_2 + 0.5); % Comparación entre ambos ratios para frame original y distorsionado min_HV_cuadro(frame) = (HVR_Orig - HVR_Dist) / HVR_Orig; %2-. Operaciones relativas al prámetro ave_EE SI_Orig = sqrt(mean2(SIr_Orig.^2) - (mean2(SIr_Orig))^2); SI_Dist = sqrt(mean2(SIr_Dist.^2) - (mean2(SIr_Dist))^2); ave_EE_cuadro(frame) = (SI_Orig - SI_Dist) / SI_Orig; %3-. Operaciones relativas al prámetro ave_MEB if frame ~= 1 % Para el primer cuadro no calculamos el parámetro Tb_Orig = mean(im2col(frameOrig, [8 8], 'distinct') - im2col(double(secuenciaOriginal{frame-1}{1}), [8 8], 'distinct')).^2; Tb_Dist = mean(im2col(frameDist, [8 8], 'distinct') - im2col(double(secuenciaDistorsionada{frame-1}{1}), [8 8], 'distinct')).^2; ind_cero = (Tb_Orig ~= 0); % Para evitar dividir por cero ave_MEB_cuadro(frame-1) = sqrt(sum(((Tb_Orig(ind_cero) - Tb_Dist(ind_cero)) ./ Tb_Orig(ind_cero)).^2)) / (M*N/64); end end % Síntesis de los valores obtenidos para cada cuadro de los tres parámetros % Para el parámetro min_HV, seleccioonamos el mínimo valor obtenido para la % secuencia completa min_HV = min(min_HV_cuadro); ave_EE = sqrt( mean((ave_EE_cuadro).^2) ); ave_MEB = mean(ave_MEB_cuadro); % Suma ponderada de parámetros Q = 0.645*ave_EE - 0.115*min_HV + 0.24*ave_MEB; end Tabla 9: código de la métrica de Okamoto et al.
39 3.7 MOSp El algoritmo MOSp (Mean Opinion Score prediction) nace de buscar una adaptación a una métrica de calidad tan simple como es el error cuadrático medio (MSE), para que consiga resultados más correlados con las evaluaciones subjetivas [22]. Para ello sus autores realizaron un test de evaluación subjetiva con siete secuencias de prueba, sometidas cada una a diferentes niveles de distorsión, que fueron valoradas en una escala de 0 a 1 por los observadores que participaron. De representar los resultados del test frente al error cuadrático medio de cada secuencia, se observó que las puntuaciones MOS decrecían de forma aproximadamente lineal conforme aumentaba el MSE. Por ello se propone la siguiente ecuación como método de evaluación objetivo: Aquí, 𝑘𝑘 es la pendiente de la recta que marca el decrecimiento de calidad, y que debe poder calcularse a partir del contenido del vídeo. En su computación, los autores incluyen el fenómeno perceptual del enmascaramiento espacial, por el cual los errores resultan menos perceptibles para el HVS cuando se producen en zonas con mucha información espacial (zonas con mucho detalle o contornos de objetos en la escena). La cantidad de información espacial existente se determina a través de la energía de bordes que tienen los distintos cuadros del vídeo. Para ello se recurre a los simples filtros de Sobel, de los que se obtienen las imágenes de bordes vertical y horizontal, que combinadas resultan en la imagen magnitud o energía de bordes. Representando la pendiente que se obtuvo empíricamente para las secuencias del test frente a la energía de bordes medida en los mismos vídeos, y después de un proceso de interpolación, se obtiene una función exponencial que relaciona la energía de bordes de una secuencia cualquiera con la pendiente 𝑘𝑘 a usar en la expresión (17): De esta relación se tiene que las secuencias con alta energía en bordes tendrán una 𝑘𝑘 pequeña, lo que implica que hará falta un MSE mayor para mermar su calidad, reflejando el efecto del enmascaramiento espacial. Debido a que en una secuencia de vídeo la calidad puede variar de unas zonas a otras de la imagen y a lo largo del tiempo, las ecuaciones (17) y (18) se aplican por bloques de 16x16 píxeles. Luego se promedian los valores MOSp medidos en cada bloque para obtener una valoración global a la secuencia completa. La siguiente figura corresponde al diagrama de bloques del método MOSp. 𝑀𝑀𝑂𝑂𝑃𝑃𝑝𝑝= 1 −𝑘𝑘(𝑀𝑀𝑃𝑃𝑀𝑀) (17) 𝑘𝑘=𝑢𝑢1·𝐴𝐴−𝑎𝑎2·𝐸𝐸𝑚𝑚𝐸𝐸𝐸𝐸_𝑆𝑆𝑜𝑜𝐶𝐶𝐸𝐸𝑛𝑛𝐸𝐸ℎ (18)
40 Figura 11: Diagrama de MOSp A continuación, se incluye el código Matlab para calcular la métrica de calidad MOSp. function MOSp = metrica_MOSp( secuenciaOriginal, secuenciaDistorsionada ) % Función que calcula la métrica de calidad MOSp para las dos secuencias % de vídeo que recibe. % % Recibe: % secuenciaOriginal: secuencia original (cell) % secuenciaDistorsionada: secuencia distorsionada (cell) % % Devuelve % MOSp: métrica MOSp para el par de secuencias % Filtros de Sobel maskSobelX = (1/4) * [-1, 0, 1; -2, 0, 2; -1, 0, 1]; maskSobelY = (1/4) * [-1, -2, -1; 0, 0, 0; 1, 2, 1]; % Bucle para recorrer las secuencias de vídeo numFrames = length(secuenciaOriginal); MOSp_cuadro = zeros(1, numFrames); % Métrica a nivel de cuadro for frame = 1:numFrames % Sólo consideramos la información de luminancia Y_Orig = double(secuenciaOriginal{frame}{1}); Y_Dist = double(secuenciaDistorsionada{frame}{1}); % Obtenemos la imagen de bordes Gx = imfilter(Y_Orig, maskSobelX, 'conv', 'replicate'); Gy = imfilter(Y_Orig, maskSobelY, 'conv', 'replicate'); G = abs(Gx) + abs(Gy); % Medimos Edge-Strength como el promedio de G en cada bloque de 16x16 Edge_Strength = mean(im2col(G, [16 16], 'distinct')); % Obtenemos la pendiente k para cada bloque k = 0.03585 * exp(-0.02439 * Edge_Strength); % Calculamos la métrica MOSp para cada bloque y las promediamos MSE_bloques = mean(im2col((Y_Orig - Y_Dist).^2, [16 16], 'distinct')); MOSp_cuadro(frame) = mean(1 - k.*MSE_bloques); end % Promediamos las mediciones de cada cuadro MOSp = mean(MOSp_cuadro); end Tabla 10: código de MOSp
41 3.8 VQM El algoritmo VQM (Video Quality Metric, no confundir con Video Quality Metric de NTIA, visto en la sección 3.5) mide las distorsiones del par de secuencias de vídeo en un dominio transformado, el de la DCT (Transformada del Coseno Discreta) [23]. Descompone cada cuadro de los vídeos en bloques de 8x8 píxeles, y los transforma utilizando la DCT bidimensional. Una vez en el dominio transformado, normaliza cada coeficiente del bloque por su componente de continua e incluye el efecto de la CSF. Esta función representa la sensibilidad del ojo a las frecuencias espaciales, decreciente conforme aumenta la frecuencia (figura 12). Como modelo de la CSF, el algortimo utiliza la inversa de la matriz de cuantificación de MPEG (figura 13). Esta matriz tiene sus mayores coeficientes en las posiciones que corresponden a frecuencias mayores de la DCT, y selecciona menores coeficientes para las bajas frecuencias. De modo que la inversa de la matriz representará la CSF, ponderando con menor peso conforme aumenta la frecuencia. Figura 12: Contrast Sensivity Function (CSF) Figura 13: Matriz de cuantificación de MPEG Después de ponderar los coeficientes de la transformada DCT de cada bloque atendiendo al modelo de CSF escogido, se calcula la diferencia entre los bloques de la secuencia de vídeo
48 La misma función de pesos senoidal utilizada anteriormente se recupera para promediar el error de croma 𝑛𝑛(𝑖𝑖,𝑗𝑗,𝑜𝑜) de cada campo. Del error resultante para los dos campos, se escoje el menor de ambos como representante de la distorsión cromática del cuadro. Finalmente se promedia a lo largo del tiempo para obtener el parámetro de croma para la secuencia completa. Por último, los tres parámetros (error de bordes, decorrelación y error de croma) se combinan linealmente. Cabe mencionar que el coeficiente del parámetro decorrelación tiene signo opuesto a los otros, pues se ha dicho que una alta independencia entre cuadros implica una menor percepción de la distorsión en la imagen. La siguiente figura representa el diagrama de flujo del método PVQM. Figura 17: Diagrama de PVQM Se incluye a continuación el código Matlab del algoritmo PVQM. function DMOSp = metrica_PVQM( secuenciaOriginal, secuenciaDistorsionada, formato ) % Función que calcula la métrica de calidad PVQM para las dos secuencias % de vídeo que recibe. % % Recibe: % secuenciaOriginal: secuencia original (formato cell) % secuenciaDistorsionada: secuencia distorsionada (formato cell) % formato: cadena con el formato de muestreo de las % secuencias de vídeo (4:4:4, 4:2:2 o 4:2:0) % % Devuelve % DMOSp: la métrica de calidad PVQM predice una % puntuación subjetiva DMOS % 1. Cálculos iniciales % Resolución y número de frames numFrames = length(secuenciaOriginal); [M,N] = size(secuenciaOriginal{1}{1}); % Función de pesos para promediar los valores de cada píxel w = abs(sin(2*pi * (1:M)/M))' * sin(pi * (1:N)/N); % Suma de los pesos para promediar luego (evaluando solo los píxeles que se % utilizan para calcular el gradiente)
49 i_grad_top = 2:M/2-1; i_grad_bot = M/2+2:M-1; j_grad = 3:N-2; w_sum_top = sum(sum(w(i_grad_top, j_grad))); w_sum_bot = sum(sum(w(i_grad_bot, j_grad))); % 2. Bucle para recorrer las secuencias de vídeo frame a frame % Inicializamos los parámetros que vamos a calcular para cada frame e_frames = zeros(1,numFrames); d_frames = zeros(1,numFrames - 1); % Para el primer frame d no se calcula n_frames = zeros(1,numFrames); for frame = 1:numFrames % 3. Formato: 444, 422 o 420 (convertimos a 444 si no lo está) if strcmp(formato, '420') % Convertimos a 444 si está en 420 frameOrig=conv420to444(secuenciaOriginal{frame},'nearest'); frameDist=conv420to444(secuenciaDistorsionada{frame},'nearest'); elseif strcmp(formato, '422') % Convertimos a 444 si está en 422 frameOrig=conv422to444(secuenciaOriginal{frame},'nearest'); frameDist=conv422to444(secuenciaDistorsionada{frame},'nearest'); elseif strcmp(formato, '444') % No cambiamos el formato si ya está en 444 frameOrig = secuenciaOriginal{frame}; frameDist = secuenciaDistorsionada{frame}; else disp 'formato incorrecto' return; end % 4. Cálculos relativos al parámetro de bordes % Filtrado perceptual x2 = double(frameOrig{1}); x2(:,2:N-1) = (1/4) * (x2(:,1:N-2) + 2*x2(:,2:N-1) + x2(:,3:N)); y2 = double(frameDist{1}); y2(:,2:N-1) = (1/4) * (y2(:,1:N-2) + 2*y2(:,2:N-1) + y2(:,3:N)); % Separación del frame en campos x3 = [x2(1:2:M-1, :); x2(2:2:M, :) ]; y3 = [y2(1:2:M-1, :); y2(2:2:M, :) ]; clear x2 y2 % Cálculo del gradiente xhor = zeros(M,N); xhor(:, 3:N-2) = (1/2) * (x3(:,5:N) + x3(:,4:N-1) - x3(:,2:N-3) - x3(:,1:N-4)); xver = zeros(M,N); xver(2:M-1, :) = x3(3:M,:) - x3(1:M-2,:); xedge = sqrt(xhor.^2 + xver.^2); yhor = zeros(M,N); yhor(:, 3:N-2) = (1/2) * (y3(:,5:N) + y3(:,4:N-1) - y3(:,2:N-3) - y3(:,1:N-4)); yver = zeros(M,N); yver(2:M-1, :) = y3(3:M,:) - y3(1:M-2,:); yedge = sqrt(yhor.^2 + yver.^2);
50 clear xhor xver yhor yver % Dilatamos la imagen de bordes mask = ones(3); % Máscara 3x3 xedge_ = imdilate(xedge, mask); yedge_ = imdilate(yedge, mask); clear xedge yedge % Cálculo de la desviación máxima de luminancia respecto al rango medio dev = max(abs(x3 - 100), abs(y3 - 100)); % Cálculo del error de bordes normalizado e = 100 * (yedge_ - xedge_) ./ (xedge_ + 80 + dev); clear xedge_ yedge_ % Clipamos al rango [-40,40] e(e < -40) = -40; e(e > 40) = 40; % Agregación de e en cada campo utilizando Lebesgue-7 etop = nthroot(sum(sum(abs(e(i_grad_top,j_grad)).^7 .* w(i_grad_top,j_grad))) / w_sum_top, 7); ebot = nthroot(sum(sum(abs(e(i_grad_bot,j_grad)).^7 .* w(i_grad_bot,j_grad))) / w_sum_bot, 7); % Media del error de bordes para ambos campos e_frames(frame) = (etop + ebot) / 2; % 5. Cálculo de la decorrelación entre frames % A partir del segundo frame if frame ~= 1 num = sum(sum(x3([i_grad_top,i_grad_bot],j_grad) .* x3_ant([i_grad_top,i_grad_bot],j_grad))); den = sqrt(sum(sum(x3([i_grad_top,i_grad_bot],j_grad).^2))) * sqrt(sum(sum(x3_ant([i_grad_top,i_grad_bot],j_grad).^2))); d_frames(frame - 1) = 100 * (1 - num / den); end x3_ant = x3; % Guardamos x3 para la próxima iteración % 6. Cálculo del indicador de croma % Lectura de croma x2_Cb = double(frameOrig{2}); x2_Cr = double(frameOrig{3}); y2_Cb = double(frameDist{2}); y2_Cr = double(frameDist{3}); % Separación de la croma en campos x3_Cb = [x2_Cb(1:2:M-1, :); x2_Cb(2:2:M, :) ]; x3_Cr = [x2_Cr(1:2:M-1, :); x2_Cr(2:2:M, :) ]; y3_Cb = [y2_Cb(1:2:M-1, :); y2_Cb(2:2:M, :) ]; y3_Cr = [y2_Cr(1:2:M-1, :); y2_Cr(2:2:M, :) ]; clear x2_Cb x2_Cr y2_Cb y2_Cr
51 % Cálculo de saturación de color satx = sqrt((x3_Cb - 128).^2 + (x3_Cr - 128).^2); saty = sqrt((y3_Cb - 128).^2 + (y3_Cr - 128).^2); sat = max(satx,saty); clear satx saty % Cálculo del error de color (solo para el rojo) n = 100 * abs(y3_Cr - x3_Cr) ./ (25 + 0.3*sat); clear x3_Cb x3_Cr y3_Cb y3_Cr sat % Agregación de n en cada campo utilizando los pesos w (Lebesgue-2) ntop = sqrt(sum(sum(n(i_grad_top,j_grad).^2 .* w(i_grad_top,j_grad))) / w_sum_top); nbot = sqrt(sum(sum(n(i_grad_bot,j_grad).^2 .* w(i_grad_bot,j_grad))) / w_sum_bot); % Tomamos el mínimo de ambos campos como indicador de error de croma n_frames(frame) = min(ntop,nbot); end % 7. Agregación temporal de los parámetros calculados para cada frame % Error de bordes, usamos Lebesgue-7 E = nthroot(sum(e_frames.^7) / numFrames, 7); % Si el error final de bordes es muy pequeño lo hacemos 0 (no será % perceptible un error muy pequeño para la evaluación sunjetiva) if E < 7 E_ = 0; else E_ = E - 7; end % Decorrelación, usamos Lebesgue-7 D = nthroot(sum(d_frames.^7) / (numFrames - 1), 7); % Error de croma (en Cr), promediamos N = sum(n_frames) / numFrames; % 8. Combinación lineal de los parámetros calculados DMOSp = 3.95*E_ + 0.74*N - 0.78*D - 0.4; % Truncamos al rango [0,85] DMOSp(DMOSp < 0) = 0; DMOSp(DMOSp > 85) = 85; end Tabla 13: código de PVQM
52
53 4 COMPARACIÓN Y RESULTADOS emos descrito 10 algoritmos diferentes que podemos utilizar para obtener de forma objetiva una valoración de la calidad de una señal de vídeo procesada, referida a su versión original y carente de distorsión. Pasamos a compararlos entre sí, de forma que podamos determinar cuáles de las técnicas vistas funcionan mejor, esto es, cuáles proporcionan resultados más representativos de la opinión de un usuario medio. Como se ha visto en el capítulo 2, las evaluaciones objetivas tienen la ventaja de poder automatizar su ejecución. Por contraposición, el grado de correlación entre las valoraciones que proporcionan y las que podemos obtener de un test subjetivo varía en gran medida de unos algoritmos a otros. En este capítulo nos ocuparemos de medir dicha correlación para todas las técnicas vistas. 4.1 Método de comparación Para poder comparar unos algoritmos con otros, vamos a medir la precisión con la que cada cual es capaz de predecir la valoración de calidad que una secuencia de vídeo obtendría por evaluación subjetiva. Para ello utilizaremos la base de datos de vídeo LIVE Video Quality Database [10], comentada en el capítulo 2. Esta nos proporciona, en resumen, 150 secuencias de vídeo acompañadas cada una de una valoración subjetiva (DMOS) y la desviación típica de dicha valoración. El proceso de comparación comienza con procesar cada una de las secuencias de la base de datos con todos los algoritmos del capítulo 3, de modo que obtenemos una valoración objetiva por cada secuencia y por cada método empleado. Para cada algoritmo, escalaremos las valoraciones objetivas al rango en el que varían las subjetivas, y aplicaremos una curva de regresión no lineal, con el objetivo de suavizar los resultados [1] [2]. La curva utilizada es la siguiente: En la expresión (23), 𝑄𝑄𝑗𝑗 representa la valoración de calidad obtenida mediante un método objetivo para el j-ésimo vídeo de la base de datos, 𝑄𝑄𝑗𝑗′ es la predicción de calidad a partir de 𝑄𝑄𝑗𝑗, y los 𝛽𝛽𝑖𝑖 son constantes que se ajustan de forma que se minimice el error cuadrático medio entre las predicciones de calidad 𝑄𝑄𝑗𝑗′ y las valoraciones de calidad reales DMOS que nos proporciona la base de datos. Por último, comparamos las predicciones de calidad con las valoraciones subjetivas exactas mediante cuatro indicadores: coeficiente de correlación de Pearson (PCC), coeficiente de correlación de Spearman (SROCC), ratio de outliers (OR) y error cuadrático medio (RMSE) [7]. H 𝑄𝑄 𝑗𝑗 ′=𝛽𝛽 2 +𝛽𝛽1−𝛽𝛽2 1 + 𝐴𝐴−� 𝑄𝑄𝑗𝑗−𝛽𝛽3 |𝛽𝛽4|� (23)
54 4.1.1 Coeficiente de correlación de Pearson (PCC) El primer indicador y más importante de los cuatro mide la linealidad que existe en la relación entre las predicciones de calidad y las valoraciones exactas. Varía en el rango [-1,1], tomando el valor 0 cuando no existe relación lineal entre las dos variables, y alcanzando el valor -1 o 1 cuando la linealidad es perfecta (el signo indica si la relación es directa o indirecta). Una alta linealidad indica gran precisión de la métrica y mayor fiabilidad de los resultados. La siguiente expresión muestra cómo calcular el PCC, para dos conjuntos de datos 𝑥𝑥 e 𝑦𝑦. 4.1.2 Coeficiente de correlación de Spearman (SROCC) El coeficiente de correlación de Spearman representa la monotonía en las predicciones de una métrica. Varía en el rango [-1,1], y se interpreta de la misma forma que el PCC (valores cercanos a -1 o 1 indican gran monotonía en las predicciones y, por tanto, que el algoritmo es más fiable). Se calcula a partir de las posiciones que ocuparían los elementos del vector de datos si los ordenáramos de menor a mayor (denotados 𝑋𝑋𝑖𝑖). 4.1.3 Ratio de outliers (OR) El ratio de outliers de una métrica es el porcentaje de predicciones obtenidas de forma objetiva que han diferido del valor exacto DMOS, al menos, dos veces la desviación típica de la valoración subjetiva. Nos da una idea de la consistencia de las predicciones, es decir, de su buena capacidad de mantener la precisión para la base de datos completa cuando este cociente es bajo. 4.1.4 Error cuadrático medio (RMSE) Por último, mediremos el error existente entre las predicciones objetivas de cada métrica y las valoraciones del test subjetivo. Las predicciones serán más precisas cuando el error sea menor. 𝑃𝑃𝐶𝐶𝐶𝐶=∑(𝑥𝑥𝑖𝑖−𝑥𝑥)(𝑦𝑦𝑖𝑖−𝑦𝑦�) �∑(𝑥𝑥𝑖𝑖−𝑥𝑥)2�∑(𝑦𝑦𝑖𝑖−𝑦𝑦�)2 (24) 𝑃𝑃𝑃𝑃𝑂𝑂𝐶𝐶𝐶𝐶=∑(𝑋𝑋𝑖𝑖−𝑋𝑋′)(𝑌𝑌𝑖𝑖−𝑌𝑌′) �∑(𝑋𝑋𝑖𝑖−𝑋𝑋′)2�∑(𝑌𝑌𝑖𝑖−𝑌𝑌′)2 (25) 𝑂𝑂𝑃𝑃=𝑃𝑃′ 𝑃𝑃 (26) 𝑃𝑃𝑀𝑀𝑃𝑃𝑀𝑀=�1 𝑃𝑃�(𝑥𝑥𝑖𝑖−𝑦𝑦𝑖𝑖) 2 (27)
55 4.2 Resultados En esta sección vamos a mostrar las predicciones de calidad que hemos obtenido con los diez algoritmos del capítulo 3, así como los indicadores de precisión descritos en la sección anterior. Las siguientes figuras (8–17) muestran las valoraciones de calidad obtenidas con cada método objetivo para las secuencias de la base de datos utilizada. En color verde, se sobreimprime la curva de predicciones, resultado de aplicar la regresión no lineal entre las parejas de datos (DMOS, 𝑄𝑄𝑗𝑗). Figura 18: Resultados PSNR Figura 19: Resultados SSIM Figura 20: Resultados MS-SSIM Figura 21: Resultados M-SVD
56 Figura 22: Resultados VQM – Modelo general Figura 23: Resultados Okamoto et al. Figura 24: Resultados MOSp Figura 25: Resultados VQM Figura 26: Resultados VQR Figura 27: Resultados PVQM
57 La siguiente tabla muestra los cuatro indicadores que utilizamos para comparar los métodos, calculados para los resultados de cada algoritmo, considerando la totalidad de las secuencias de la LIVE Video Quality Database: coeficiente de correlación de Pearson, coeficiente de correlación de Spearman, ratio de outliers (en tanto por uno) y error cuadrático medio. Tabla 14: Indicadores de comparación A modo de facilitar una visión del coste computacional de cada método, se proporciona la siguiente tabla con el tiempo medio en segundos que tarda en procesar cada método una pareja de secuencias a 25 fps de la base de datos empleada, ejecutándose en el ordenador utilizado para este estudio. Estos tiempos son orientativos, pues dependerán de la potencia computacional del ordenador en el que se ejecuten los algoritmos. Tabla 15: Tiempo de ejecución de los métodos
64 [15] A. Shnayderman, A. Gusev, and A. Eskicioglu, "Multidimensiona l image quality measure using singular value decomposition," in Proc. SPIE—Int. Soc. Opt. Eng. , 2003, vol. 5294, no. 1, pp. 82-92. [16] P. Tao and A. M. Eskicioglu, "Video quality assessment using M-SVD," in Proc. Int. Soc. Opt. Eng. (SPIE), 2007, vol. 6494. [17] "Descomposición en valores singulares", Wikipedia [Online]: https://es.wikipedia.org/wiki/Descomposici%C3%B3n_en_valores_singulares [18] S. Wolf and M. Pinson. (2002, June) Video Quality Measurement Techniques. [Online] : https://www.its.bldrdoc.gov/publications/2423.aspx [19] M. Pinson and S. Wolf, "A new standardized method for objectively measuring video quality," IEEE Trans. Broadcast., vol. 50, no. 3, pp. 312-322, Sep. 2004. [20] J. Okamoto, T. Hayashi, A. Takahashi, and T. Kurita, "Proposal for an objective video quality assessment method that takes temporal and spatial information into consideration," Electron. Commun. Japan, Part 1 (Commun), vol. 89, no. 12, pp. 97-108, 2006. [21] American National Standard for Telecommunications—Digital Transport of One- Way Video Signals—Parameters for Objective Performance Analysis, ANSI T1.801.03- 1996, 1996. [22] A. Bhat, I. Richardson, and S. Kannangara, "A new perceptual quality metric for compressed video," in IEEE Int. Conf. Acoust., Speech, Signal Process., 2009, pp. 933 - 936. [23] F. Xiao, "DCT-based video quality evaluation," Winter 2000. [24] C. Lee and O. Kwon, "Objective measurements of video quality using the wavelet transform," Optical Eng., vol. 42, no. 1, pp. 265-272, Jan, 2003. [25] A. Hekstra, J. Beerends, D. Leadermann, F. de Caluwe, S. Kohler, R. Koenen, S. Rihs, M. Ehrsam, and D. Schalauss, "PVQM—A perceptual video quality measure," Signal Process. Image Commun, vol. 17, no. 10, pp. 781-798, Nov, 2002.
65 ÍNDICE DE TABLAS Y FIGURAS Tabla 1: código de PSNR 18 Tabla 2: código de SSIM (función principal) 20 Tabla 3: código de SSIM (subfunción) 22 Tabla 4: código de MS-SSIM (función principal) 23 Tabla 5: código de MS-SSIM (subfunción) 25 Tabla 6: código de M-SVD (función principal) 28 Tabla 7: código de M-SVD (subfunción) 28 Tabla 8: código de VQM – Modelo general 35 Tabla 9: código de la métrica de Okamoto et al. 38 Tabla 10: código de MOSp 40 Tabla 11: código de VQM 43 Tabla 12: código de VQR 46 Tabla 13: código de PVQM 51 Tabla 14: Indicadores de comparación 57 Tabla 15: Tiempo de ejecución de los métodos 57 Tabla 16: PCC desglosado por tipos de distorsión 60 Figura 1: Diagrama de métodos Full Reference 12 Figura 2: Diagrama de métodos Reduced Reference 12 Figura 3: Diagrama de métodos No-Reference 12 Figura 4: Clasificación de las métricas 16 Figura 5: Diagrama de PSNR 17 Figura 6: Diagrama de SSIM 19 Figura 7: Diagrama de MS-SSIM 23 Figura 8: Diagrama de M-SVD 27 Figura 9: Diagrama de VQM (NTIA) 30 Figura 10: Diagrama de la métrica de Okamoto 36 Figura 11: Diagrama de MOSp 40 Figura 12: Contrast Sensivity Function (CSF) 41 Figura 13: Matriz de cuantificación de MPEG 41 Figura 14: Diagrama de VQM 42 Figura 15: Descomposición wavelet en 3 niveles 44 Figura 16: Diagrama de VQR 44 Figura 17: Diagrama de PVQM 48 Figura 18: Resultados PSNR 55
66 Figura 19: Resultados SSIM 55 Figura 20: Resultados MS-SSIM 55 Figura 21: Resultados M-SVD 55 Figura 22: Resultados VQM – Modelo general 56 Figura 23: Resultados Okamoto et al 56 Figura 24: Resultados MOSp 56 Figura 25: Resultados VQM 56 Figura 26: Resultados VQR 56 Figura 27: Resultados PVQM 56
67 GLOSARIO HVS: Sistema Visual Humano (Human Visual System) 9 ITU: International Telecommunication Union 9 MOS: Mean Opinion Score 9 DMOS: Differencial Mean Opinion Score 9 ACR: Absolute Category Rating 10 ACR-HR: Absolute Category Rating with Hidden Reference 10 SSCQE: Single Stimulus Continuous Quality Rating 10 DSCQS: Double Stimulus Continuos Quality Scale 10 DSIS: Double Stimulus Impairment Scale 11 FR: Full Reference 12 RR: Reduced Reference 12 NR: No Reference 12 PSNR: Peak Signal to Noise Ratio 16 SSIM: Structural Similarity Index 18 MS-SSIM: MultiScale-SSIM 22 CSF: Contrast Sensivity Function 22 M-SVD: Multidimensional – Singular Value Decomposition 25 VQM: Video Quality Metric 29 NTIA: National Telecommunications and Information Administration 29 ANSI: American National Standards Institute 35 MOSp: Mean Opinion Score prediction 39 MSE: Mean Squared Error 39 DCT: Transformada del Coseno Discreta 41 VQR: Video Quality Rating 43 PVQM: Perceptual Video Quality Measure 46 PCC: Pearson Correlation Coefficient 53 SROCC: Spearman Rank Order Correlation Coefficient 53 OR: Outlier Ratio 53 RMSE: Root Mean Square Error 53