Region of interest definition algorithm
    4 次查看(过去 30 天)
  
       显示 更早的评论
    
I am trying to build an algorithm that can detect the edges of a particle. The function attached itterates radially outword from a point and detects if each location that is either a localmaximum or exceeds a threshold. As shown in the attached image this should allow the code to independently identify the edges of each low point in the data matrix.
The problem that I have with my current code is that because it iterates both radially and outward it is incredibly time consuming. Can anyone suggest something better? 
I have also attached some sample data:
function [S_boarderx,S_boardery,Board_val] = shadowedge(im,shadowx,shadowy,R, dirmax, thres, PM)
    SS = im;
    [dimx, dimy] = size(SS,1,2);
    xx = shadowx;
    yy = shadowy;
    shadow_loc = sub2ind([dimx dimy], xx, yy);
    shadow_Val = SS(shadow_loc);
    thres_val = shadow_Val+shadow_Val*thres;
for t = 1:dirmax
    for j=1:R 
        theta = (2*pi*t)/dirmax;
        Sx = xx+round(j*cos(theta));
        Sy = yy+round(j*sin(theta));
        Sx(Sx<= 1) = 2;
        Sy(Sy<= 1) = 2;
        Sx(Sx>= dimx-1) = dimx-1;
        Sy(Sy>= dimy-1) = dimy-1;    
        val = SS(sub2ind([dimx dimy], Sx, Sy));
        if val >= thres_val 
            S_boarderx(t,:) = Sx;
            S_boardery(t,:) = Sy;
            break 
        elseif sum(sub2ind([dimx dimy],Sx,Sy) == find(islocalmax(SS,'MinProminence',PM)))...
                || sum(sub2ind([dimx dimy],Sx+1,Sy+1) == find(islocalmax(SS,'MinProminence',PM)))...
                || sum(sub2ind([dimx dimy],Sx+1,Sy) == find(islocalmax(SS,'MinProminence',PM)))...
                || sum(sub2ind([dimx dimy],Sx,Sy+1) == find(islocalmax(SS,'MinProminence',PM)))...
                || sum(sub2ind([dimx dimy],Sx-1,Sy-1) == find(islocalmax(SS,'MinProminence',PM)))...
                || sum(sub2ind([dimx dimy],Sx-1,Sy) == find(islocalmax(SS,'MinProminence',PM)))...
                || sum(sub2ind([dimx dimy],Sx,Sy-1) == find(islocalmax(SS,'MinProminence',PM)))
            S_boarderx(t,:) = Sx;
            S_boardery(t,:) = Sy;
            break
        else
            S_boarderx(t,:) = Sx;
            S_boardery(t,:) = Sy;
        end
    end
end
Board_loc = sub2ind([dimx dimy], S_boarderx(:), S_boardery(:));
Board_val = SS(Board_loc);
10 个评论
  Image Analyst
      
      
 2021-6-26
				@Brittney Gorman, Sorry I didn't see your reply until now.  Are you still having a problem with this code?
回答(0 个)
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
