una recorrer pixeles los leer imagen guardar filtros con acceder python opencv image-processing jpeg grayscale

recorrer - En OpenCV(Python), ¿por qué recibo imágenes de 3 canales desde una imagen en escala de grises?



recorrer pixeles opencv (3)

Estoy usando Python (2.7) y enlaces para OpenCV 2.4.6 en Ubuntu 12.04

Cargo una imagen

image = cv2.imread(''image.jpg'')

Luego verifico la forma de la matriz de imágenes

print image.shape

Obtengo (480, 640, 3), lo que espero para una imagen a color de 640x480. Luego convierto la imagen a escala de grises y compruebo la forma nuevamente.

gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) print gray_image.shape

Obtengo (480, 640, 1), lo que espero para una imagen en escala de grises de 640x480. Luego guardo la imagen:

cv2.imwrite(''gray.jpg'', gray_image)

Estoy en Linux, así que traté de mirar la imagen con gThumb, que muestra todos los canales de color. Cuando regreso la imagen gris a OpenCV, la imagen tiene tres canales nuevamente. Conozco esta bandera para leer imágenes:

CV_LOAD_IMAGE_GRAYSCALE - If set, always convert image to the grayscale one

Pero parece que traerá la imagen como una imagen en color y luego la convertirá. Estoy portando este proyecto a RaspberryPi, así que no quiero que ocurran operaciones innecesarias.

EDITAR: He realizado algunas comprobaciones de tiempo y descubrí que al cargar una imagen con el indicador establecido CV_LOAD_IMAGE_GRAYSCALE, la imagen se carga dos veces más rápido, independientemente de la entrada de la imagen.

Using a 3072 x 4608 x 3 image 0.196774959564 seconds with default loading 0.0931899547577 seconds with CV_LOAD_IMAGE_GRAYSCALE

El problema parece ser que OpenCV está creando una salida JPG de 3 canales ya sea que tenga una matriz de imagen en escala de grises o no.

¿Qué otra aplicación puedo usar para asegurarme de obtener una imagen JPG de canal de 8 bits? (Quizás gThumb esté informando los canales incorrectamente).

Si la imagen no es de un solo canal, ¿por qué OpenCV guarda mi imagen en escala de grises en una imagen de 3 canales en la escritura del disco?

Gracias por adelantado.


En openCV, la lectura de imágenes jpg da como resultado 3 imágenes de canales por defecto. Así que no estoy seguro si realmente puedes ver desde el archivo jpg que ya está grayscaled, pero siempre puedes cargarlo como grises. Traería problemas solo si la imagen no está grayscaled de antemano y para su caso, creo que no funcionaría. Respuesta tan corta: no se puede guardar jpg como una imagen canalizada. Por lo tanto, necesitaría escalar en escala de grises de nuevo después de leer o descubrir una nueva forma para determinar si la imagen tiene escala de grises o no.


Su código es correcto, parece que cv2.imread carga una imagen con tres canales a menos que se establezca CV_LOAD_IMAGE_GRAYSCALE .

>>> import cv2 >>> image = cv2.imread(''foo.jpg'') >>> print image.shape (184, 300, 3) >>> gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) >>> print gray_image.shape (184, 300) >>> cv2.imwrite(''gray.jpg'', gray_image)

Ahora si cargas la imagen:

>>> image = cv2.imread(''gray.jpg'') >>> print image.shape (184, 300, 3)

Parece que ha guardado la imagen como BGR, sin embargo, no es verdad, solo es opencv, por defecto lee la imagen con 3 canales y, en el caso de que sea en escala de grises, copia su capa tres veces. Si vuelves a cargar la imagen con scipy, puedes ver que la imagen es en realidad escala de grises:

>>> from scipy.ndimage import imread >>> image2 = imread(''gray.jpg'') >>> print image2.shape (184, 300)

Por lo tanto, si desea cargar una imagen en escala de grises, deberá configurar el indicador CV_LOAD_IMAGE_GRAYSCALE :

>>> image = cv2.imread(''gray.jpg'', cv2.CV_LOAD_IMAGE_GRAYSCALE) >>> print image.shape (184, 300)


prueba esto:

img = cv2.imread(''gray.jpg'',0)

0 para gris y 1 para color