Bus errorとSegmentation faultに困ったら見るブログ

物理の研究者による日々の研究生活のメモ書きです ( python/emacs/html/Japascript/シェルスクリプト/TeX/Mac/C言語/Linux/git/tmux/R/ポケモンGO)

【numpy, matplotlib】画像データから1次元のヒストグラムをプロットし、元の画像と並べて表示したい

img = cv2.imread(fname, cv2.IMREAD_UNCHANGED)
height, width = img.shape

hist_data = img.flatten()

 

fig = plt.figure(figsize = (20, 10))

 

ax1 = fig.add_subplot(1, 2, 1)     
ax1.imshow(img, 'gray')
ax1.set_xticks()
ax1.set_yticks(
) # to hide tick values on X and Y axis        

 

ax2 = fig.add_subplot(1, 2, 2) 
ax2.hist(hist_data, bins=50)
ax2.set_xlim(0, 500)
ax2.set_title("%s" % fname)
ax2.set_xlabel("Count")
ax2.set_ylabel("Histogram")
ax2.set_yscale('log')    

 

plt.savefig("hist_%s" % fname)
plt.close()     

 

fnameがファイル名

 

2次元の配列を flattenで1次元に変換する

他にもravel()というのでも可能らしいが、そちらは不可逆で元のarrayの中身をそのまま書き換えてしまう

[NumPy基礎] 1次元配列 ⇔ 多次元配列 #Python - Qiita

 

2枚の画像を並べて表示する

左は元の画像データ(白黒で表示してる)

右がヒストグラム

 

表示する範囲を変えたい時は、ax2.set_xlim(0, 500)をいじる

logスケールをやめたかったら ax2.set_yscale('log')  をコメントアウト