I am trying to generate a color histogram of an image. I am using PIL for reading image files and trying to plot the same through matplotlib.
im = Image.open(sys.argv[1])
w, h = im.size
colors = im.getcolors(w*h) #Returns a list [(pixel_count, (R, G, B))]
Update: After some trial and error this code plots the histogram, but not the colors! (Takes laboriously long consumes ton loads of memory even for a 320×480 jpeg)
for idx, c in enumerate(colors):
plt.bar(idx, c[0], color=hexencode(c[1]))
plt.show()
Where,
def hexencode(rgb):
return '#%02x%02x%02x' % rgb
On execution, the program begins to consume infinite memory and no display is provided. OS memory usage went from < 380 MB to > 2.5 GB in matter of couple of minutes; post which I terminated the execution. How can I get solve the problem?
Here is an example of a color histogram of image with dominant Red shades:
Best Answer
I tried your update code and it worked fine. Here is exactly what I am trying:
Update:
I think matplotlib is trying to put a black border around every bar. If there are too many bars, the bar is too thin to have color. If you have the toolbar, you can zoom in on the plot and see that the bars do indeed have color. So, if you set the edge color by:
It works!
Image to be processed:
Result:
Profiling
Sorted by tottime:
Sorted by Cumulative Time
It seems that all the time is spent in matplotlib. If you want to speed it up, you can either find a different plotting tool or reduce the number of 'bars'. Try doing it yourself with rectangle on a canvas.
Timing: