【发布时间】: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