在2-D数组中查找每个元素指定距离内的所有邻居

时间:2016-04-10 12:30:45

标签: matlab image-processing multidimensional-array

我想使用Matlab实现自适应分水岭分割。

此算法的一个步骤是:

逐个像素地扫描标记图。如果M(x0,y0)为1,则寻找半径为D(x,y)的邻域中的虚假最大值。

D和M都是二维数组。

是否有任何函数可以在2-D数组中找到每个元素指定距离内的所有邻居?

我无法使用rangesearch()所以我不知道剂量可以解决我的问题。

提前谢谢!

1 个答案:

答案 0 :(得分:0)

一般来说,rengesearch绝对是解决这个问题的最佳方法。 但是,由于您没有统计和机器学习工具箱,您可以尝试使用MATLAB的bwdist函数。

bwdist函数基本上是一个距离变换,它还可以返回某个点的距离图。 bwdist的第二个参数定义了要使用的距离函数的类型(默认距离函数是欧几里德)。

示例:

%inputMat is the original matrix
inputMat = ones(10,10);
%(Px,Py) is the point to calculate the distance from
Px = 5; Py = 5;

%calls bwdist
tempMat = false(size(inputMat));
tempMat(Py,Px) = true;
distMat = bwdist(tempMat);

%search for neighbour pixels 
neigbourPixels = distMat < D(Px,Py);
[Y, X] = ind2sub(size(neigbourPixels),find(neigbourPixels));

%prints result
[Y,X]

结果:

ans =

 4     4
 5     4
 6     4
 4     5
 5     5
 6     5
 4     6
 5     6
 6     6

运行时优化

这种方法的缺点是,如果你多次调用它,bwdist的计算时间可能会很慢。因此,如果运行时很重要,我建议进行以下优化:

第一阶段:

在大矩阵上计算一次距离图,如下所示:

N = max(size(inputMat)); 
tempMat = false(N,N);
tempMat(N/2,N/2) = true;
distMatInitial = bwdist(tempMat);

第二阶段:

给定一个新点(Px,Py)你想要找到它的邻域,计算它的距离图而不再调用bwdist,只需从distMatInitial的中心复制一个补丁:

Mp = 30; %determines maximal patch size
distsMapFromPxPy = zeros(size(inputMat));
distsMapFromPxPy(Py-Mp:Py+Mp,Px-Mp:Px+Mp) = distMatInitial(N/2-Mp,N/2+Mp,N/2-Mp:N/2+Mp);

*请注意,此示例不处理边缘情况,例如:

(1)(Py-Mp)<0 (2)(Py+Mp)>m (3)(Px-Mp)<0 (4)(Px+Mp)>n 

因此,如果您选择尝试这种方法,请不要忘记处理这些情况。