总的来说,rengesearch 绝对是解决这个问题的最好方法。
但是,由于您没有 Statistics and Machine Learning Toolbox,您可以尝试使用 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),您想找到它的邻居,只需从 distMatInitial 的中心复制一个补丁,即可计算其距离图而无需再次调用 bwdist:
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
因此,如果您选择尝试这种方法,请不要忘记处理这些情况。