web-dev-qa-db-fra.com

Carte thermique en haut de l'image

J'ai des images d'objets différents (Pascal Voc) et j'ai une carte de probabilité. Je veux le visualiser en traçant l'image et en quelque sorte la carte thermique au-dessus. Quelle serait la meilleure façon de procéder?

Je pensais utiliser le canal alpha comme ceci:

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

Comment personnaliser la barre de couleurs de min (heatmap) à max (heatmap)? Ou existe-t-il une meilleure façon de visualiser les probabilités?

10
TobSta

Vous pouvez empiler des images et des tracés avec matplotlib, puis choisir la poignée à utiliser pour la barre de couleurs. En utilisant contourf, les valeurs min et max de la barre de couleurs seront basées sur votre heatmap (ou vous pouvez passer vmin=min(heatmap) et vmax=max(heatmap) à contourf pour être explicite sur cette plage). Le problème est que la carte thermique couvrira votre image (et la définition de la transparence rendra le tout transparent). La meilleure option consiste à créer une palette de couleurs transparente lorsqu'elle est proche de zéro, comme suit,

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

qui donne,

enter image description here

14
Ed Smith