Prerrequisitos: Programa OpenCV Python para analizar una imagen usando Histogram
El histograma de una imagen digital con niveles de intensidad en el rango de 0 a L-1 es una función discreta:
h(rk) = nk where rk = kth intensity value and no = number of pixels in the image with rk intensity value.
Si la imagen tiene M filas y N columnas, entonces el número total de píxeles de la imagen es MN. El histograma normalizado se obtiene de la siguiente manera:
p(rk) = nk/MN
A veces, si la imagen es oscura, clara o de bajo contraste, es posible que el histograma de esa imagen no tenga píxeles con intensidad mínima (0) o intensidad máxima (255) o ambos respectivamente. En tales casos, el histograma de esa imagen se puede estirar aplicando la siguiente transformación.
Let a= maximum intensity level in the image Let b= minimum intensity level in the image Let rk= pixel value in the original image Let sk= pixel value in the stretched image constant= (255-0)/(a-b) Then sk= constant*rk
Algoritmo para el trazado de histogramas
- Lee la imagen
- Obtener el tamaño de la imagen. Sean m=filas y n=columnas
- Para todos los niveles de intensidad rk= 0 a 255
- Recorrer todas las filas ‘m’ y columnas ‘n’
- Cuente el número de píxeles para cada nivel de intensidad
- Trace el gráfico de los valores de intensidad frente al número de píxeles en cada valor de intensidad
Algoritmo para estirar el Histograma
- Encuentre el valor de intensidad mínima en la imagen, diga ‘a’ y el valor de intensidad máxima, diga ‘b’
- obtener una constante c= (255-0)/(ab)
- Multiplique esta constante con cada píxel de la imagen para obtener el estiramiento del histograma.
Observaciones
Se observa que la imagen de entrada oscura mejora después del estiramiento de contraste.
A continuación se muestra la implementación.
Imagen de entrada:
# import cv2, numpy, matplotlib import cv2 import numpy as np import matplotlib.pyplot as plt # function to obtain histogram of an image def hist_plot(img): # empty list to store the count # of each intensity value count =[] # empty list to store intensity # value r = [] # loop to traverse each intensity # value for k in range(0, 256): r.append(k) count1 = 0 # loops to traverse each pixel in # the image for i in range(m): for j in range(n): if img[i, j]== k: count1+= 1 count.append(count1) return (r, count) img = cv2.imread('food.jpeg', 0) # To ascertain total numbers of rows and # columns of the image, size of the image m, n = img.shape r1, count1 = hist_plot(img) # plotting the histogram plt.stem(r1, count1) plt.xlabel('intensity value') plt.ylabel('number of pixels') plt.title('Histogram of the original image') # Transformation to obtain stretching constant = (255-0)/(img.max()-img.min()) img_stretch = img * constant r, count = hist_plot(img_stretch) # plotting the histogram plt.stem(r, count) plt.xlabel('intensity value') plt.ylabel('number of pixels') plt.title('Histogram of the stretched image') # Storing stretched Image cv2.imwrite('Stretched Image 4.png', img_stretch)
Producción: