有效地填充基于4像素或8像素邻域的稀疏矩阵

时间:2014-03-02 13:27:34

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

给定大小为[hh,ww]的图像,我想有效地创建一个大小为[hh*ww, hh*ww]的稀疏矩阵。 对于给定像素的每个4或8邻居,稀疏矩阵应填充恒定值(比如-1) 在适当的行(表示评估中的像素)和列(对应的4个邻居或8个邻居的像素)。

例如,考虑一个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-neighborhoods8-neighborhoods

1 个答案:

答案 0 :(得分:2)

如前所述,我编写了一个有效计算稀疏邻接矩阵的函数。请参阅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-connect

[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)。