Histograma Trazado y estiramiento en Python (sin usar la función incorporada)

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:

food1

# 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:

python-histogram-strecthed-image

python-stretched-image-opencv

Publicación traducida automáticamente

Artículo escrito por AmiMunshi 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 *