2017-02-27 11 views
4

私は異なるオブジェクト(パスカル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() 

私は最大(ヒートマップ)に分(ヒートマップ)からなるようにカラーバーをカスタマイズする方法を教えてください。 確率を視覚化するためのより良い方法はありますか?

答えて

5

matplotlibで画像とプロットを積み重ねてから、カラーバーに使用するハンドルを選択することができます。 contourfを使用すると、カラーバーの最小値と最大値がヒートマップに基づいて計算されます(または、contourfにvmin=min(heatmap)vmax=max(heatmap)を明示的に渡すことができます)。これの問題は、ヒートマップが画像をカバーすることです(透明度を設定すると全体が透明になります)。最良のオプションは、次のように、与える、ゼロに近い透明なカラーマップを作るために

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() 

ある

enter image description here

関連する問題