【问题标题】:Find all neighbors within specified distance of each element in 2-D Array查找二维数组中每个元素指定距离内的所有邻居
【发布时间】:2023-11-20 19:16:01
【问题描述】:

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

这个算法的一个步骤是:

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

D 和 M 都是二维数组。

有没有什么函数可以找到二维数组中每个元素指定距离内的所有邻居?

我无法使用 rangesearch(),所以我不知道它能否解决我的问题。

提前谢谢你!

【问题讨论】:

    标签: matlab image-processing multidimensional-array


    【解决方案1】:

    总的来说,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 
    

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

    【讨论】:

      最近更新 更多