Saltar al contenido

Trazar el histograma de color de la imagen usando matplotlib

Esta es el arreglo más exacta que encomtrarás compartir, sin embargo estúdiala pausadamente y valora si se adapta a tu proyecto.

Solución:

Probé tu código de actualización y funcionó bien. Esto es exactamente lo que estoy intentando:

import PIL
from PIL import Image
from matplotlib import pyplot as plt

im = Image.open('./color_gradient.png')  
w, h = im.size  
colors = im.getcolors(w*h)

def hexencode(rgb):
    r=rgb[0]
    g=rgb[1]
    b=rgb[2]
    return '#%02x%02x%02x' % (r,g,b)

for idx, c in enumerate(colors):
    plt.bar(idx, c[0], color=hexencode(c[1]))

plt.show()

Actualizar:

Creo que matplotlib está tratando de poner un borde negro alrededor de cada barra. Si hay demasiadas barras, la barra es demasiado delgada para tener color. Si tiene la barra de herramientas, puede acercar el gráfico y ver que las barras sí tienen color. Entonces, si establece el color del borde por:

for idx, c in enumerate(colors):
     plt.bar(idx, c[0], color=hexencode(c[1]),edgecolor=hexencode(c[1]))

¡Funciona!

Imagen a procesar:
ingrese la descripción de la imagen aquí

Resultado:
ingrese la descripción de la imagen aquí

perfilado
Ordenado por tottime:

    ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1   23.424   23.424   24.672   24.672 built-in method mainloop
   460645    8.626    0.000    8.626    0.000 numpy.core.multiarray.array
    22941    7.909    0.000   18.447    0.001 C:Python27libsite-packagesmatplotlibartist.py:805(get_aliases)
  6814123    3.900    0.000    3.900    0.000 method 'startswith' of 'str' objects
    22941    2.244    0.000    2.244    0.000 dir
   276714    2.140    0.000    2.140    0.000 C:Python27libweakref.py:243(__init__)
  4336835    2.029    0.000    2.029    0.000 getattr
  1927044    1.962    0.000    3.027    0.000 C:Python27libsite-packagesmatplotlibartist.py:886(is_alias)
   114811    1.852    0.000    3.883    0.000 C:Python27libsite-packagesmatplotlibcolors.py:317(to_rgba)
    69559    1.653    0.000    2.841    0.000 C:Python27libsite-packagesmatplotlibpath.py:86(__init__)
    68869    1.425    0.000   11.700    0.000 C:Python27libsite-packagesmatplotlibpatches.py:533(_update_patch_transform)
   161205    1.316    0.000    1.618    0.000 C:Python27libsite-packagesmatplotlibcbook.py:381(is_string_like)
        1    1.232    1.232    1.232    1.232 gc.collect
   344698    1.116    0.000    1.513    0.000 C:Python27libsite-packagesmatplotlibcbook.py:372(iterable)
    22947    1.111    0.000    3.768    0.000 built-in method draw_path
   276692    1.024    0.000    3.164    0.000 C:Python27libsite-packagesmatplotlibtransforms.py:80(__init__)
        2    1.021    0.510    1.801    0.900 C:Python27libsite-packagesmatplotlibcolors.py:355(to_rgba_array)
    22947    0.818    0.000   14.677    0.001 C:Python27libsite-packagesmatplotlibpatches.py:371(draw)
183546/183539    0.793    0.000    2.030    0.000 C:Python27libsite-packagesmatplotlibunits.py:117(get_converter)
   138006    0.756    0.000    1.267    0.000 C:Python27libsite-packagesmatplotlibtransforms.py:126(set_children)

Ordenado por tiempo acumulativo

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.001    0.001   84.923   84.923 C:Python27test.py:23(imageProcess)
        1    0.013    0.013   44.079   44.079 C:Python27libsite-packagesmatplotlibpyplot.py:2080(bar)
        1    0.286    0.286   43.825   43.825 C:Python27libsite-packagesmatplotlibaxes.py:4556(bar)
        1    0.000    0.000   40.533   40.533 C:Python27libsite-packagesmatplotlibpyplot.py:123(show)
        1    0.000    0.000   40.533   40.533 C:Python27libsite-packagesmatplotlibbackend_bases.py:69(__call__)
    22943    0.171    0.000   24.964    0.001 C:Python27libsite-packagesmatplotlibpatches.py:508(__init__)
        1    0.000    0.000   24.672   24.672 C:Python27libsite-packagesmatplotlibbackendsbackend_tkagg.py:68(mainloop)
        1    0.000    0.000   24.672   24.672 C:Python27liblib-tkTkinter.py:323(mainloop)
        1   23.424   23.424   24.672   24.672 built-in method mainloop
    22947    0.499    0.000   24.654    0.001 C:Python27libsite-packagesmatplotlibpatches.py:55(__init__)
    22941    0.492    0.000   20.180    0.001 C:Python27libsite-packagesmatplotlibartist.py:1136(setp)
    22941    0.135    0.000   18.730    0.001 C:Python27libsite-packagesmatplotlibartist.py:788(__init__)
    22941    7.909    0.000   18.447    0.001 C:Python27libsite-packagesmatplotlibartist.py:805(get_aliases)
    72/65    0.071    0.001   17.118    0.263 built-in method call
    24/12    0.000    0.000   17.095    1.425 C:Python27liblib-tkTkinter.py:1405(__call__)
    22941    0.188    0.000   16.647    0.001 C:Python27libsite-packagesmatplotlibaxes.py:1476(add_patch)
        1    0.000    0.000   15.861   15.861 C:Python27libsite-packagesmatplotlibbackendsbackend_tkagg.py:429(show)
        1    0.000    0.000   15.861   15.861 C:Python27liblib-tkTkinter.py:909(update)
        1    0.000    0.000   15.846   15.846 C:Python27libsite-packagesmatplotlibbackendsbackend_tkagg.py:219(resize)
        1    0.000    0.000   15.503   15.503 C:Python27libsite-packagesmatplotlibbackendsbackend_tkagg.py:238(draw)

Parece que todo el tiempo se gasta en matplotlib. Si desea acelerarlo, puede encontrar una herramienta de trazado diferente o reducir el número de ‘barras’. Intente hacerlo usted mismo con un rectángulo en un lienzo.

Sincronización:

  1. Código publicado arriba: 75s
  2. Dibujar una línea para cada uno, es decir, plt.plot([n,n],[0,count],etc..): 95s

He estado trabajando en un problema similar y encontré este hilo, 5 años tarde. Para imágenes más grandes, la respuesta aceptada tomaba demasiado tiempo para simplemente “generar un histograma de color de una imagen”.

Usé openCV en lugar de PIL para generar los histogramas y es mucho más rápido.

import cv2
import numpy as np
from matplotlib import pyplot as plt

file0 = 'image.jpg'
img = cv2.imread(file0)
color = ('b','g','r')
plt.figure()
for i,col in enumerate(color):
    histr = cv2.calcHist([img],[i],None,[256],[0,256])
    plt.plot(histr,color = col)
    plt.xlim([0,256])
plt.show()

ingrese la descripción de la imagen aquí

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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