Search code examples
matlabmatrixmaximage-rotation

Find maximum intensity point from center in all directions in matlab matrix


I have images (matrix) in matlab and I look for the maximum intensity point from the center of the matrix in every direction to obtain edges. (I use the gradient of the image and I'm looking for a quadrilateral).

For M (n,m) My first try was to consider one vector M(1:n/2, m/2), look for the maximum and rotate the image to find all maximums in all other directions. But : the imrotate function causes many errors (crop or loose) and the reconstructed image doesn't correspond to the shape of the original one.

I tried also to consider vectors directly in the original image from center to all points in the perimeter... but it's not easy!

Do you have an idea to solve this ? Any subtlety in Matlab I don't know?

Thanks guy;

My actual code is

 s_im = size(ima, 2)/2;
 ima_max = zeros(size(ima));
 ima_new = zeros(size(ima));    


  for a=0:359
    im_r = imrotate(ima, a, 'crop');
    c= floor(size(im_r,1)/2);
    vect_h1 = im_r(c, 1:c);
    l = length(vect_h1);


    [~, id_h1] = max(vect_h1(:));

    [x,y] = rotatePoint([id_h1, c], [c,c], deg2rad(a-180));       
    ima_max(floor(y), floor(x))= 1;
    ima_new(floor(y), floor(x)) = 1;

An error is also that the center computed is not the same in all images...


Solution

  • I suppose you can use improfile to get the intensity along rays emitting from the center pixel:

    sz = size(ima);
    X = sz(2);
    Y = sz(1);
    all_end_points = cat(1, [ones(1,Y); 1:Y]', ...
                            [1:X; Y*ones(1,X)]', ...
                            [X*ones(1,Y); Y:-1:1]', ...
                            [X:-1:1; ones(1,X)]' );
    cent = repmat( [X/2 Y/2], [size(all_end_points,1), 1]);
    all_profs = improfile(ima, all_end_points(:,1), all_end_points(:,2));
    

    Now you have all the profiles from the center, you can look for the max intensity along each.