【问题标题】:Perform a different neighbourhood operation for specified pixels对指定像素执行不同的邻域运算
【发布时间】:2020-11-22 16:58:19
【问题描述】:

我有一个HxW“特征图”,F。让我们假设它是一个HxWx1 映射。通过其他一些操作,我得到了一组我感兴趣的像素(比如N 像素)。这些像素中的每一个都与不同的值相关联,因此我的集合的形式为 Nx3,其中每个像素的形式为 x、y 和 val。请注意,这个val 与该位置的特征图值不同。

这是我的问题。是否可以为这些点中的每一个向量化邻域操作?对于N 中的每个像素n,我希望将对应的val 乘以特征图F 中的3x3 邻域。对于 3x3 邻域,这给出了一组新的 3x3 元素 new val。我想将xy替换为3x3窗口中最大为new val(乘特征图)的像素。

这听起来类似于卷积(这里稍微滥用了术语),然后是最大池操作,但不完全是因为每个像素位置都有不同的 val 要相乘。

输入和输出示例,以及所需解决方案的演练

让我们假设H=10 和W=10

这是一个示例 F

0.635955  0.922379  0.993406  0.007837  0.818661  0.983730  0.199866  0.757519  0.073152  0.015831
0.397718  0.097353  0.231351  0.177886  0.343099  0.419940  0.017342  0.087294  0.402266  0.366337
0.978686  0.476594  0.067836  0.148977  0.058994  0.810586  0.542894  0.797419  0.386559  0.225982
0.479860  0.033354  0.353366  0.431562  0.336208  0.674272  0.398151  0.713732  0.598623  0.829230
0.940838  0.869564  0.287100  0.669844  0.631836  0.748982  0.762292  0.597999  0.540236  0.758802
0.925995  0.141296  0.466772  0.672663  0.929746  0.544029  0.991860  0.197474  0.762866  0.798973
0.543519  0.128332  0.624323  0.876569  0.050709  0.223705  0.708381  0.380842  0.818092  0.163447
0.283125  0.329618  0.283481  0.672950  0.136922  0.897785  0.385479  0.764824  0.132671  0.091148
0.661984  0.369459  0.501181  0.352681  0.554113  0.133283  0.593048  0.108534  0.397813  0.836065
0.654929  0.928576  0.539204  0.931213  0.344114  0.591214  0.126809  0.456681  0.036531  0.725228

我的像素结构,让我们说N=3 按行、列、值顺序排列的三个值:(为简单起见,我假设 x 是行,y 是列,尽管不一定如此)。 这完全独立于上一步中的特征图。

3,2,0.38
4,4,0.602
7,5,0.9647

(3,2) 周围的社区是:

[[0.4765941 , 0.06783561, 0.14897662],
[0.03335438, 0.35336647, 0.4315618 ],
[0.86956374, 0.28709952, 0.66984412]]

因此val * 邻域收益率。 (这里val 是 0.38)

[[0.18110576, 0.02577753, 0.05661112],
[0.01267466, 0.13427926, 0.16399349],
[0.33043422, 0.10909782, 0.25454077]]

这里最大值的位置是(2,0),即(1,-1)相对于中心像素。因此我更新的(x,y) 应该是(3,2) + (1,-1) = (4,1)。 其他两个类似,更新后的像素为:(5,4) 和 (7,5)

我怎样才能并行化整个事情? (希望能用 Pytorch 加载到 GPU 上,但不一定,我还没到那个阶段。)

注意:我几天前曾问过这个问题,但没有适当的信息,它的框架很差。希望这能解决问题。

编辑:对于这个特定的实例,F 可以作为一个随机数组产生:

F = np.random.rand(10,10)

【问题讨论】:

  • 当您提供F(或任何数组)时,如果您提供它的代码 sn-p 会更容易。谢谢。
  • 嗨@Ehsan 虽然我知道这会有所帮助,但我获得F 和x,y,vals 列表的方式是通过另一个不同的过程,所以对于这个问题,随机数组可以被假定。我已对我的问题进行了编辑!
  • 我明白这一点。如果可能提供随机数组和相应的所需输出,这将变得更容易。谢谢。
  • 您是否要更新 F 的值,例如(3,2) 与 0.33043422 或 (4,1) 与 0.33043422?

标签: python arrays numpy opencv pytorch


【解决方案1】:

如果我理解正确,你想要这个:

from skimage.util.shape import view_as_windows
idx = pixels[:,0:2].astype(int)
print((np.unravel_index((view_as_windows(F,(3,3))[tuple(idx.T-1)]*pixels[:,-1][:,None,None]).reshape(-1,9).argmax(1),(3,3))+idx.T).T-1)
#if you need to replace the values of F with new values
F[tuple(idx.T)] = (view_as_windows(F,(3,3))[tuple(idx.T-1)]*pixels[:,-1][:,None,None]).reshape(-1,9).max(1)

我假设你的窗口形状是(3,3)。当然,你可以改变它。如果您需要处理边缘邻域,请在使用 view_as_windows 之前使用 np.pad 用足够的 0(取决于您的窗口大小)填充您的 F。

输出:

[[4 1]
 [5 4]
 [7 5]]

【讨论】:

  • 哇,这看起来很复杂。它几乎做到了,但是,我希望将新像素返回给我,即我希望我的输出为 (4,1) 、 (5,4) 和 (7,5)
  • @ShrutheeshRamanIyer 请在帖子中找到更新。请查看stackoverflow.com/help/someone-answers,了解如何接受关于 SO 的答案。谢谢。
  • 太棒了!谢谢:)
猜你喜欢
  • 1970-01-01
  • 2013-09-06
  • 2023-03-06
  • 2019-11-15
  • 1970-01-01
  • 2019-01-16
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
相关资源
最近更新 更多