Fórmula de balance de blancos (Supresión de color)?

Necesito ayuda con un poco de matemáticas 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.

Así que aquí está lo que tengo:

Tengo un chico en pantalla verde. Original

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 sum de rojo y azul dividido por 2, entonces el verde se ajustará a esa sum. Ejecutar esa expresión me dará la segunda imagen. Puedes ver que el verde se quita perfectamente del tipo, lo que quiero, pero también toma el verde del fondo y lo hace gris, lo que no quiero.

introduzca la descripción de la imagen aquí

    Esta imagen aquí es la cantidad de verde que se elimina. Esto lo consigo restando la primera imagen de la segunda. Así que es la diferencia entre los dos.

    introduzca la descripción de la imagen aquí

    ¿Puede alguien ayudarme a averiguar cómo solo puedo eliminar el verde del tipo y no el fondo a través de una expresión / fórmula? He intentado ajustar el verde, es decir, escribir una expresión que diga: para cualquier píxel verde que esté por debajo de un determinado valor que no sea igual al verde de fondo, conviértalo en negro. Esto funciona un poco, pero es muy áspero en los bordes finos como ese cabello.

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

    introduzca la descripción de la imagen aquí

    Y aquí está el resultado final. se ve genial. Esta imagen es el verde desaparecido del personaje, pero no el fondo. Obtuve esto agregando la imagen de arriba a la segunda imagen. Hice una pantalla dividida para que pueda ver la diferencia. Sobre todo visible en la chaqueta y el pelo.

    introduzca la descripción de la imagen aquí

    No soy experto en la materia 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. Así que necesitas quitar eso (luz no deseada). En cambio, está convirtiendo todos los píxeles verdosos a grisáceos y eso es INCORRECTO en mi opinión. ¿Y si tu chico tiene camiseta verde?

    Me acercaría a esto así:

    En primer lugar, espero que tenga una iluminación perfecta en su conjunto de escenas; de lo contrario, esto nunca funcionará sin el adecuado análisis de dispersión / iluminación 3D, lo que es una tarea enorme y que necesitará para completar también el modelo 3D de su escena.

    1. Primero detecta la cantidad de luz dispersada a la posición de los objetos.

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

       c[i]=c0[i]+c0[i]*m[i] 
      • Color de píxel c (color promedio de la hoja)
      • color del objeto c0 (color del objeto real … blanco pero debe estar a escala con c que puede ser un poco complicado sin tener acceso al escenario de escena)
      • m escala (esto es lo que necesitamos)
      • i canal

      Esto conducirá al sistema de 3 ecuaciones lineales, de modo 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 tu set, así que uso los Dientes. El problema es que hay demasiado color rojo-rojo iluminado desde la piel / piel alrededor, así que solo uso el canal azul para compensar. Esto no es preciso pero lo hará (a menos que el fondo se ilumine también a otros canales) … así que para el color promedio de la imagen de los dientes extraídos:

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

       float m[green]=float(avg[green]-avg[blue])/float(avg[blue]); 
      • c0 es el canal azul de color medio
      • c es el canal verde de color medio

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

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

      Siguiendo la misma ecuación, calcula c0 así:

       c0[i]=c[i]/(1.0+m[i]) 
      • Color de píxel de imagen no corregido
      • Color de píxel de imagen corregido c0
      • escala m (calculada en el paso # 1)
      • i canal (R, G, B)

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

      verdoso original

      Esta es la imagen corregida c0 :

      corregido

      Esta es la resta de c-c0 :

      sub máscara

      ¡Como se puede ver, se quita algo de verde también del fondo, pero eso está bien ya que el fondo también se ilumina! 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 he calibrado y también podría estar demasiado cerca de la pared ... ya que esto también depende en gran medida de la posición del objeto (si se ilumina no es lo suficientemente transparente) sin mencionar que está en la sombra ...

    Gracias a todos por sus pensamientos e ideas. Cada comentario fue una chispa que me llevó a, lo 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 cómo se rompe un poco. El siguiente paso para esto es construir valores ajustables para afectar el peso de los efectos.

    introduzca la descripción de la imagen aquí introduzca la descripción de la imagen aquí