【问题标题】:Better way to compare neighboring cells in matrix [duplicate]比较矩阵中相邻单元格的更好方法[重复]
【发布时间】:2012-12-01 05:17:10
【问题描述】:

可能重复:
Numpy/Python: Array iteration without for-loop

假设我有一个大小为 100x100 的矩阵,我想将每个像素与其直接邻居(左、上、右、下)进行比较,然后对当前矩阵或相同大小的新矩阵进行一些操作。 Python/Numpy 中的示例代码如下所示: (比较>0.5没有意义,我只是想在比较邻居时给出一些操作的工作示例)

import numpy as np
my_matrix = np.random.rand(100,100)
new_matrix = np.array((100,100))
my_range = np.arange(1,99)
for i in my_range:
    for j in my_range:

        if my_matrix[i,j+1] > 0.5:
            new_matrix[i,j+1] = 1

        if my_matrix[i,j-1] > 0.5:
            new_matrix[i,j-1] = 1

        if my_matrix[i+1,j] > 0.5:
            new_matrix[i+1,j] = 1

        if my_matrix[i-1,j] > 0.5:
            new_matrix[i-1,j] = 1

        if my_matrix[i+1,j+1] > 0.5:
            new_matrix[i+1,j+1] = 1

        if my_matrix[i+1,j-1] > 0.5:
            new_matrix[i+1,j-1] = 1

        if my_matrix[i-1,j+1] > 0.5:
            new_matrix[i-1,j+1] = 1

如果我想进入一个相邻的单元格并从它开始与它的邻居进行比较,这可能会变得非常讨厌......您有什么建议可以如何以更有效的方式完成吗?这甚至可能吗?

【问题讨论】:

  • 也许你应该澄清你想要什么......只是猜测,看起来你想知道哪个值为 1 的像素被 8 个像素包围,所有像素都是 1。是这样吗?

标签: python matlab matrix numpy scipy


【解决方案1】:

我不能 100% 确定您的代码目标是什么,忽略边界处的索引问题相当于

new_matrix = my_matrix > 0.5

但您可以通过形态学运算快速完成这些计算的高级版本:

import numpy as np
from scipy.ndimage import morphology

a = np.random.rand(5,5)
b = a > 0.5

element = np.array([[0, 1, 0], [1, 1, 1], [0, 1, 0]])
result = morphology.binary_dilation(b, element) * 1

【讨论】:

  • 谢谢,我会研究形态学运算(以前从未听说过)。正如我在更新的帖子中所写的那样,>0.5 应该只是某些操作的示例......
  • 维基百科文章和这个网站:homepages.inf.ed.ac.uk/rbf/HIPR2/dilate.htm 是一个很好的起点。页面底部的“练习 1”显示了我示例中的结构元素。
  • 我想我明白了,但是它并不能帮助我解决第二个问题。如果邻居满足特定条件,我想从这个邻居重新开始这个过程......这意味着应该检查这个特定邻居的邻居......
  • 在这种情况下,您应该对整个数组运行条件以获得二进制结果。然后提取包含您的起点的连接组件(相当于进行洪水填充),您可以使用:docs.scipy.org/doc/scipy/reference/generated/…。这还允许您指定定义如何连接像素的结构元素。
  • 我会调查的!您认为它是否也适用于基于成本面矩阵的“最短路径”算法?例如,这是我使用上面代码的一个应用程序。
【解决方案2】:

避免“变得讨厌”的方法是:将邻居检查代码封装在一个函数中。然后你可以在必要时用邻居的坐标调用它。

如果您需要跟踪检查过哪些配对,以免保留相同的配对,请在此基础上使用某种记忆。

【讨论】:

  • 反对票是怎么回事? OP 特别关注链接检查。如果有人认为这个答案不相关,我想知道为什么。 (关于如何捆绑检查已经有一个很好的答案,因为这个原因,OP 发现这些检查是不够的)。
  • 我也认为您的解决方案是合适的。我想必须编写类似两种解决方案组合的东西才能使其更好地工作..
猜你喜欢
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多