Нелинейное масштабирование цветовой карты для увеличения контрастности

Следующий код python создает тепловую карту матрицы, которая содержит нормально распределенные значения

import numpy as np
from matplotlib import pylab as plt


np.random.seed(123) #make sure we all have same data
m = np.random.randn(200).reshape(10, 20)
plt.imshow(m, cmap='RdYlGn', interpolation='nearest')
plt.colorbar()

Это результат этого code

example 1

Я хотел бы увеличить контраст этого изображения, «убавляя» значения, близкие к нулю. Я могу легко сделать это, используя дисигмоидное масштабирование исходных данных следующим образом:

def disigmoidScaling(values, steepnessFactor=1, ref=None):
    ''' Sigmoid scaling in which values around a reference point are flattened
    arround a reference point

    Scaled value y is calculated as 
        y = sign(v - d)(1 - exp(-((x - d)/s)**2)))
    where v is the original value,  d is the referenc point and s is the 
    steepness factor
    '''
    if ref is None:
        mn = np.min(values)
        mx = np.max(values)
        ref = mn + (mx - mn) / 2.0

    sgn = np.sign(values - ref)
    term1 = ((values - ref)/steepnessFactor) ** 2
    term2 = np.exp(- term1) 
    term3 = 1.0 - term2 
    return sgn * term3


plt.imshow(disigmoidScaling(m, 4), cmap='RdYlGn', interpolation='nearest')
plt.colorbar()

Вот результат.

example 2

Результатом доволен, кроме того, что в этой версии оригинал значения заменены на масштабированные.

Есть ли способ выполнить нелинейное отображение значений в цветовую карту?

8
задан Boris Gorelik 7 April 2012 в 17:54
поделиться