いろいろなスケールの画像データを Matplotlib で描画する

Matplotlib は画像データがどのような範囲をしめていようが、それなりに描画をしてくれます。下記のコードでそれが確認できます。

data0 は 0 ~ +255
data1 は 0.0 ~ +1.0
data2 は -0.5 ~ +0.5
data3 は -1.0 ~ +1.0

のデータ範囲です。

import numpy as np
import matplotlib.pyplot as plt

w =  512
h = 1024
numpix = w * h

# ubyte な1次元配列を確保する.
data0 = np.zeros( numpix, dtype=np.uint8)

# ななめウロコデータを格納する.
for j in range( h ):
    adrs = w * j
    for i in range( w ):
        level = i + j
        data0[ adrs ] = level
        adrs += 1
        
# 最小値と最大値を取得する( 0 ~ 255).
value_min = np.min( data0 )
value_max = np.max( data0 )
print( "data0 min is {0:+}".format( value_min ) )
print( "data0 max is {0:+}".format( value_max ) )
print( "" )

# 0 ~ 1.0 にする.
data1 = data0 / 255.0
value_min = np.min( data1 )
value_max = np.max( data1 )
print( "data1 min is {0:+}".format( value_min ) )
print( "data1 max is {0:+}".format( value_max ) )
print( "" )

# -0.5 ~ +0.5 にする.
data2 = data1 - 0.5
value_min = np.min( data2 )
value_max = np.max( data2 )
print( "data2 min is {0:+}".format( value_min ) )
print( "data2 max is {0:+}".format( value_max ) )
print( "" )

# -1.0 ~ +1.0 にする.
data3 = (( data1 * 2.0 ) - 1.0 )
value_min = np.min( data3 )
value_max = np.max( data3 )
print( "data3 min is {0:+}".format( value_min ) )
print( "data3 max is {0:+}".format( value_max ) )
print( "" )

# 2次元配列に変換する、w と h の順に注目せよ.
data0_2d = data0.reshape( h, w )
data1_2d = data1.reshape( h, w )
data2_2d = data2.reshape( h, w )
data3_2d = data3.reshape( h, w )

# データを管理するリストを作成する.
list_data = []
list_data.append( data0_2d )
list_data.append( data1_2d )
list_data.append( data2_2d )
list_data.append( data3_2d )

# 書き込み要素を取得する.
fig = plt.figure()

# タイルの縦横の個数.
TILE_NUM_ROW = 1
TILE_NUM_COL = 4

# リストの要素回数だけループする.
plot_counter = 1
for data in list_data:
    ax = fig.add_subplot( TILE_NUM_ROW, TILE_NUM_COL, plot_counter )
    ax.set_title( "{0}".format( plot_counter ))
    ax.axis( "off" )
    plt.imshow( data, cmap="gray" )
    plot_counter += 1
    
plt.show()

print( "finish." )

下記が実行結果です。

PS C:\tmp> python test.py
data0 min is +0
data0 max is +255

data1 min is +0.0
data1 max is +1.0

data2 min is -0.5
data2 max is +0.5

data3 min is -1.0
data3 max is +1.0

Matplotlib は、データのスケールが違っていてもほとんど同じく描画をします。