Używam matplotlib do drukowania obrazów normalizowanych z logowaniem, ale chciałbym, aby pierwotne dane obrazu surowego były reprezentowane na kolorowym pasku odstęp [0-1]. Mam wrażenie, że jest to bardziej matematyczny sposób robienia tego poprzez użycie jakiegoś obiektu normalizacji i nie przekształcanie danych wcześniej ... w każdym razie na surowym obrazie mogą występować wartości ujemne.W jaki sposób można narysować znormalizowany wykres imshow z kolorowym paskiem reprezentującym surowe dane w matplotlib
import matplotlib.pyplot as plt
import numpy as np
def log_transform(im):
'''returns log(image) scaled to the interval [0,1]'''
try:
(min, max) = (im[im > 0].min(), im.max())
if (max > min) and (max > 0):
return (np.log(im.clip(min, max)) - np.log(min))/(np.log(max) - np.log(min))
except:
pass
return im
a = np.ones((100,100))
for i in range(100): a[i] = i
f = plt.figure()
ax = f.add_subplot(111)
res = ax.imshow(log_transform(a))
# the colorbar drawn shows [0-1], but I want to see [0-99]
cb = f.colorbar(res)
Próbowałem za pomocą cb.set_array, ale to nie wydaje się robić nic, a cb.set_clim, ale to przeskalowanie kolory całkowicie.
Więc widocznie mogę przekazać instancję normalizacji w imshow i obraz zostanie znormalizowane dla mnie: res = ax.imshow (im, norma = mpl.colors.LogNorm()) Mimo to, jeśli dołączę pasek kolorów, wartości zostaną ustawione na znormalizowane vals zamiast na surowe dane. –