Blog
-Aprenderemos a encontrar y trazar histogramas 2D.
Introducción
En el primer artículo, calculamos y trazamos el histograma unidimensional. Se llama unidimensional porque solo tenemos en cuenta una característica, es decir, el valor de intensidad de escala de grises del píxel. Pero en los histogramas bidimensionales, se consideran dos características. Normalmente se usa para encontrar histogramas de color donde las dos características de interés son los valores de Matiz (H) y Saturación (S) de cada píxel. El matiz (o Hue en inglés) define el color mientras que la saturación indica cuanto gris hay en el color. Así, un valor de saturación de 0 indica un tono mayormente gris mientras que un valor de 255 indica un tono blanco.
En este artículo intentaremos comprender cómo crear dicho histograma de color, lo cual resultará útil para comprender otros temas, como los histogramas de retroproyección.
Histogramas 2D en OpenCV
channels = [0,1] porque necesitamos procesar el plano H y S.
bin = [180,256] 180 para el plano H y 256 para el plano S.
range = [0,180,0,256] El valor del tono se encuentra entre 0 y 180 y la saturación se encuentra entre 0 y 256.
import cv2 import numpy as np img = cv2.imread('ejemplo.jpg') hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) hist = cv2.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])
Histogramas 2D en Numpy
Numpy también posee una función específica para esto: np.histogram2d(). (Recuerde, para el histograma 1D usamos np.histogram()).
import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('ejemplo.jpg') hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) hist, xbins, ybins = np.histogram2d(h.ravel(),s.ravel(),[180,256],[[0,180],[0,256]])
El primer argumento es el plano H, el segundo es el plano S, el tercero es el número de bins para cada uno y el cuarto es su rango.
Ahora podemos verificar cómo trazar este histograma de color.
Graficando histogramas 2D
Método 1: Utilizando cv2.imshow()
El resultado que obtenemos en hist es una matriz bidimensional de tamaño 180×256. Para mostrarlo podemos, simplemente, utilizar la función cv2.imshow(). La imagen resultante estará en escala de grises y no dará mucha idea de qué colores hay, a menos que conozca los valores de H correspondientes a cada color.
Método 2: Utilizando Matplotlib
Podemos usar la función matplotlib.pyplot.imshow() para trazar un histograma 2D con diferentes mapas de colores. Este tipo de gráfico da una idea mucho mejor acerca de la diferencia en densidad de píxeles. No obstante, este método tampoco da idea de qué colores (a menos que conozcas qué valores de H corresponden a cada color) están presentes en la imagen. Aún así este método es preferible sobre el anterior, ya que es más simple.
Considere el siguiente código:
import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('ejemplo.jpg') hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) hist = cv2.calcHist( [hsv], [0, 1], None, [180, 256], [0, 180, 0, 256] ) plt.imshow(hist,interpolation = 'nearest') plt.show()
A continuación se muestra la imagen de entrada y su gráfico de histograma de color. El eje X muestra valores S y el eje Y muestra la Tonalidad, H.
En el histograma, se pueden ver algunos valores altos cerca de H = 100 y S = 200, que corresponden al azul del cielo. De manera similar, se puede ver otro pico cerca de H = 25 y S = 100, correspondientes con el amarillo del palacio. Puede verificarlo con cualquier herramienta de edición de imágenes como GIMP.
Si has llegado hasta aquí enhorabuena. Conviertete en un profesional de OpenCV
con nuestro curso Python de OpenCV:
Curso de Procesamiento de Imágenes y Visión Artificial
[…] ➡ Histogramas 2D […]