【问题标题】:Efficient way to handle boundary pixels when implementing arbitrary image algorithms in Python在 Python 中实现任意图像算法时处理边界像素的有效方法
【发布时间】:2013-10-14 15:19:57
【问题描述】:

图像处理算法通常需要单个图像位置邻域内的像素值。然而,边界点的邻域是不完整的,需要通过各种方法进行特殊处理,例如镜面反射、周期性等。

对于线性运算,一种有效的方法是将算法转为核,然后进行 2D 卷积。卷积例程通常具有内置的边界处理方法。

对于任意(非线性)算法,一种可能性是首先pad 图像,一次收集所有邻域(例如,使用pad+neighbor),然后以矢量化方式进行操作。但是,正如文档所建议的那样,这可能会占用大量内存。

遍历像素并逐个处理边界是另一种方式。但这在 Python 中可能会很慢(尽管在 C/C++ 中可行),并且提供所有这些镜像/周期性的东西似乎很麻烦......

在 Python 中实现您自己的算法时,如何有效地(也许是 Pythonic)做到这一点?

是否有一些函数返回specified pixel 的邻域,并具有指定的边界处理方法?

【问题讨论】:

    标签: python algorithm image-processing


    【解决方案1】:

    在图像处理期间处理边界条件的最 Pythonic 和最有效的方法是使用现有库。除了 PIL 和 ImageMagick,我还推荐OpenCV

    Python 本身不提供任何图像处理函数,因此有关特定像素邻域的任何问题都是特定于库的。选择一个您喜欢的库并尝试使用它 - 如果您无法弄清楚该库如何处理边界条件,请回来再次询问。

    【讨论】:

    • 我完全同意这一点。只是添加一个注释 - 如果你真的想自己做事情,你可能会使用 numpy 这是 OpenCV for python 的基础,并且是它的先决条件。在进行数组操作和处理方面,它或多或少与 C 一样快。
    • 我只是想知道当人们尝试在 Python 中实现基于像素的邻域算法时,关于边界处理的一般策略是什么。该算法可能无法在现有库中直接使用。我知道 numpy、scipy、PIL 以及用于 opencv 和 ImageMagick 的 Python 绑定。但很多时候,相关的实现并不是用 Python 编写的。我发现一个鼓舞人心的包是问题中链接的 scikit-image。
    • 你已经有了正确的想法:常见的策略是复制图像的一部分,或者包含条件逻辑来处理边界条件。它们都有缺点(内存使用、效率),但如果你真的担心这些事情,那么你可能不应该首先在 Python 中实现它(即使用现有的图像处理库)。
    【解决方案2】:

    PIL 是处理图像处理的最著名的库之一。您可能还想看看ImageMagick,我认为它内置了许多很酷的图像转换功能。

    【讨论】:

      猜你喜欢
      • 2012-04-08
      • 1970-01-01
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多