【问题标题】:filling up efficiently a sparse matrix based on 4-pixel or 8-pixel neighborhoods有效地填充基于 4 像素或 8 像素邻域的稀疏矩阵
【发布时间】:2014-03-02 13:27:33
【问题描述】:

给定一个大小为[hh,ww] 的图像,我想有效地创建一个大小为[hh*ww, hh*ww] 的稀疏矩阵。 对于给定像素的每个 4 或 8 邻域,稀疏矩阵应该填充一个常数值(比如-1) 在正确的行(代表正在评估的像素)和列(像素的相应 4-neighbors 或 8-neighbors)。

例如,考虑一个 4 像素邻域和一个 [2,2] 矩阵,生成的大小为 [4,4] 的稀疏矩阵如下所示:

 0  -1  -1   0
-1   0   0  -1
-1   0   0  -1
 0  -1  -1   0

第一行在第 2 列和第 3 列用-1 填充,因为这些像素位于像素 1 的 4 邻域中(​​下面给出线性索引):

1   3
2   4

下面的代码可以完成这项工作,但是当矩阵变得太大时会变得非常慢,例如,对于 2000x2000 矩阵。

hh=2;
ww=2;
%hh=2000;
%ww=2000;
sG     = sparse(hh*ww,hh*ww);
linIdx = reshape(1:hh*ww, [hh ww]);
sG( sub2ind([hh*ww hh*ww], linIdx(:,1:end-1),linIdx(:,2:end)) ) = -1;
sG( sub2ind([hh*ww hh*ww], linIdx(1:end-1,:),linIdx(2:end,:)) ) = -1;
sG = max(sG, sG'); 

有什么想法可以在拥有大型矩阵时使代码高效吗?理想情况下,它应该适用于 4-neighborhoods 或 8-neighborhoods。

【问题讨论】:

标签: matlab image-processing sparse-matrix adjacency-matrix


【解决方案1】:

如您所述,我编写了一个高效计算稀疏邻接矩阵的函数。见sparse_adj_matrix。

用法:

[ii jj] = sparse_adj_matrix( [hh ww], 1, 1 ); % p is L1 for 4-connect 
sG = sparse( ii, jj, -1, hh*ww, hh*ww ); % construct the sparse matrix

对于 8 连接

[ii jj] = sparse_adj_matrix( [hh ww], 1, inf ); % p is inf for 8-connect 
sG = sparse( ii, jj, -1, hh*ww, hh*ww ); % construct the sparse matrix

此函数可以处理任意维度(大于 2)的规则网格,其邻域不同于 4 或 8(半径大于 1,公制 L1、L2 或 Loo)。

【讨论】:

  • 感谢@Shai!听起来不错!如果我需要用给定值x1 填充上三角矩阵,用另一个值填充下三角矩阵,比如x2。它也有用吗?
  • @Tin - 一旦你有索引ii 和jj 进入矩阵sG 你就可以操作它们:sG = sparse( ii, jj, x1*( ii > jj ) + x2*( ii < jj ), ww*hh, ww*hh );
  • 另一件事@Shai,想象要填充的值x1 和x2 来自两个不同的矩阵M1 和M2 每个大小[hh,ww],我怎么能然后以正确的方式将值放在稀疏矩阵中?上三角部分应来自M1,下三角部分应来自M2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 2018-05-06
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 2020-12-07
相关资源
最近更新 更多