How to compare a matrix element with its neighbours without using a loop in MATLAB?

前端 未结 3 1670
天涯浪人
天涯浪人 2021-02-20 09:06

I have a matrix in MATLAB. I want to check the 4-connected neighbours (left, right, top, bottom) for every element. If the current element is less than any of the neighbours the

3条回答
  •  生来不讨喜
    2021-02-20 09:27

    If you don't have access to the Image Processing Toolbox, another way to accomplish this is by constructing four matrices representing the top, right, bottom and left first differences for each point and then searching for corresponding elements in all four matrices that are non-negative (i.e. the element exceeds all of its neighbours).

    Here's the idea broken down...

    Generate some test data:

    >> sizeA = 3;
    A = randi(255, sizeA)
    
    A =
    
       254   131    94
       135    10   124
       105   191    84
    

    Pad the borders with zero-elements:

    >> A2 = zeros(sizeA+2) * -Inf;
    A2(2:end-1,2:end-1) = A
    
    A2 =
    
         0     0     0     0     0
         0   254   131    94     0
         0   135    10   124     0
         0   105   191    84     0
         0     0     0     0     0
    

    Construct the four first-difference matrices:

    >> leftDiff = A2(2:end-1,2:end-1) - A2(2:end-1,1:end-2)
    
    leftDiff =
    
       254  -123   -37
       135  -125   114
       105    86  -107
    
    >> topDiff = A2(2:end-1,2:end-1) - A2(1:end-2,2:end-1)
    
    topDiff =
    
       254   131    94
      -119  -121    30
       -30   181   -40
    
    >> rightDiff = A2(2:end-1,2:end-1) - A2(2:end-1,3:end)
    
    rightDiff =
    
       123    37    94
       125  -114   124
       -86   107    84
    
    >> bottomDiff = A2(2:end-1,2:end-1) - A2(3:end,2:end-1)
    
    bottomDiff =
    
       119   121   -30
        30  -181    40
       105   191    84
    

    Find the elements that exceed all of the neighbours:

    indexKeep = find(leftDiff >= 0 & topDiff >= 0 & rightDiff >= 0 & bottomDiff >= 0)
    

    Create the resulting matrix:

    >> B = zeros(sizeA);
    B(indexKeep) = A(indexKeep)
    
    B =
    
       254     0     0
         0     0   124
         0   191     0
    

    After wrapping this all into a function and testing it on 1000 random 100x100 matrices, the algorithm appears to be quite fast:

    >> tic;
    for ii = 1:1000
    A = randi(255, 100);
    B = test(A);
    end; toc
    Elapsed time is 0.861121 seconds.
    

提交回复
热议问题