Matlab - 周围元素的总和

4

我希望计算矩阵中给定元素周围元素的总和。到目前为止,我已经编写了以下代码:

for i=1:m,
        rij(1:n)=0
        for j=1:n,
            alive = tijdelijk(i-1,j)+tijdelijk(i+1,j)+tijdelijk(i-1,j-1)+tijdelijk(i+1,j-1)+tijdelijk(i,j+1)+tijdelijk(i,j-1)+tijdelijk(i-1,j+1)+tijdelijk(i+1,j+1)

这会导致错误,因为当i=1时,i-1变成了零。有人有什么想法可以避免这个错误吗?
3个回答

13
你可以通过过滤来对元素求和。可以使用conv2进行这种方式的操作。
让我举个例子。我创建一个样本矩阵。
>> A = reshape(1:20, 4, 5)

A =

 1     5     9    13    17
 2     6    10    14    18
 3     7    11    15    19
 4     8    12    16    20

接下来,我创建一个过滤器。这个过滤器就像一个面罩,你把它的中心放在当前单元格上,然后将与过滤器上的1相对应的位置加起来。对于八连通的邻居情况,过滤器应该如下所示:

>> B = [1 1 1; 1 0 1; 1 1 1]

B =

 1     1     1
 1     0     1
 1     1     1

然后,你只需用这个小矩阵对该矩阵进行卷积。

>> conv2(A, B, 'same')

ans =

13    28    48    68    45
22    48    80   112    78
27    56    88   120    83
18    37    57    77    50

如果您想要四个相邻的邻居,可以将滤波器的角落设为0。同样,您可以设计任何适合您目的的过滤器,例如对所有邻居进行平均而不是求和。

详情请参见维基百科中的卷积文章


1
哈哈,我也在写同样的东西! - tdc
1
如果这个解决方案对您有用,您可以接受它作为您问题的解决方案。 - petrichor
非常有帮助,所以我做到了 :) - user2089012
我认为你可能不熟悉Stackoverflow。接受一个答案是通过点击答案左上角的勾号来完成的。 - petrichor

1
两种可能性:将循环的限制改为 i=k:(m-k)j=k:(n-k),或使用 blkproc
例如:

计算每个8×8块的2-D DCT

I = imread('cameraman.tif');
fun = @dct2;
J = blkproc(I,[8 8],fun);
imagesc(J), colormap(hot)

如果您拥有图像处理工具箱,可以使用blkproc方法。 - High Performance Mark

0

在边缘处有很多事情可以做。你要做什么取决于你的问题,不同的用例有不同的处理方式。一般来说,可以采取以下措施:

  1. 如果 (i-1) 或 (i+1) 超出了范围,则忽略该元素。这相当于在矩阵周围用零填充矩阵,并相应地调整循环限制。
  2. 绕过边缘。换句话说,对于一个 MxN 矩阵,如果 (i-1) 带你到 0,那么你就不是取元素 (i-1, j) = (0, j),而是取元素 (M, j)。

由于你的代码提到了“你的老师”,我猜你可以询问在边缘处应该发生什么(或者合理地解决问题可能是任务的一部分!!)。


那么,如何绕过图像边缘?是否可以使用 conv2blkproc 简单地完成? - Pranasas
老实说,我不确定。我认为conv2在边缘处进行零填充,但我不能百分之百确定。 - FakeDIY

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接