Opencv – Modo de escala de grises Vs conversión de color gris

4 minutos de lectura

Avatar de usuario de Gagandeep Singh
Gagandeep Singh

Estoy trabajando en opencv (2.4.11) python (2.7) y estaba jugando con imágenes grises. Encontré un comportamiento inusual al cargar la imagen en modo de escala de grises y convertir la imagen de BGR a GRAY. El siguiente es mi código experimental:

import cv2

path="some/path/to/color/image.jpg"

# Load color image (BGR) and convert to gray
img = cv2.imread(path)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Load in grayscale mode
img_gray_mode = cv2.imread(path, 0)

# diff = img_gray_mode - img_gray
diff = cv2.bitwise_xor(img_gray,img_gray_mode)

cv2.imshow('diff', diff)
cv2.waitKey()

Cuando vi la imagen de diferencia, puedo ver los píxeles omitidos en lugar de la imagen en negro azabache. ¿Puede sugerir alguna razón? Cuál es la forma correcta de trabajar con imágenes grises.

PD: cuando utilizo ambas imágenes en SIFT, los puntos clave son diferentes, lo que puede generar resultados diferentes, especialmente cuando se trabaja con imágenes de mala calidad.

  • Posible duplicado de conversión de imagen OpenCV de RGB a escala de grises usando imread dando malos resultados

    – Jean-Baptiste Yunès

    13 de mayo de 2016 a las 7:41

  • Tenga en cuenta que esto no es un duplicadoporque el OP es consciente de que la imagen de cv2.imread está en formato BGR (a diferencia de la pregunta duplicada sugerida que suponía que era RGB, por lo tanto, las respuestas proporcionadas solo abordan ese problema

    – bakkal

    13 mayo 2016 a las 11:01


avatar de usuario de bakkal
bakkal

Nota: Esto no es un duplicadoporque el OP es consciente de que la imagen de cv2.imread está en formato BGR (a diferencia de la pregunta duplicada sugerida que suponía que era RGB, por lo tanto, las respuestas proporcionadas solo abordan ese problema)

Para ilustrar, he abierto esta misma imagen JPEG en color:

ingrese la descripción de la imagen aquí

una vez usando la conversión

img = cv2.imread(path)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

y otro cargándolo en modo escala de grises

img_gray_mode = cv2.imread(path, cv2.IMREAD_GRAYSCALE)

Como ha documentado, la diferencia entre las dos imágenes no es perfectamente 0, puedo ver píxeles de diferencia hacia la izquierda y la parte inferior

ingrese la descripción de la imagen aquí

También he resumido la diferencia para ver

import numpy as np
np.sum(diff)
# I got 6143, on a 494 x 750 image

probé todo cv2.imread() modos

entre todos los IMREAD_ modos para cv2.imread()solamente IMREAD_COLOR y IMREAD_ANYCOLOR se puede convertir usando COLOR_BGR2GRAYy ambos me dieron la misma diferencia contra la imagen abierta en IMREAD_GRAYSCALE

La diferencia no parece tan grande. Supongo que proviene de las diferencias en los cálculos numéricos en los dos métodos (cargar escala de grises frente a conversión a escala de grises)

Naturalmente, lo que desea evitar es ajustar su código en una versión particular de la imagen solo para descubrir que no era óptimo para las imágenes que provienen de una fuente diferente.

En resumen, no mezclemos las versiones y los tipos en la canalización de procesamiento.

Así que mantendría las fuentes de imagen homogéneas, por ejemplo, si ha capturado la imagen de una cámara de video en BGR, entonces usaría BGR como fuente y haría la conversión de BGR a escala de grises. cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Viceversa, si mi fuente final es escala de grises, entonces abriría los archivos y la captura de video en escala de grises cv2.imread(path, cv2.IMREAD_GRAYSCALE)

  • La razón es que hay múltiples implementaciones de la conversión de escala de grises en juego. cvtColor() es LA implementación de opencv y será consistente en todas las plataformas. cuando usas imread() para convertir a escala de grises, está a merced de la implementación específica de la plataforma de imread(). no me sorprendería si imread() devuelve valores de escala de grises ligeramente diferentes en cada plataforma. No puedo pensar en ninguna razón para convertir alguna vez a escala de grises en imread.

    –Michael Gallacher

    23 oct 2019 a las 18:53


  • Lo que dijo @MichaelGallacher. Los coeficientes utilizados por cvtColor están aquí: github.com/opencv/opencv/blob/master/modules/imgproc/src/…

    – darda

    11 mayo 2021 a las 21:23

¿Ha sido útil esta solución?