さまざまなオブジェクト(Pascal Voc)の画像と確率ヒートマップがあります。画像をプロットし、その上にヒートマップを何とかして視覚化したいと思います。それを行う最良の方法は何でしょうか?
私はこのようなアルファチャンネルを使うことを考えていました:
im_heat = np.zeros((image.shape[0],image.shape[1],4))
im_heat[:,:,:3] = image
im_heat[:,:,3] = np.rint(255/heatmap)
plt.imshow(im_heat, cmap='jet')
plt.colorbar()
カラーバーをmin(heatmap)からmax(heatmap)にカスタマイズするにはどうすればよいですか?または、確率を視覚化するためのより良い方法はありますか?
画像とプロットをmatplotlibでスタックし、カラーバーに使用するハンドルを選択できます。 contourf
を使用すると、カラーバーの最小値と最大値はヒートマップに基づきます(または、vmin=min(heatmap)
とvmax=max(heatmap)
をcontourfに渡して、この範囲を明示することができます)。これの問題は、ヒートマップが画像を覆うことです(そして透明度を設定すると、全体が透明になります)。次のように、ゼロに近い場合に透明になるカラーマップを作成することをお勧めします。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import Image
#2D Gaussian function
def twoD_Gaussian((x, y), xo, yo, sigma_x, sigma_y):
a = 1./(2*sigma_x**2) + 1./(2*sigma_y**2)
c = 1./(2*sigma_x**2) + 1./(2*sigma_y**2)
g = np.exp( - (a*((x-xo)**2) + c*((y-yo)**2)))
return g.ravel()
def transparent_cmap(cmap, N=255):
"Copy colormap and set alpha values"
mycmap = cmap
mycmap._init()
mycmap._lut[:,-1] = np.linspace(0, 0.8, N+4)
return mycmap
#Use base cmap to create transparent
mycmap = transparent_cmap(plt.cm.Reds)
# Import image and get x and y extents
I = Image.open('./deerback.jpg')
p = np.asarray(I).astype('float')
w, h = I.size
y, x = np.mgrid[0:h, 0:w]
#Plot image and overlay colormap
fig, ax = plt.subplots(1, 1)
ax.imshow(I)
Gauss = twoD_Gaussian((x, y), .5*x.max(), .4*y.max(), .1*x.max(), .1*y.max())
cb = ax.contourf(x, y, Gauss.reshape(x.shape[0], y.shape[1]), 15, cmap=mycmap)
plt.colorbar(cb)
plt.show()
与える、