将原始数据保存为tif格式。

7
我需要分析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")

我猜测 plt 是指 matplotlib.pyplot - Janne Karila
1
这里可能有一些有用的东西:[https://dev59.com/tGsy5IYBdhLWcg3w8CfJ] - Matthew Wesly
可能是Matplotlib绘图:去除轴、图例和空白的重复问题。 - Janne Karila
谢谢Matthew,它有效了。有人知道为什么像素比预期的多得多吗?我想在[x_min:x_max, y_min:y_max]范围内每个值只有一个像素。 - albus_c
1个回答

9

首先,如果你只是想存储原始值或原始值的灰度表示,最简单的方法就是使用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)

我按照Joe建议的更改进行了修改,但出现了以下错误:“ValueError: too many values to unpack”,即在height, width = np.array(data.shape, dtype=float) / dpi处。我应该做哪些更改? - albus_c
@albus_c - 听起来你有一个三维数组?data.shape是什么样子的?如果它是一个三维数组,你需要做类似于height, width, nbands = ...这样的操作。 - Joe Kington
@albus_c - 另外,如果你正在处理多波段图像,只需使用“Image”(又名“PIL”)直接将其保存为tif即可。我假设你想根据颜色映射表对单波段图像进行着色(顺便说一下,这也可以用PIL完成,但构建颜色映射表更加困难)。 - Joe Kington
谢谢你的建议!我现在对得到的彩色图像感到满意(我只需要它们来检查我是否考虑了正确的区域)。 - albus_c
1
使用 PILLOW(旨在取代 PIL),可以通过 pip install PILLOW 安装该软件包,并通过 from PIL import Image 导入。您需要将图像转换为 0-255 范围内的 uint8 格式(如示例所示),并将单通道图像展平为二维图像。其余步骤与 PIL 示例相同。 - Josiah Yoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接