Проблема построения гистограммы изображения в градациях серого в питоне - PullRequest
0 голосов
/ 06 января 2019

Я построил гистограмму

изображения в оттенках серого

с матплотлибом. Но гистограмма не похожа на то, что я хочу.

from matplotlib import pyplot as plt 
import numpy as np
from PIL import Image
im=Image.open("lena.pgm")
pxl=list(im.getdata())
print pxl
columnsize,rowsize=im.size

a = np.array(pxl)
plt.hist(a, bins = 255)
plt.title("histogram") 
plt.show()

Я хочу такую ​​гистограмму, как

1 Ответ

0 голосов
/ 06 января 2019

Пробелы в гистограмме обусловлены неправильным выбором размера ячейки. Если вы вызовете hist(..., bins=255), numpy создаст 256 бинов от минимального значения до максимального значения вашего массива. Другими словами, ячейки будут иметь нецелую ширину (в моих тестах: [ 24. , 24.86666667, 25.73333333, 26.6 , ....]).

Поскольку вы имеете дело с изображением с 255 уровнями, вы должны создать 255 ячеек шириной 1:

plt.hist(a, bins=range(256))

Мы должны написать 256, потому что нам нужно включить самый правый край бинов, иначе точки со значением 255 не будут включены.

Что касается цвета, следуйте примерам в вопросе в комментариях

from PIL import Image
im=Image.open("lena.pgm")
a = np.array(im.getdata())

fig, ax = plt.subplots(figsize=(10,4))
n,bins,patches = ax.hist(a, bins=range(256), edgecolor='none')
ax.set_title("histogram")
ax.set_xlim(0,255)


cm = plt.cm.get_cmap('cool')
norm = matplotlib.colors.Normalize(vmin=bins.min(), vmax=bins.max())
for b,p in zip(bins,patches):
    p.set_facecolor(cm(norm(b)))
plt.show()

enter image description here

...