代码之家  ›  专栏  ›  技术社区  ›  randomal

将原始数据保存为tif

  •  7
  • randomal  · 技术社区  · 11 年前

    我需要在tif文件中分析图像的一部分,该部分被选为子矩阵。我想要原始格式的图像,没有任何修饰(缩放、轴、标签等)。。。我怎么能这么做?

    这是我现在使用的代码:

     submatrix = im[x_min:x_max, y_min:y_max]
     plt.imshow(submatrix)
     plt.savefig("subplot_%03i_%03i.tif" % (index, peak_number), format = "tif")
    
    1 回复  |  直到 11 年前
        1
  •  9
  •   Joe Kington    11 年前

    首先,如果您只想存储原始值或原始值的灰度表示,那么最简单的方法是使用PIL。

    例如,这将生成一个10x10灰度tif文件:

    import numpy as np
    import Image
    
    data = np.random.randint(0, 255, (10,10)).astype(np.uint8)
    im = Image.fromarray(data)
    im.save('test.tif')
    

    至于你为什么matplotlib版本有更多像素的问题,那是因为你含蓄地告诉了它。matplotlib图形有一个尺寸(以英寸为单位)和dpi(默认情况下,屏幕上为80,保存时为100)。此外,默认情况下 imshow 将对数组中的值进行插值,即使将插值设置为最接近,保存的图像仍将是您为图形指定的大小。

    如果您想使用matplotlib将图形保存为一个值到一个像素(例如,为了方便使用颜色映射),请执行类似的操作:

    import numpy as np
    import matplotlib.pyplot as plt
    
    dpi = 80 # Arbitrary. The number of pixels in the image will always be identical
    data = np.random.random((10, 10))
    
    height, width = np.array(data.shape, dtype=float) / dpi
    
    fig = plt.figure(figsize=(width, height), dpi=dpi)
    ax = fig.add_axes([0, 0, 1, 1])
    ax.axis('off')
    
    ax.imshow(data, interpolation='none')
    fig.savefig('test.tif', dpi=dpi)