Применение алгоритмов сглаживания и определения краев к изображению GeoTIFF объемом 2,4 ГБ - PullRequest
0 голосов
/ 24 сентября 2018

Итак, у меня есть более 150 000 огромных изображений GeoTIFF (каждый по 2,4 ГБ), которые мне нужны для запуска сглаживания изображений и обнаружения краев (LoG Filter), чтобы получить заостренное изображение.Я прочитал изображение, используя Gdal, сгладил его, субсэмплировал, создал фильтр верхних частот (уровень 5) и восстановил изображение.

Это нормально работает для обычного файла .jpg.

Но я не могу сделать это для огромного файла TIFF, потому что я продолжаю сталкиваться с ошибками памяти даже с 32 ГБ ОЗУ 8-ядерным процессором и 4 ТБ дискового пространства.

Какой лучший способ сделать тяжелыйобработка изображений / сегментация изображений на Python 3.6 Ubuntu 18 LTS?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

pyvips может обрабатывать огромные изображения быстро и с небольшим объемом памяти .Это 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])

На изображении GeoTIFF размером 40k x 30k пикселей:

$ 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

т.е.260 МБ ОЗУ, 101 с истекшего времени.Это должно быть немного быстрее на вашей большой машине.

Одна из проблем, с которой вы можете столкнуться, связана с тегами GeoTIFF: они не будут сохраняться pyvips.Возможно, они вам не понадобятся при дальнейшей обработке.

0 голосов
/ 24 сентября 2018

Как правило, такие большие изображения обрабатываются по частям.Идея состоит в том, чтобы разделить изображение на фрагменты, прочитать каждое из них независимо, с достаточным «наложением», чтобы учесть примененную фильтрацию, обработать его и записать в файл.

Стандарт TIFF знает «мозаичный элемент».msgstr "формат (я считаю, что файлы GeoTIFF обычно хранятся в виде листов).Этот формат явно разработан для того, чтобы его было легко читать в небольшом окне изображения без необходимости собирать кусочки по всему файлу.Каждую плитку в файле TIFF можно индексировать по местоположению, кодировать и сжимать независимо, что упрощает считывание и запись по одной плитке за раз.

Необходимое перекрытие зависит от применяемой фильтрации.Если вы примените, скажем, фильтр Лапласа Гаусса с окном 9x9 (достигает 4 пикселя за центральным пикселем), а затем перекрытие должно составлять всего 4 пикселя.Если вы объединяете фильтры, как правило, вы хотите добавить охват каждого фильтра, чтобы получить общее значение перекрытия.

Затем разделите изображение на несколько кратных размеру плитки в файле TIFF.Скажем, файл имеет плитки размером 512х512 пикселей.Вы можете обрабатывать 8 плиток одновременно, область размером 2048x2048 пикселей.

Теперь зацикливайте изображение с шагом 2048 в каждом измерении.Прочитайте 8 плиток и включите соседние плитки, которые вы будете обрезать, чтобы получить квадратные изображения размером 2048 + 2 * 4 пикселя в сторону.Обработайте субизображение, удалите область перекрытия и запишите остальное в соответствующие фрагменты в выходном файле TIFF.Выходной файл TIFF должен быть настроен так же, как и входной файл TIFF.

Я уверен, что существует программное обеспечение, которое автоматизирует этот процесс, но я не знаю ни одного в Python.Если вы реализуете это самостоятельно, вам нужно будет научиться читать и писать отдельные фрагменты в файле TIFF.Один из вариантов: pylibtiff .

...