Uso de histogramas con OpenCV en Python 3.6.8

Iniciado por Andr0z, Abril 11, 2020, 10:57:15 PM

Tema anterior - Siguiente tema

0 Miembros y 2 Visitantes están viendo este tema.

Abril 11, 2020, 10:57:15 PM Ultima modificación: Abril 12, 2020, 05:22:16 PM por Andr0z
OpenCV es una de las bibliotecas más famosas de visión artificial que se ha utilizado en gran cantidad de aplicaciones, por mencionar algunas de ellas:

-Reconocimiento facial
-Robótica móvil
-Reconocimiento de objetos
-Segmentación
-Interacción persona-computadora

Entre otras muchas mas aplicaciones.

En está ocasión el tema se tratará acerca del uso de histogramas para la visualización de la descomposición de color de una imagen de 8 bits a sus canales BGR o RGB.

Primero importaremos las respectivas librerías que se utilizaran para la aplicación

Código: python

import cv2 #importamos OpenCV
import numpy as np
from matplotlib import pyplot as plt
 

Una vez importadas las librerías correspondientes procedemos a usar la función imread() para cargar una imagen, el código sería:

Código: python

imagen=cv2.imread(r"interior.png")
 

Luego se separa con la función split  la matriz de vectores de nuestro elemento:

Código: python

b,g,r=cv2.split(imagen)


Y se visualizan los canales B,G,R y la imagen original con la función imshow:

Código: python

cv2.imshow("imagen", imagen)
cv2.imshow("b", b)
cv2.imshow("g", g)
cv2.imshow("r", r)


Nota:Las imágenes se mostrarán en escala de grises debido a que los vectores (B,G,R) se separan en escalares (por pixel), por tanto el sistema los considera como negro (valor cero) o blanco(valor 255), lo que quiere decir que si por ejemplo en la imagen "b" se encuentra con una tonalidad mas blanca en algún conjunto de pixeles, dará a entender que el canal RGB esta compuesto por ese color en mayor parte, es decir el color del pixel original  se vería como (230,G,R)

Finalmente, para graficar los histogramas se llama la función hist de pyplot:

Código: python

plt.hist(b.ravel(),256,[0,256])
plt.hist(g.ravel(),256,[0,256])
plt.hist(r.ravel(),256,[0,256])
plt.show()


Los histogramas nos mostrarán el numero de pixeles que hay correspondientes a los valores de  0 a 255 por cada canal. El código completo sería:

Código: python

import cv2 #importamos OpenCV
import numpy as np
from matplotlib import pyplot as plt
#lectura de la imagen
imagen=cv2.imread(r"interior.png")

# generacion de los canales blue, green y red (bgr) mediante la descoposicion de la imagen original con la funcion split
b,g,r=cv2.split(imagen)
#print(image)
#print(image[0][0])
# mostrar las imagenes repsectivas a la imagen y los canales
cv2.imshow("imagen", imagen)
cv2.imshow("b", b)
cv2.imshow("g", g)
cv2.imshow("r", r)

# graficar histogramas
plt.hist(b.ravel(),256,[0,256])
plt.hist(g.ravel(),256,[0,256])
plt.hist(r.ravel(),256,[0,256])
plt.show()

# esperar a  presionar alguna tecla para continuar
cv2.waitKey(0)

# destruye todas las ventanas en proceso
cv2.destroyAllWindows()


Si corremos nuestro código se vería como sigue: