假設我們有一個這樣的陣列:
A = peaks
A(A<0)=0 % Remove negative values to make things a bit more simple.
我想撰寫一個腳本,能夠選擇 A 中包含的峰的整個體積。
例如,包括圍繞區域最大值的所有值,直到它達到 0 或區域最小值為止。
以下是關于類似但更復雜主題的已回答問題的鏈接。


在這些結果中,確定了 6 個峰,但我想要的是 3 個分離的峰,如下圖所示:

希望這足夠清楚。
uj5u.com熱心網友回復:
我針對這個問題發布了另一個單獨的答案,因為它是一種完全不同的方法,它是對第一個方法的補充,具體取決于您要解決的具體問題
這種方法基于“在峰內”的另一種定義。
如果在進行梯度上升時,位置(在上升程序中迭代)收斂到峰 #k 的最大值位置,我們將說一個點(Xi,Yi)屬于峰。#k(Xi_,Yi_)
這個程序可以通過使用來可視化
我們將使用
請注意,矩陣filtMtx允許您索引每個峰,X(filtMtx == ii),Y(filtMtx == ii),im(filtMtx == ii)是(X,Y,Z)與 相關的所有點的坐標peak ii。
另請注意,這種方式并不能保證所有點都將鏈接到最大值(例如,區域最小值的梯度為零,并且不會鏈接到任何東西),但可以保證您的大部分點都將鏈接到最大值。
uj5u.com熱心網友回復:
可能有更好(更快)的方法,但下面的方法似乎作業正常。
因此,您想要做的問題是,盡管可以
如果要提取原始陣列中與每個區域對應的值:
[sz1,sz2] = size(im);
Output_Matrices = zeros(sz1,sz2,numel(s));
for i=1:numel(s)
tmp=im*0;
tmp(s(i).PixelIdxList)=1;
tmp2=tmp.*im;
% The maximum amplitude and location
[refV,b]=max(tmp2(:));
[x2,y2]=ind2sub(size(im),b);
% select the region around local max amplitude
tmp=bwselect(im>refV*Best_tresholds(i),y2,x2,4);
[xi,yi]=find(tmp);
hold on, plot(yi,xi,'r.')
hold on, text(y2 10,x2,num2str(i),'Color','white','FontSize',16)
% Your output matrix i-th slice holds the values for the i_th peak
Output_Matrices(xi,yi,i) = im(xi,yi);
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/489878.html
標籤:matlab
