tutorials docs image-processing opencv

image processing - docs - Determine si una imagen necesita un contraste automático en OpenCV



opencv tutorials (3)

OpenCV tiene una práctica función cvEqualizeHist () que funciona muy bien en imágenes desvanecidas / de bajo contraste. Sin embargo, cuando se da una imagen que ya tiene un alto contraste, el resultado es uno de bajo contraste. Tengo la razón: el histograma se distribuye de manera uniforme y esas cosas.

La pregunta es: ¿cómo puedo saber la diferencia entre una imagen de bajo contraste y una de alto contraste?

Estoy operando en imágenes en escala de grises y estableciendo su contraste de manera adecuada para que el umbral no borre el texto que debo extraer (esa es una historia diferente). Sugerencias bienvenidas: especialmente sobre cómo saber si la mayoría de los píxeles de la imagen son de color gris claro (lo que significa que se debe realizar la ecualización). ¡Ayuda!

EDITAR : gracias a todos por muchas respuestas informativas. Pero el cálculo de la desviación estándar fue suficiente para mis requisitos y, por lo tanto, lo tomo como la respuesta a mi consulta.


Probablemente pueda simplemente usar una medida estadística simple de la imagen para determinar si una imagen tiene suficiente contraste. La varianza de la imagen probablemente sea un buen punto de partida. Si la varianza está por debajo de un cierto umbral (para ser determinado empíricamente), entonces puede considerarlo como "bajo contraste".


Si está ajustando el contraste para que pueda establecer el umbral más tarde, es posible que pueda evitar el paso de ajuste de contraste si establece su umbral de forma adaptativa con el método de Ohtsu .

Si aún te interesa descubrir el contraste de la imagen, sigue leyendo.

Si bien hay una serie de formas diferentes de calcular "contraste". A menudo, esas métricas se aplican localmente en oposición a la imagen completa, para que el resultado sea más sensible al contenido de la imagen:

  • Divida la imagen en barrios adyacentes que no se superponen.
  • Elija tamaños de barrio que sean aproximados al tamaño de las características de su imagen (por ejemplo, si su característica principal es el texto horizontal, haga que los vecindarios sean lo suficientemente altos como para capturar 2 líneas de texto, y lo mismo ancho).
  • Aplicar la métrica a cada vecindario individualmente
  • Umbral del resultado de la métrica para separar los bloques de varianza baja y alta. Esto evitará cosas tales como áreas de página grandes y en blanco que sesguen sus estimaciones de contraste.

Desde allí, puede usar una serie de características para determinar el contraste:

  • La proporción de bloques métricos altos en bloques métricos bajos
  • Alto promedio de bloque métrico
  • Distancia de intensidad entre los bloques métricos alto y bajo (utilizando medios, modos, etc.)

Esto puede servir como una mejor indicación del contraste de la imagen que la varianza de la imagen global sola. Este es el por qué:

(stddev: 50.6)

(stddev: 7.9)

Las dos imágenes están perfectamente en contraste (el fondo gris está justo allí para que sea obvio que es una imagen), pero sus desviaciones estándar (y por lo tanto la varianza) son completamente diferentes.


  1. Calcule el histograma acumulativo de la imagen.
  2. Haga la regresión lineal del histograma acumulativo en la forma y(x) = A*x + B
  3. Calcule RMSE de real_cumulative_frequency(x)-y(x) .
  4. Si ese RMSE está cerca de cero, la imagen ya está ecualizada. (Eso significa que para las imágenes ecualizadas los histogramas acumulativos deben ser lineales)

Idea es tomada desde aquí .

EDITAR: He ilustrado este enfoque en mi blog (código de ejemplo C incluido).