在2.4 GB GeoTIFF图像上应用图像平滑和边缘检测算法

时间:2018-09-24 16:40:13

标签: python python-3.x image-processing edge-detection geotiff

因此,我有超过150,000张巨大的GeoTIFF图像(每张2.4 GB),我需要对其进行图像平滑和边缘检测(LoG滤波器),以获取清晰的图像。我使用Gdal读取图像,对其进行了平滑,二次采样,创建了高通滤波器(5级)并重建了图像。

这对于正常的.jpg文件效果很好。

但是对于巨大的TIFF文件,我无法完成此操作,因为即使使用32 GB RAM 8核心处理器和4 TB磁盘空间,我仍然会遇到内存错误。

在Python 3.6 Ubuntu 18 LTS上进行重量级图像处理/图像分割的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

pyvips可以处理大图像quickly and in little memory。它是LGPL,可以在Linux,macOS和Windows上运行,并且可以在每个版本的Python上运行。大多数Linux(包括Ubuntu)在软件包管理器中都有它。

这是一个需求驱动的流式图像处理库。它不是在单个大块上处理图像,而是在背后构造了一个图像处理操作员网络,并且由于需要创建输出,因此像素在较小区域中穿过计算机的内存。

例如,我可以运行以下程序:

import sys
import pyvips

# access='sequential' puts pyvips into streaming mode for this image
im = pyvips.Image.new_from_file(sys.argv[1], access='sequential')
im = im.crop(100, 100, im.width - 200, im.height - 200)
# 10% shrink, lanczos3 (by default)
im = im.resize(0.9)
mask = pyvips.Image.new_from_array([[-1, -1,  -1], 
                                    [-1,  16, -1], 
                                    [-1, -1,  -1]], scale=8)
# integer convolution ... you can use large float masks too, canny,
# sobel, etc. etc.
im = im.conv(mask, precision='integer')
im.write_to_file(sys.argv[2])

在40k x 30k像素的GeoTIFF图像上:

$ vipsheader SAV_X5S_transparent_mosaic_group1.tif 
SAV_X5S_transparent_mosaic_group1.tif: 42106x29852 uchar, 4 bands, srgb, tiffload

在此2015年笔记本电脑上,运行方式如下:

$ /usr/bin/time -f %M:%e python3 bench.py SAV_X5S_transparent_mosaic_group1.tif x.tif
257012:101.43

即。 260mb的RAM,经过101s的时间。在您的大型计算机上,它应该更快一些。

您可能遇到的一个问题是GeoTIFF标签:pyvips不会保留它们。也许在以后的处理中不需要它们。

答案 1 :(得分:0)

通常,此类大图像是逐块处理的。想法是将图像分成多个小块,分别读取每个小块,并具有足够的“重叠”以说明所应用的过滤,对其进行处理并将其写入文件。

TIFF标准知道“平铺”格式(我相信GeoTIFF文件通常以分块格式存储)。该格式经过明确设计,可以轻松地在图像的小窗口中读取内容,而不必将文件中的各个部分拼凑在一起。 TIFF文件中的每个图块都可以按位置索引,并且可以独立编码和压缩,从而可以轻松地一次读取和写入一个图块。

您需要的重叠取决于所应用的过滤。例如,如果您应用具有9x9窗口(到达中心像素之后4个像素)的高斯滤波器的拉普拉斯,然后重叠仅需要4个像素。如果链接过滤器,通常需要添加每个过滤器的覆盖范围以获得总重叠值。

接下来,将图像划分为TIFF文件中图块大小的几倍。假设文件的像素为512x512像素。您可以选择一次处理8个图块,一个2048x2048像素的区域。

现在在每个维度上以2048为步长循环遍历图像。读入8个图块,并包括相邻的图块,您将对其进行裁剪,以便获得侧面2048 + 2 * 4像素的正方形图像。处理子图像,删除重叠区域,然后将其余部分写入输出TIFF文件中的相应图块。输出TIFF文件的设置方法应与输入TIFF文件的设置方法相同。

我肯定有自动化该过程的软件,但是我不知道Python中有什么软件。如果您自己实现此功能,则需要学习如何在TIFF文件中读取和写入单个图块。一种选择是pylibtiff

相关问题