2015-02-11 101 views
0

我對下面的圖像進行曲率分析,需要能夠測量峯之間的距離。請有人可以告訴我們如何做到這一點?我只對圖表的正面部分感興趣,如果還可以提取每個峯的高度,它將很有用。MATLAB網格圖中峯的分析

我已經嘗試使用findpeaks,但它要求一個向量,我沒有一個給它。

我正在使用在線Mathworks資源庫中的surfature函數。對於這個問題,'X'是我輸入高斯濾波器的圖像:

G = fspecial('gaussian',[19 19],6); 
    X = imfilter(X,G,'same'); 

    [XI YI]=meshgrid(1:size(X,2), 1:size(X,1)); % Just create the x and y 
    [K, H, P1, P2, C, SI]=surfature(XI, YI, X); 

    figure(2); 

    mesh(surfature(XI, YI, X)); colormap gray; 

我會非常感謝任何幫助。

curve_image1

回答

1

後面findpeaks爲一維數組/向量的邏輯是,它看起來在本地3米元件的街區和看到窗口的中心是否是最大元素。如果是的話,這可能是一個高峯。您還需要應用一個閾值以確保不會出現噪音較低的振幅峯值。在2D中,它非常簡單。看看3 x 3像素的鄰域(或者它可以是任何你想要的大小),看看最終的最大值是否與每個鄰域的中心位置相同。如果您的數據非常嘈雜,您可以增加鄰域的大小來分析。增加鄰域的大小可以濾除更多的噪聲,但代價是可能會丟失彼此相鄰的有效強峯值。這不幸的是你必須玩,以便爲你的應用程序做好準備。

因爲您將此帖標記爲圖像處理,我建議您在圖像處理視圖中查看此內容。具體來說,請看imdilate的形態學擴張。膨脹相當於一個最大的過濾器,所以你可以做的就是做這樣的事情。我不知道您是否使用KHP1P2,所以相應地修改:

thresh = 0.01; 
sur = H; %// or K, P1, P2 
sur(isnan(sur)) = 0; %// Set any NaN values to zero 
N = 3; 
se = strel('square', N); 
out = imdilate(sur, se); 

pks = out == sur & sur > thresh; 

pks將是一個二維數組,其大小爲存儲在H平均曲率相同。我們也只想看看正峯值,所以我們還需要檢查是否H > threshthresh是一個閾值,以確保我們不看低振幅峯值。我不知道你想使用哪一個,所以我會把它留給你。一旦你的峯值發生在那裏的位置,你可以使用pks索引到任何你想要H或以確定哪些實際的山峯有:

pks_val = sur(pks); 

如果你想爲實際XYZ位置峯,你可以這樣做:

xvals = XI(pks); 
yvals = YI(pks); 
zvals = X(pks); 

XIYI我假設是一個點的一些meshgrid(由變量名去),而X是一個圖像,你可以找到在哪裏在峯值也對應的圖像中。

現在,對於你對峯間距離的問題,這是非常含糊的,因爲你有2個自由度。假如你有這樣的形象:

0 0 1 0 0 
0 0 0 0 0 
0 1 1 1 0 
0 0 0 0 0 
0 0 1 0 0 

如果我們做了一個峯值檢測,有1將被歸類爲峯值的任何值。如果你想找到峯值之間的距離......好的......在哪個方向?例如,查看最中心位置,您將使用哪個單獨距離值將任何其他峯值之間的距離分配給中心?你會用左邊那個嗎?對?最佳?底部?你有兩個自由度,並試圖將某些東西量化爲一個單一的值,所以肯定會有含糊之處。

我的建議是重新考慮你試圖用這些峯實際做什麼,並做除測量峯之間距離以外的其他事情。

+0

感謝您使用此答案的時間,這非常有幫助。請允許我多解釋一下...... 峯表示動物骨架的位置和高度。我正在嘗試測量這個骨幹的屬性,例如椎骨間距等。這是我能夠從我的圖像中提取數據的最佳方式。如果你有更好的解決方案,我會非常感激聽到它。上述工作是4個月的研究和測試的結果,所以我歡迎任何新的想法。 – Adam893 2015-02-12 10:16:14

+0

嘗試H,K,P1或P2時,我會得到以下錯誤: 使用imdilate時出錯 預期的輸入數字1 IM爲非NaN。 Image.internal.morphop錯誤> ParseInputs(line 125) validateattributes(A,{'numeric''logical'},... image.internal.morphop(第21行)中的錯誤 [A,se,pre_pad ,... imdilate中的錯誤(行120) B = images.internal.morphop(A,se,'dilate',mfilename,varargin {:}); cis_v2_0錯誤(行128) out = imdilate sur,se); – Adam893 2015-02-12 10:44:05

+0

Aha。用isnan過濾掉NaN值,在我上班的路上更快地完成 – rayryeng 2015-02-12 13:11:47