Cómo hacer ecualización de histograma para múltiples en escala de grises de las imágenes almacenadas en una Colección de matriz fácilmente?

Tengo el 96×96 píxeles NumPy de datos en este formato 4D:

(1800, 1, 96,96)
Ayuda esto a: janeriksolem.net/2009/06/… ?
Gracias a los alces. Que ayuda, por supuesto con PIL. Hay puro numpy solución?? como no podría ser más rápido de lo que estoy haciendo para 10.000 imágenes. PIL y Skimage por lo general toma un largo tiempo.
PIL sólo es necesario para la lectura de los datos de la imagen en el ejemplo. Ya que tienes los datos ya no la necesita, sólo NumPy. Ver el código que he escrito en el anser. También muchas gracias a moose para la vinculación de la solución!

OriginalEl autor pbu | 2015-02-14

3 Comentarios

  1. 12

    Moose comentario que apunta a este entrada de blog hace el trabajo bastante bien.

    Para la integridad doy un axample aquí usando mejor los nombres de las variables y un bucle de ejecución en 1000 96×96 imágenes en 4D matriz como en la pregunta. Es rápido (1-2 segundos en mi equipo) y sólo necesita NumPy.

    import numpy as np
    
    def image_histogram_equalization(image, number_bins=256):
        # from http://www.janeriksolem.net/2009/06/histogram-equalization-with-python-and.html
    
        # get image histogram
        image_histogram, bins = np.histogram(image.flatten(), number_bins, density=True)
        cdf = image_histogram.cumsum() # cumulative distribution function
        cdf = 255 * cdf / cdf[-1] # normalize
    
        # use linear interpolation of cdf to find new pixel values
        image_equalized = np.interp(image.flatten(), bins[:-1], cdf)
    
        return image_equalized.reshape(image.shape), cdf
    
    if __name__ == '__main__':
    
        # generate some test data with shape 1000, 1, 96, 96
        data = np.random.rand(1000, 1, 96, 96)
    
        # loop over them
        data_equalized = np.zeros(data.shape)
        for i in range(data.shape[0]):
            image = data[i, 0, :, :]
            data_equalized[i, 0, :, :] = image_histogram_equalization(image)[0]
    Para aquellos que se preguntan, normalizado-histograma de una imagen que es el histograma de la imagen dividida por el número total de píxeles en la imagen, puede ser pensado como la función de densidad de probabilidad de cada nivel de gris, y eso es exactamente lo que density=True. así que aquí image_histogram es realmente la normalizado-histograma.

    OriginalEl autor Trilarion

  2. 2

    Muy fácil y rápido es utilizar la función de distribución acumulativa proporcionados por el skimage módulo. Básicamente lo que haces matemáticamente para la prueba.

    from skimage import exposure
    import numpy as np
    def histogram_equalize(img):
        img = rgb2gray(img)
        img_cdf, bin_centers = exposure.cumulative_distribution(img)
        return np.interp(img, bin_centers, img_cdf)
    Esto fue útil para mí. Devuelve un float 0-1 matriz en la cual se puede aplicar como mascarilla.

    OriginalEl autor Dodo

  3. 0

    A partir de hoy janeriksolem‘s dirección url está roto.

    He encontrado sin embargo esta esencia que los enlaces de la página y reclamaciones para realizar la ecualización de histograma sin calcular el histograma.

    El código es:

    img_eq = np.sort(img.ravel()).searchsorted(img)
    Este enfoque es ~3 veces más lento que el histograma de enfoque.

    OriginalEl autor Diego Ferri

Dejar respuesta

Please enter your comment!
Please enter your name here