Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 如何插值非常大的图像(+;10Gigabytes)?_Image Processing_Interpolation_Vips - Fatal编程技术网

Image processing 如何插值非常大的图像(+;10Gigabytes)?

Image processing 如何插值非常大的图像(+;10Gigabytes)?,image-processing,interpolation,vips,Image Processing,Interpolation,Vips,我有一个单色图像,其大小大于10GB(50000x50000)。此图像有许多“孔”,像素值为空 按照惯例,我知道如何使用python griddata函数读取整个图像,并使用不同的插值方法将像素填充为空值。但是现在的问题是,由于这个图像的大小,我不能一次处理整个图像,这将给我一个内存耗尽的错误 所以,现在我的想法是,我可以把这个图像分成2500(50x50)个窗口,然后在每个窗口上运行插值方法。但明显的问题是,对于每个窗口,空像素仅在同一窗口中与相邻像素插值,这与图像的性质相反,因为窗口边缘上的

我有一个单色图像,其大小大于10GB(50000x50000)。此图像有许多“孔”,像素值为空

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


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

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

例如,使用:

这将以顺序模式打开图像(我们只需要对图像进行一次扫描,因此不需要随机访问像素)。5x5中值滤波器可以填充多达3个像素宽的孔。你可以用一个更大的窗口来填补更大的洞,但当然它会变慢

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


如果你需要填满大面积的话,你需要考虑一些更复杂的东西。

重叠窗口似乎是我的正确方法。重叠的大小取决于要插值的值之间的距离,这取决于具有空值的像素的分数。不要过早地使用方形窗口。对于如此大的图像,使用
10x50000
窗口(用足够大的值替换
10
进行插值)可能比使用相同像素数的方形窗口获得更好的性能。可能使用
vip
,这是一种非常好的方法。如果您添加该标记,并提供可用编程语言和操作系统的详细信息,以及数据当前存储格式的一些指示,可能会有所帮助。根据您的大小,我假设您的数据是32位浮点-正确吗?虽然我怀疑
vips
会是一个更好的工具,但如果你真的被卡住了,你可能会发现你可以使用ImageMagick
stream
工具提取图像的重叠块进行进一步处理。。。很好,我喜欢你的风格-它用50k x 50k文件将我的12个CPU内核与100%挂钩超过一分钟!哎哟好吧,至少它跑了,你的家现在暖和了一点:)
#!/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])