tags:

views:

79

answers:

1

I use imtophat to apply a filter to an m x n array. I then find the local max using imextendedmax(). I get mostly 0's everywhere except for 1's in the general areas where I am expecting a local max. The weird thing is, though, that I don't get just one local max. Instead in these places I get MANY elements with 1's such as

00011100000
00111111000
00000110000

yet the values there are close but NOT equal so I would expect that there would be one that is higher than all of the rest. So I'm wondering a) if this is a bug and how I might fix it and b) how you would choose choose the element of these 1's with the highest value.

+2  A: 

a) This is a feature. You are calling imextendedmax with two input arguments. The second input is a measure for how different pixels can be from the maximum and still be counted for the extended maximum.

b) You can choose the elements with the highest value using max on the pixels within the group.

%# for testing, create a  mask with two groups and an image of corresponding size
msk = repmat([00011100000;...
00111111000;...
00000110000],1,2);

img = rand(size(msk));
imSize = size(img);

%# to find groups of connected ones, apply connected component labeling
cc = bwconncomp(msk);

%# loop through all groups and find the location of the maximum intensity pixel
%# You could do this without loop, but it would be much less readable
maxCoordList = zeros(cc.NumObjects,2);
for i = 1:cc.numObjects
    %# read intensities corresponding to group
     int = img(cc.PixelIdxList{i});

    %# find which pixel is brightest
    [maxInt,maxIdx] = max(int);

    %# maxIdx indexes into PixelIdxList, which indexes into the image.
    %# convert to [x,y]
    maxCoordList = ind2sub(imSize,cc.PixelIdxList{i}(maxIdx));
end

%# confirm by plotting
figure
imshow(img,[])
hold on
plot(maxCoordList(:,2),maxCoordList(:,1),'.r')
Jonas

related questions