Как интерполировать очень большое изображение (+ 10 гигабайт)? - PullRequest
1 голос
/ 27 апреля 2020

У меня моно chrome изображение размером более 10 гигабайт (50000x50000). На этом изображении много «дырок», пикселей со значением NULL.

Обычно я знаю, как использовать функцию python griddata для считывания всего изображения и заполнения пикселей значением NULL с использованием другого метода интерполяции. Но проблема сейчас в том, что я не могу обработать все изображение одновременно из-за размера этого изображения, что приведет к ошибке исчерпания памяти.

Итак, теперь моя идея состоит в том, чтобы я мог разделить это изображение на 2500 (50x50) windows и запустить метод интерполяции для каждого окна. Но очевидная проблема заключается в том, что для каждого окна NULL-пиксель интерполируется с соседними пикселями только в одном и том же окне, что противоречит характеру изображения, поскольку пиксель на краю окна не может быть интерполирован пикселем в соседний windows. Чтобы решить эту проблему, перекрытие windows может быть решением. Я могу думать только об этом решении. Кто-нибудь знает, есть ли эффективный и неповрежденный метод для интерполяции очень большого изображения.

1 Ответ

1 голос
/ 29 апреля 2020

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

Например, используя pyvips :

#!/usr/bin/python3

import sys
import pyvips

image = pyvips.Image.new_from_file(sys.argv[1], access="sequential")
image = (image == 0).ifthenelse(image.median(5), image)
image.write_to_file(sys.argv[2])

Это откроет изображение в последовательном режиме (нам нужно только сделать один проход по изображению, поэтому нам не нужен произвольный доступ к пикселям). Медианный фильтр 5x5 может заполнить отверстия размером до трех пикселей. Вы можете использовать большее окно, чтобы заполнить большие отверстия, но, конечно, оно будет медленнее.

Это должно быть довольно быстро, и оно будет работать на изображениях любого размера, используя только небольшую память.

Вам нужно рассмотреть что-то более сложное, если вам нужно заполнить большие области.

...