temperatura nikon escala ejemplos d3400 color blancos javascript python image-processing colors rgba

javascript - nikon - ¿Fórmula del balance de blancos(supresión de color)?



escala de blancos (2)

Necesito ayuda con un poco de matemática de color. (RGBA) Estoy tratando de reducir la cantidad de verde en un personaje, sin afectar realmente el fondo verde. Pantalla verde para efectos visuales.

Entonces aquí está lo que tengo:

Tengo un chico en la pantalla verde.

Usando la expresión: g>(r+b)/2 ? (r+b)/2:g g>(r+b)/2 ? (r+b)/2:g expresión dice que si el valor del color verde es mayor que la suma de rojo y azul dividido por 2, entonces el verde se establecerá en esa suma. Ejecutar esa expresión me dará la segunda imagen. Puedes ver que el verde se quitó perfectamente del chico, lo que quiero, pero también toma el verde del fondo y lo hace gris, lo que no quiero.

Esta imagen aquí es cuánto verde se elimina. Lo consigo restando la primera imagen del segundo. Entonces es la diferencia entre los dos.

¿Alguien puede ayudarme a descubrir cómo solo puedo eliminar el verde del hombre y no el fondo a través de una expresión / fórmula? He intentado fijar el verde, es decir, escribir una expresión que dice: para cualquier píxel verde que esté por debajo de un cierto valor que no sea igual al fondo verde, conviértalo en negro. Esto funciona un poco, pero es muy duro en los bordes finos como ese pelo.

A continuación se muestra el resultado deseado que logré al hacer una gran cantidad de corrección de color y clasificación. Me encantaría obtener este resultado a través de la expresión.

y aquí está el resultado final. se ve genial. Esta imagen es el verde que desapareció del personaje, pero no el fondo. Lo obtuve agregando la imagen de arriba a la segunda imagen. Hice una pantalla dividida para que pueda ver la diferencia. principalmente visible en la chaqueta y el cabello.


No soy un experto en el asunto, pero

No creo que su enfoque funcione como pretende (desde el lado de la física).

El fondo verde está brillando en tu personaje que está agregando luz a la superficie del personaje. Entonces necesitas quitar esa (luz no deseada). Estás convirtiendo todos los píxeles verdosos en grisáceos y eso es INCORRECTO, en mi opinión. ¿Qué pasa si tu chico tiene una camiseta verde?

Me acercaría a esto así:

En primer lugar, espero que tengas una condición de iluminación impecable en tu escena; de lo contrario, esto nunca funcionará sin un análisis de iluminación / dispersión 3D apropiado, que es una tarea enorme y necesitarías también para completar el modelo 3D de tu escena.

  1. Primero, detecte la cantidad de luz dispersada en la posición de los objetos.

    Simplemente coloque una hoja de papel blanco para aproximar la posición de su persona. toma la foto. Luego, encuentra que la imagen de la hoja calcula su color promedio y calcula la cantidad de color verde que se agrega al blanco.

    c[i]=c0[i]+c0[i]*m[i]

    • c color de píxel (color promedio de la hoja)
    • c0 color del objeto (color del objeto real ... blanco, pero debe estar en escala con c que puede ser un poco complicado sin acceso al escenario de escena)
    • m escala (esto es lo que necesitamos)
    • i canalizo

    Esto conducirá a un sistema de 3 ecuaciones lineales, así que calcule m partir de él. Esto es invariable en el color de fondo por lo que funcionará para cualquier color ...

    No tengo una imagen de sheete blanco de su conjunto, así que uso los dientes en su lugar. El problema es que hay demasiado color rojo iluminado por la piel / carne alrededor, así que solo uso el canal azul para compensar. Esto no es exacto, pero funcionará (a menos que el fondo se ilumine también con otros canales) ... por lo tanto, para el color de la imagen extraída de los dientes:

    <- esta es la imagen extraída de los dientes que utilicé)

    float m[green]=float(avg[green]-avg[blue])/float(avg[blue]);

    • c0 es un canal azul de color promedio
    • c es el canal verde del color promedio

    Todos los otros canales de m son cero (para este caso). ¡No olvide que m[] es float !

  2. Ahora solo elimina la iluminación de la imagen

    Siguiendo la misma ecuación calcula c0 entonces:

    c0[i]=c[i]/(1.0+m[i])

    • c color de imagen de imagen no corregida
    • c0 color de imagen de píxel corregido
    • m escala (computada en el paso # 1)
    • canal (R, G, B)

    Haga cada canal cada píxel ... Esta es la imagen original c :

    Esta es la imagen corregida c0 :

    Esta es la sustracción de c-c0 :

    Como puede ver, se quita un poco de verde también del fondo, pero está bien, ya que el fondo también está iluminado. Además, la muñeca es más verde de lo que debería ser, pero creo que es porque está demasiado lejos de los dientes para los que calibré y también podría estar demasiado cerca de la pared ... ya que esto también depende mucho de la posición del objeto (si se enciende no es lo suficientemente uniforme) sin mencionar que está a la sombra ...


Gracias a todos por sus pensamientos e ideas. Cada comentario fue una chispa que me condujo a, que creo que es, lo más cercano a una solución. Necesita más trabajo. Si miras más de cerca su puño, puedes ver que se rompe un poco. El siguiente paso para esto es construir valores ajustables para afectar el peso de los efectos.