He estado trabajando en mi propio renderizador durante un tiempo, y me pregunto si hay alguna forma de eliminar el ruido de Monte Carlo de la imagen renderizada, además de esperar mucho tiempo para que converja.
La forma en que encontré es desenfocar la imagen, lo que no es realmente útil, ya que reduce mucho la calidad / nitidez de la imagen. Y puedo lograr lo mismo al representar una imagen pequeña con más muestras y luego ampliarla.
¿Existe algún algoritmo diseñado para lidiar con el ruido en la imagen en el trazado de ruta?
algorithm
image-processing
pathtracing
denoise
Mary Chang
fuente
fuente
Respuestas:
Hay, y espero ver los detalles de otras respuestas, pero una forma de lidiar con esto es no tener el ruido (o tanto ruido) en los datos de origen para empezar.
El ruido proviene del hecho de que hay una gran variación en el renderizado: el número de muestras que ha tomado no ha convergido lo suficiente con la respuesta correcta real de la integral, por lo que algunos píxeles son demasiado altos / brillantes y otros son demasiado bajo / tenue (en cada canal de color).
El problema es este: si usa números aleatorios de ruido blanco para hacer su muestreo, puede obtener muestras agrupadas como la imagen a continuación. Dadas suficientes muestras, convergerá, pero tomará un tiempo antes de que brinde una buena cobertura sobre el espacio de muestreo. Busque una región de espacio vacío en la imagen a continuación (como en la esquina inferior derecha) e imagine que había una luz pequeña y brillante allí y que la escena estaba oscura en todas partes. Puede ver cómo no tener muestras allí va a crear un problema para el renderizado.
Alternativamente, puede muestrear a intervalos regulares como el siguiente, pero eso le dará artefactos de alias en lugar de ruido, lo que es peor.
Una idea es usar secuencias de baja discrepancia y hacer una integración cuasi monte carlo ( https://en.wikipedia.org/wiki/Quasi-Monte_Carlo_method ). Las secuencias de baja discrepancia están relacionadas con el ruido azul, que solo tiene componentes de alta frecuencia. Al seguir estas rutas, obtienes una convergencia más rápida deO(1/N) en vez de O(N−−√) . Estos brindan una mejor cobertura del espacio muestral, pero dado que existe cierta aleatoriedad (o cualidades similares al azar) para ellos, no tienen los problemas de alias que tiene el muestreo regularmente espaciado.
Aquí hay una "cuadrícula fluctuante" donde se muestrea en una cuadrícula, pero usa pequeñas compensaciones aleatorias dentro del tamaño de una celda. Esto fue inventado por pixar y estuvo bajo patente por un tiempo, pero ya no es:
Aquí hay una secuencia común de baja discrepancia llamada secuencia de Halton (básicamente una versión 2D de Van Der Corpus)
Y aquí hay un muestreo de disco de Poisson, utilizando el mejor algoritmo candidato de Mitchel:
Puede encontrar más información, incluido el código fuente que generó estas imágenes aquí: https://blog.demofox.org/2017/05/29/when-random-numbers-are-too-random-low-discrepancy-sequences/
fuente
Una técnica que podría utilizar es dividir la imagen en bloques y medir la varianza de cada bloque; de esta manera puede aplicar más muestras a los bloques con mayor varianza.
La varianza se puede estimar utilizando 2 memorias intermedias de acumulación en lugar de 1. Se procesa cada pasada en una memoria intermedia alternativa. La diferencia absoluta entre estos búferes (con respecto a cada bloque) es proporcional a la varianza. Tras la presentación en la pantalla, puede agregar los dos búferes juntos para recuperar su búfer de acumulación completa.
fuente