我最近不得不实现一些我必须应用于2D矩阵的函数,例如滑动窗口平均器。
对于这些事情中的每一件事我都必须考虑到,如果我正在处理的元素位于矩阵的边角或边缘,我正在进行的操作是不一样的。为了继续我的例子,我不能取(0,0)中元素周围值的平均值,因为它会让我超出矩阵。
每次我面对这一点时,我的方法都不同:我使用叠瓦状的ifs或做不在边缘开始的循环然后单独处理它们但我的印象是我不是这样做的“最佳方法” 。
我试图搜索是否有一个广泛采用的方法来解决这个问题,但是找不到这就是我在这里要求输入的原因。
我主要使用C,C ++,matlab和python,所以如果你在这些语言中有优雅的方法,我也很感兴趣!
谢谢。
答案 0 :(得分:0)
对于一些额外内存的成本,您可以用零(或者一些适合您的算法的方法)“围绕”矩阵,如下所示:
000000
0abcd0
0efhg0
000000
并运行循环,如:
for (size_t i = 1; i < N - 1; ++i)
for (size_t j = 1; j < M - 1; ++j)
...
N-1
和M-1
是您原始的矩阵维度。
答案 1 :(得分:0)
所以我认为你在谈论卷积过滤器。我之前不得不处理这个问题,我的解决方案是为你的滑动窗口遍历的2D网格创建我自己的类。在那里,我重载了查找方法,即在C ++ operator[]()
中,让它检查一个越界值并在其位置返回一些值。
一些常见的解决方案是:
(0,y)
的所有内容都取(0,y)
处的值。您选择哪个选项取决于您的应用程序(您使用的过滤器)。例如,如果使用Sobel滤镜执行边缘检测,则可能需要使用钳位,因此图像的边缘不会在图像中显示为假边缘,但是,如果要应用均值滤波器,你会想要在窗口中返回真值的平均值,以便超出范围(因此超出范围的值不会影响平均值)。
简短回答没有一个答案,它具有高度特定的背景。