Saltar al contenido

Estimar el brillo de una imagen Opencv

Hola, hallamos la respuesta a tu interrogante, desplázate y la verás a continuación.

Solución:

Supongo que ese modelo de color HSV será útil en su problema, donde el canal V es Valor:

“El valor es el brillo del color y varía con la saturación del color. Va de 0 a 100%. Cuando el valor es ‘0’, el espacio de color será totalmente negro. Con el aumento del valor, el brillo del espacio de color aumenta y muestra varios colores”.

Así que use el método OpenCV cvCvtColor(const CvArr* src, CvArr* dst, int code), que convierte una imagen de un espacio de color a otro. En su caso, código = CV_BGR2HSV. Entonces calcule el histograma del tercer canal V.

Estaba a punto de preguntar lo mismo, pero luego descubrí que esa pregunta similar no dio respuestas satisfactorias. Todas las respuestas que he encontrado en SO tratan con la observación humana de un solo píxel RGB vs HSV.

Según mis observaciones, el brillo subjetivo de una imagen también depende en gran medida del patrón. Una estrella en un cielo oscuro puede parecer más brillante que un cielo nublado durante el día, mientras que el valor medio de píxel de la primera imagen será mucho menor.

Las imágenes que uso son imágenes de células en escala de grises producidas por un microscopio. Las formas varían considerablemente. A veces son pequeños puntos brillantes sobre un fondo muy negro, a veces son áreas más grandes menos brillantes sobre un fondo no tan oscuro.

Mi enfoque es:

  • Encuentre el máximo de histograma (HMax) usando el umbral para eliminar píxeles calientes.
  • Calcule los valores medios de todos los píxeles entre HMax * 2/3 y HMax

La relación 2/3 también podría aumentarse a 3/4 (lo que reduce el rango de píxeles considerados como brillantes).

El enfoque funciona bastante bien, ya que diferentes patrones de células con la misma titulación producen un brillo similar.

PD: Lo que realmente quería preguntar es si existe una función similar para dicho cálculo en OpenCV o SimpleCV. ¡Muchas gracias por cualquier comentario!

Un poco de código fuente de OpenCV C++ para una verificación trivial para diferenciar entre imágenes claras y oscuras. Esto está inspirado en la respuesta anterior proporcionada hace años por @ann-orlova:

const int darkness_threshold = 128; // you need to determine what threshold to use

cv::Mat mat = get_image_from_device();

cv::Mat hsv;
cv::cvtColor(mat, hsv, CV_BGR2HSV);
const auto result = cv::mean(hsv);

// cv::mean() will return 3 numbers, one for each channel:
//      0=hue
//      1=saturation
//      2=value (brightness)

if (result[2] < darkness_threshold)

    process_dark_image(mat);

else

    process_light_image(mat);

Comentarios y valoraciones

Te invitamos a defender nuestra faena escribiendo un comentario y dejando una puntuación te damos la bienvenida.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *