42

対数正規化された画像をプロットするために matplotlib を使用していますが、元の生の画像データを [0-1] 間隔ではなくカラーバーで表現したいと考えています。ある種の正規化オブジェクトを使用し、事前にデータを変換しないことで、これを行うより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)

私は cb.set_array を使用してみましたが、それは何もしていないようで、cb.set_clim は色を完全に再スケーリングします。

4

2 に答える 2

61

はいあります!を使用しLogNormます。これは、混同行列を対数スケールで表示するために作成したユーティリティからのコードの抜粋です。

from pylab import figure, cm
from matplotlib.colors import LogNorm

# C = some matrix
f = figure(figsize=(6.2, 5.6))
ax = f.add_axes([0.17, 0.02, 0.72, 0.79])
axcolor = f.add_axes([0.90, 0.02, 0.03, 0.79])

im = ax.matshow(C, cmap=cm.gray_r, norm=LogNorm(vmin=0.01, vmax=1))

t = [0.01, 0.1, 0.2, 0.4, 0.6, 0.8, 1.0]
f.colorbar(im, cax=axcolor, ticks=t, format="$%.2f$")

f.show()
于 2010-03-30T15:52:12.300 に答える
7

画像を (詳細を強調するために) 対数正規化するだけで、データを (物理的な値を保持するために) 正規化しない場合は、カラーマップ自体に変換を適用する必要があります。クックブックで指定された関数 cmap_map() でそれを行うことができます: https://scipy-cookbook.readthedocs.io/items/Matplotlib_ColormapTransformations.html

于 2011-08-31T20:04:29.083 に答える