1

我有一个单色图像,其大小大于 10 GB (50000x50000)。这张图片有很多“洞”,像素为 NULL。

按照惯例,我知道如何使用 python griddata 函数读取整个图像并使用不同的插值方法用 NULL 值填充像素。但是现在的问题是,由于这张图片的大小,我不能一次处理整个图片,这会给我一个内存耗尽的错误。

所以,现在我的想法是我可以将这个图像分成 2500 个(50x50)窗口,然后在每个窗口上运行插值方法。但明显的问题是,对于每个窗口,NULL像素只与同一个窗口中的相邻像素进行插值,这有悖于图像的本质,因为窗口边缘的像素不能被窗口中的像素插值。相邻的窗户。为了解决这个问题,重叠窗口可能是一种解决方案。我只能想到这个解决方案。有谁知道是否有一种有效且完整的方法来插入一个非常大的图像。

4

1 回答 1

1

我认为您需要提供更多信息,但是如果孔很小,一种简单的解决方案就是用中值滤波器的值替换空像素。

例如,使用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 中值滤波器可以填充最多三个像素的孔。您可以使用更大的窗口来填充更大的孔,但它当然会变慢。

它应该很快,并且只需要一点内存就可以处理任何大小的图像。

如果需要填充大面积区域,则需要考虑更复杂的东西。

于 2020-04-29T10:33:15.150 回答