python - 使用 tifffile 拆分 BigTiff
问题描述
我在拆分 BigTiff 时遇到问题。我最初使用这个问题中的@Ivan 代码。由于我使用的是大于 4GB 的 .tif,因此我不得不对其进行一些修改。Pillow不支持BigTiffs。所以我最终使用了tifffile
. 代码正在运行,尽管图像没有被裁剪到box
参数中。我认为它必须tifffile
将图像读取为 anumpy array
并且实际上没有被任何东西剪辑???
我还注意到,当这段代码运行时,我的内存即将耗尽。我尝试将数据类型分配给未分配的 8 位,这非常有帮助。我也应该压缩它吗?我不想过多地更改数据,因为我将对它们进行分类并且不想丢失/更改数据。
import os
from itertools import product
import tifffile
def tile(filename, dir_in, dir_out, d):
name, ext = os.path.splitext(filename)
img = tifffile.imread(os.path.join(dir_in, filename))
print(type(img))
w = img.shape[0]
h = img.shape[1]
grid = list(product(range(0, h - h % d, d), range(0, w - w % d, d)))
for i, j in grid:
box = (j, i, j + d, i + d)
out = os.path.join(dir_out, f'{name}_{i}_{j}{ext}')
img = img.clip(box)
img = img.astype('uint8')
tifffile.imsave(out, img)
tile('Orthomosaic_export_MonFeb01193821460106.tif',
r'D:\ortho',
r'D:\model_images',
1000)
解决方案
最终将这个答案合并到我的代码中并最终让它运行。
import os
import tifffile
def tile(filename, dir_in, dir_out):
name, ext = os.path.splitext(filename)
img = tifffile.imread(os.path.join(dir_in, filename))
windowsize_r = 10000
windowsize_c = 10000
i = 0
for r in range(0, img.shape[0] - windowsize_r, windowsize_r):
for c in range(0, img.shape[1] - windowsize_c, windowsize_c):
window = img[r:r + windowsize_r, c:c + windowsize_c]
out = os.path.join(dir_out, f'{name}_{i}_{ext}')
tifffile.imsave(out, window)
i = i + 1
tile('Shopfield_Orthomosaic_export_MonFeb01193821460106.tif',
r'D:\ortho',
r'D:\model_images')
推荐阅读
- identityserver4 - 如何使用 IdentityServer 添加审计日志
- jar - 设置后我无法立即登录 Metabase
- python-3.x - pytest 用 boto3 模拟
- python - Python 多处理仅在一个带有网络的核心上工作
- python - BeautifulSoup 和处理文本结果的问题
- html - 链接中的锚点在 chrome 中的移动设备上不起作用
- .net - 从 Vb.Net 中活动运行的 Powershell 实例获取信息
- java - 如何使用 Avro 在 Spring Kafka 1.3 中移过不可反序列化的消息
- visual-studio - 打开 .inl 文件会全局中断 IntelliSense
- ios - 如何将外部音频导入语音备忘录应用程序?