Programa OpenCV Python para analizar una imagen usando histograma

En este artículo, se analiza el análisis de imágenes utilizando Matplotlib y OpenCV. Primero comprendamos cómo experimentar datos de imágenes con varios estilos y cómo representarlos con histograma.
requisitos previos:

Importación de datos de imagen

import matplotlib.pyplot as plt #importing matplotlib

La imagen debe usarse en un archivo PNG, ya que matplotlib solo admite imágenes PNG. Aquí, es una imagen PNG RGB de 24 bits (8 bits para cada R, G, B) utilizada en este ejemplo. Cada lista interna representa un píxel. Aquí, con una imagen RGB, hay 3 valores. Para imágenes RGB, matplotlib admite tipos de datos float32 y uint8.

img = plt.imread('flower.png') #reads image data

c5
En Matplotlib, esto se realiza mediante la función imshow() . Aquí hemos agarrado el objeto de la trama.

Todo sobre Histograma

El histograma se considera un gráfico o trama que está relacionado con la frecuencia de los píxeles en una imagen en escala de grises
con valores de píxeles (que van de 0 a 255). La imagen en escala de grises es una imagen en la que el valor de cada píxel es una sola muestra, es decir, solo contiene información de intensidad donde el valor del píxel varía de 0 a 255. Las imágenes de este tipo, también conocidas como blanco y negro, están compuestas exclusivamente de tonos de gris, que varían desde el negro en la intensidad más débil hasta el blanco en la más fuerte, donde el píxel puede considerarse como cada punto de una imagen.
Cómo se ve la imagen en escala de grises: Cuantifica el número de píxeles para cada valor de intensidad considerado. Antes de pasar por Histograma, tengamos una idea aproximada de este ejemplo dado.
images

histogram_sample
Aquí, obtenemos intuición sobre el contraste, el brillo, la distribución de intensidad, etc. de esa imagen. Como podemos ver, la imagen y su histograma se dibujan para una imagen en escala de grises, no para una imagen en color.
La región izquierda del histograma muestra la cantidad de píxeles más oscuros en la imagen y la región derecha muestra la cantidad de píxeles más brillantes.

Creación de histograma usando array numpy

Para crear un histograma de nuestros datos de imagen, usamos la función hist().

plt.hist(n_img.ravel(), bins=256, range=(0.0, 1.0), fc='k', ec='k') #calculating histogram

c1
En nuestro histograma, parece que hay una distribución de intensidad en todos los píxeles de la imagen en blanco y negro como una imagen en escala de grises.

Del histograma, podemos concluir que la región oscura es más que una región brillante.

Ahora, trataremos con una imagen que consiste en una distribución de intensidad de píxeles donde el valor de píxel varía. Primero, necesitamos calcular el histograma usando la función incorporada de OpenCV.

Cálculo de histograma

Aquí, usamos cv2.calcHist() (función incorporada en OpenCV) para encontrar el histograma.

cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])

images : es la imagen fuente de tipo uint8 o float32 representada como “[img]”.
canales: es el índice de canal para el que calculamos el histograma. Para la imagen en escala de grises, su valor es [0] y
la imagen en color, puede pasar [0], [1] o [2] para calcular el histograma del canal azul, verde o rojo, respectivamente.
máscara : imagen de máscara. Para encontrar el histograma de la imagen completa, se da como «Ninguno».
histSize: esto representa nuestro conteo de BIN. Para escala completa, pasamos [256].
Gamas : esta es nuestra GAMA. Normalmente, es [0,256].

Por ejemplo:

# load an image in grayscale mode
img = cv2.imread('ex.jpg',0)
  
# calculate frequency of pixels in range 0-255
histg = cv2.calcHist([img],[0],None,[256],[0,256]) 

Luego, necesitamos trazar un histograma para mostrar las características de una imagen.

Trazado de histogramas

Análisis usando Matplotlib:

# importing required libraries of opencv
import cv2
  
# importing library for plotting
from matplotlib import pyplot as plt
  
# reads an input image
img = cv2.imread('ex.jpg',0)
  
# find frequency of pixels in range 0-255
histr = cv2.calcHist([img],[0],None,[256],[0,256])
  
# show the plotting graph of an image
plt.plot(histr)
plt.show()

Entrada: Salida: La ilustración muestra que cada número de píxeles de una imagen se encuentra en un rango de 0 a 255. En el segundo ejemplo, encuentra directamente el histograma y lo traza. No necesitamos usar calcHist(). Vea el código a continuación:
nature2
nature3
nature4

n2
n3
n4

import cv2
from matplotlib import pyplot as plt
img = cv2.imread('ex.jpg',0)
  
# alternative way to find histogram of an image
plt.hist(img.ravel(),256,[0,256])
plt.show()

Producción:
f1

Por lo tanto, concluimos que la imagen se puede representar como un histograma para concebir la idea de distribución de intensidad sobre una imagen y promover su tranquilidad.

Referencias:

  • http://docs.opencv.org/2.4/doc/tutorials/imgproc/table_of_content_imgproc/table_of_content_imgproc.html#table-of-content-imgproc
  • http://www.cambridgeincolour.com/tutorials/histograms1.htm

Este artículo es una contribución de Afzal Ansari . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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