Pregunta

Estoy procesando algunas imágenes y necesito un algoritmo de balance de blancos automático que no sea demasiado intensivo en términos de tiempo de cálculo de la CPU.¿Alguna recomendación?

EDITAR:y si es relevante para la eficiencia, lo implementaré en Java con imágenes en color como una matriz de números enteros.

¿Fue útil?

Solución

Un algoritmo relativamente simple consiste en promediar los tonos (en HSV o HSL) de los píxeles más brillantes y más oscuros de la pantalla.En caso de necesidad, opte sólo por el píxel más brillante.Si los tonos entre el más brillante y el más oscuro son demasiado diferentes, opte por el píxel brillante.Si la oscuridad es casi negra, opte por el píxel brillante.

¿Por qué siquiera mirar el píxel oscuro?A veces, la oscuridad no es casi negra y deja entrever la luz ambiental, la niebla o la neblina.

Esto tendrá sentido para ti si eres un gran usuario de Photoshop.Los aspectos más destacados de una fotografía no están relacionados (o están débilmente relacionados) con el color subyacente del objeto.Son su mejor representación del color de la luz, a menos que la imagen esté tan sobreexpuesta que todo haya abrumado a los CCD.

Luego ajuste los tonos de todos los píxeles.

Necesitará funciones rápidas de RGB a HSV y de HSV a RGB.(Pero tal vez puedas trabajar en RGB para las correcciones de píxeles con una LUT o interpolación lineal).

No querrás utilizar el color de píxel promedio ni el color más popular.Ahí está la locura.

Para encontrar rápidamente el color más brillante (y el más oscuro), puedes trabajar en RGB, pero debes tener multiplicadores para verde, rojo y azul.En un monitor RGB, 255 verde es más brillante que 255 rojo, que es más brillante que 255 azul.Solía ​​​​tener buenos multiplicadores en mi cabeza, pero, por desgracia, se me han escapado de la memoria.Probablemente puedas buscarlos en Google.

Esto fallará en una imagen que no tenga reflejos.Una pared pintada de mate, por ejemplo.Pero no sé qué puedes hacer al respecto.


Hay muchas mejoras que hacer a este algoritmo simple.Puede promediar varios píxeles brillantes, cuadricular la imagen y tomar píxeles brillantes y oscuros de cada celda, etc.Encontrarás algunos ajustes obvios después de implementar el algoritmo.

Otros consejos

GIMP aparentemente utiliza un algoritmo muy simple para el equilibrio de blancos automático. http://docs.gimp.org/en/gimp-layer-white -balance.html

  

El comando de balance de blancos se ajusta automáticamente los colores de la capa activa estirando el rojo, verde y azul canales por separado. Para ello, se descarta colores de los píxeles en cada extremo de la rojo, verde y azul de histogramas que son utilizados por sólo el 0,05% de los píxeles en la imagen y se extiende el rango restante tanto como sea posible. El resultado es que los colores de píxeles que se producen con muy poca frecuencia en los bordes exteriores de los histogramas (quizás bits de polvo, etc.) no influir negativamente en los valores máximo y mínimo y se utiliza para el estiramiento de los histogramas, en comparación con el estiramiento de contraste. Al igual que “Reducir el contraste”, sin embargo, puede haber cambios de tonalidad en la imagen resultante.

Hay un poco más ajustes que se describe aquí, ya que mi primer intento de implementar esto funciona parece funcionar para la mayoría de las fotos, pero otras fotos parecen tener artefactos o contener demasiado de cualquiera roja, verde o azul: /

@Charles Ma ha sugerido el uso de la Gimp algoritmo de balance de blancos. En python y numpy esto podría tener este aspecto:

# white balance for every channel independently
def wb(channel, perc = 0.05):
    mi, ma = (np.percentile(channel, perc), np.percentile(channel,100.0-perc))
    channel = np.uint8(np.clip((channel-mi)*255.0/(ma-mi), 0, 255))
    return channel

image = cv2.imread("foo.jpg", 1) # load color
imWB  = np.dstack([wb(channel, 0.05) for channel in cv2.split(img)] )

es rápido, sencillo y proporciona resultados bastante decentes

Los algoritmos de balance de blancos son difíciles. Incluso las cámaras digitales consiguen el mal de vez en cuando, a pesar de que saben un montón de información adicional sobre la imagen -. Como por ejemplo si se utiliza el flash, y el nivel de luz

Para empezar, me gustaría simplemente promedio rojo, verde y azul, y usar eso como el punto de balance de blancos. Poner límites en él - se mantienen dentro de los márgenes de tungsteno, fluorescente, y la luz del día. No será perfecto, pero cuando su mal, será relativamente fácil de explicar por qué.

Un algoritmo publicado recientemente es el algoritmo de distribución de colores y se puede encontrar aquí: http://www.comp.nus.edu.sg/~brown/pdf/ColorConstancyJOSAv10.pdf En el documento también existe la referencia al código fuente Matlab ( http://www.comp.nus.edu.sg/~whitebal/illuminant/files/ illuminantEstimator.m ). Es un algoritmo simple que se puede programar fácilmente y los resultados muestran que es muy rápido.

Si necesita adicional rápido y al mismo tiempo exacto equilibrio blanco algoritmos (constancia del color), usted debe comprobar en este sitio: http://www.fer.unizg.hr/ipg/resources/color_constancy/

Existen varios algoritmos con su respectiva fuente codificada que podría ser sólo los que buscar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top