【问题标题】:How do i fill "holes" in an image?如何填充图像中的“洞”?
【发布时间】:2012-03-17 17:06:18
【问题描述】:

我有星系的照片。这些图像中有一些不需要的数据(如星星或飞机条纹)被掩盖了。我不只是想用一些平均值填充蒙面区域,而是根据周围数据对它们进行插值。我如何在python中做到这一点?

我们尝试了 SciPy.interpolate 包中的各种函数:RectBivariateSpline、interp2d、splrep/splev、map_coordinates,但它们似乎都可以在现有像素之间寻找新像素,我们无法让它们填充任意“洞” " 在数据中。

【问题讨论】:

  • 向不同方向的太空发射两个或更多探测器。在他们的视线不再被地球上阻挡您视线的物体阻挡后,让他们拍摄您感兴趣的空间部分的照片。通过将图片与某种形式的插值相结合,您可以获得非常好的近似值如果视野没有被阻挡,从地球上看那部分空间会是什么样子。
  • @Swiss 大声笑...严重吗?
  • @Swiss - 将其发布为答案,如果它被接受,您将永远成为互联网英雄。
  • 这可能不是你想要的,但最近邻插值可以用 scipy 在两行中完成:有关详细信息,请参阅 this post

标签: python image-processing interpolation mask astronomy


【解决方案1】:

你想要的是Inpainting
OpenCV 有一个 inpaint() 函数,可以满足你的需求。

【讨论】:

  • 感谢正确的关键字 - inpaint。 openCV 可能不是最佳选择,因为天文图像是每像素 64 位,而 openCV 允许 1 通道 8 位或 3 通道 8 位图像(每像素最多 24 位)。我找到了一个简单的修复实现:github.com/gasagna/openpiv-python/blob/master/openpiv/src/…
  • @miceuz Mathematica 有一个 Inpaint 函数,可以对双精度图像进行操作。
  • 另见 G'MIC 进行修复,gmic.eu。我已经成功地将它用于 NO_DATA 区域。 gmic -h -inpaint
  • 正如@miceuz 提到的,OpenCV 版本需要 8 位值。我尝试使用 cv2.convertScaleAbs 将我的 float 32 数据集转换为 8bit,但我不确定如何将其重新转换回 float32 或将填充的孔重新映射回原始的 float 32 数据。
【解决方案2】:

你想要的根本不是插值。插值取决于已知点之间的数据大致连续的假设。在任何非平凡的图像中,情况都不会如此。

您实际上想要 Photoshop CS5 中的内容感知填充之类的东西。 The GIMP 通过 GIMP-resynthesize 插件提供了一个免费的替代方案。这些过滤器非常先进,尝试重新实现它们是疯狂的。更好的选择是弄清楚如何在您的程序中使用 GIMP-resynthesize。

【讨论】:

  • 实际上,resynthesize 之前就已经存在,所以它是“CS5 中通过内容感知填充提供了一种付费替代方案”...
【解决方案3】:

我制作了我的第一个 gimp python 脚本,它可能会对您有所帮助: my scripts

它被称为条件过滤器,因为它是一个矩阵过滤器,根据其不透明的 4 个最近邻居的平均值填充图像中的所有透明像素。 请务必使用只有 0 和 255 透明值的 RGBA 图像。

它粗糙、简单、缓慢、未优化但没有错误。

【讨论】:

    猜你喜欢
    • 2016-08-30
    • 2020-10-03
    • 2016-07-26
    • 2021-08-11
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    相关资源
    最近更新 更多