islocalmax2: problems understanding 'MinProminence'

I want to find local maxima in a 2D intensity image ("cell1.mat") and used the following strategy:
% load data
load('cell1.mat')
% edge preserving smoothing
ds = imbilatfilt(d, .01*(max(d(:))-min(d(:)))^2,10);
% find local max
[TF,P] = islocalmax2(ds,'MinProminence',2000,'MinSeparation',1,'ProminenceWindow',10);
myList = find(TF);
[row,col] = ind2sub(size(ds),myList);
The result can be visualized by
figure,
surf(dsz,'EdgeColor','none','FaceColor','interp');
colormap('jet')
hold on
for np=1:length(myList);
plot3(col(np),row(np),dsz(row(np),col(np)),'o','MarkerEdgeColor','b','MarkerFaceColor','none', 'MarkerSize',12);
end
axis tight
Now I wonder why islocalmax2 found so many small peaks unless I set the 'MinProminence' option to 2000.

回答(2 个)

hello
just fyi I tried with this fex submission (and no smoothing )
result : (6 peaks)
code :
load('cell1.mat')
d = double(d);
contourf(d)
colorbar
hold on
[pks,locs_y,locs_x]=peaks2(d,'MinPeakHeight',max(d(:))*0.75,'Threshold',max(d(:))*0.02);
for k = 1:numel(pks)
plot(locs_x(k),locs_y(k),'r+','markersize',15);
end

1 个评论

another basic alternative , extracting contour lines x,y coordinates and plotting the centroids
load('cell1.mat')
d = double(d);
contourf(d,8)
colorbar
hold on
% extract isoclines
level = max(d(:))*0.75;
[C,h] = contour(d,level*[1 1]);
[m,n] = size(C);
ind = find(C(1,:)==level); % index of beginning of each isocline data in C
ind = [ind n+1]; % add end (+1)
for k = 1:numel(ind)-1
xc = C(1,ind(k)+1:ind(k+1)-1);
yc = C(2,ind(k)+1:ind(k+1)-1);
plot(xc,yc,'m');
% centroid
Xce = mean(xc);
Yce = mean(yc);
plot(Xce,Yce,'+r','markersize',15);
end
hold off

请先登录,再进行评论。

Thank you Mathieu for your alternative approaches. I will definitely give them a try.
I still wonder why the 'MinProminence' property of the islocalmax2 function does not seem to work as described in the doc.

7 个评论

As I run an older release (R2020b) I wasn't even aware that this function existed. It's nice to have functions with so many options but sometimes I just prefer simpler approaches (who said I am lazzy ?)
I aggree with you the right choice of parameters doesn't seem that easy to get the desired result (hence my remark above)
here for example, I would not have expected to get these 3 peaks ...
% load data
load('cell1.mat')
% edge preserving smoothing
ds = imbilatfilt(d, .01*(max(d(:))-min(d(:)))^2,10);
% find local max
[TF,P] = islocalmax2(ds,'MinProminence',2300,'MinSeparation',3,'ProminenceWindow',10);
maxP = sort(unique(P(:)),"descend")
maxP = 427×1
1.0e+03 * 2.6299 2.5383 2.4244 2.2686 2.2178 2.1995 2.1864 2.1858 2.0887 2.0579
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
myList = find(TF);
[row,col] = ind2sub(size(ds),myList);
figure,
% surf(ds,'EdgeColor','none','FaceColor','interp');
contourf(ds)
colormap('parula')
hold on
for np=1:length(myList);
plot(col(np),row(np),'+','MarkerEdgeColor','r', 'MarkerSize',15);
end
axis tight
so maybe with parameters "MaxNumExtrema" it's going to get easier :
well, no indeed :(
results are also very different if you choose ProminenceWindow = 10 or 100 (full size)
my conclusion : ok maybe one day I will use islocalmax2, but for the time being I am not 100% convinced...
% load data
load('cell1.mat')
% edge preserving smoothing
ds = imbilatfilt(d, .01*(max(d(:))-min(d(:)))^2,10);
% find local max
[TF,P] = islocalmax2(ds,'MaxNumExtrema',6,'MinSeparation',3,'ProminenceWindow',100);
myList = find(TF);
[row,col] = ind2sub(size(ds),myList);
figure,
% surf(ds,'EdgeColor','none','FaceColor','interp');
contourf(ds)
colormap('parula')
hold on
for np=1:length(myList);
plot(col(np),row(np),'+','MarkerEdgeColor','r', 'MarkerSize',15);
end
axis tight
and this : simple fast and effective . It ticks all my boxes
load('cell1.mat')
d = double(d);
contourf(d,8)
colorbar
hold on
[zmax,imax,~,~] = extrema2(d); % NB : maxima points in descending order (the bigger first and so on)
[yp,xp] = ind2sub(size(d),imax);
% select N peaks (descending order)
N = 6;
for k = 1:N
plot(xp(k),yp(k),'r+','markersize',15);
end
hold off
Not yet, I had a long discussion with MATLAB tech support and we found that the documentation for islocalmax2 was a bit misleading in how it described prominence estimation.
A problem arises when applying islocalmax2 to noisy data, such that the radius for the lowest closed contour around the local maximum converges to zero, so that the islocalmax2 function returns the peak value but not its prominence.
The doc is/will be changed, but the problem of how to get the prominence of local maxima for noisy data is not yet solved by islocalmax2.
and what about using the other alternatives ?

请先登录,再进行评论。

类别

产品

版本

R2024b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by