我想使用Matlab实现自适应分水岭分割。
此算法的一个步骤是:
逐个像素地扫描标记图。如果M(x0,y0)为1,则寻找半径为D(x,y)的邻域中的虚假最大值。
D和M都是二维数组。
是否有任何函数可以在2-D数组中找到每个元素指定距离内的所有邻居?
我无法使用rangesearch()所以我不知道剂量可以解决我的问题。
提前谢谢!
答案 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
因此,如果您选择尝试这种方法,请不要忘记处理这些情况。