2011-07-13 76 views
8

我遇到了(自己無法解決的)(mathematica 8.0.1.0-)問題。 我有一個矩陣的測量數據,我想選擇其中的一些,然後將其添加。在矩陣中感興趣的區域中選擇數據(使用Mathematica)

爲了更好地解釋我的問題,這裏有一個簡單的例子。該數據可以由矩陣S產生:

S = Table[ -Sin[i/2] - Sin[j/2], {i,20}, {j,20}]; 

它們可以很好地繪製有:

xmin = N[Min[S]]; 
xmax = N[Max[S]]; 
mycolorfun = Function[ Blend[{Blue,Cyan,Green,Yellow,Red},#] ]; 

MatrixPlot[S, PlotRange -> {All,All,All}, AspectRatio -> 1/1, 
    ColorFunction -> (mycolorfun[ Rescale[ #1{xmin,xmax} ] ]&), 
    ColorFunctionScaling -> False, MaxPlotPoints -> Automatic, 
    FrameLabel -> {y,x} ] 

然後一個應該得到類似這樣的一個畫面:

enter image description here

現在我想選擇棕色繪製的多邊形內的數據。這些數據應該在最後加起來。

我該怎麼做? 好吧,我可以使用矩形,並通過選擇/猜測良好的開始和結束索引建立一個子矩陣。然後我只需要建立這個子矩陣的總和。但我更喜歡多邊形(更精確的說,如果我們不討論矩陣值與多邊形線交叉的小問題)。如果我可以通過將多邊形「繪製」到矩陣中來直接選擇我感興趣的區域(ROI),我會很喜歡它(沒有更多的時間選擇/猜測矩陣索引)。
有人能幫我解決我的問題嗎?如果它不能用mathematica解決,是否還有其他一些我可以使用的程序?

我會很高興的一些幫助和提示!

+0

需要注意的一點是,代碼塊需要在它們之前有一個空行,所以我爲您解決了這個問題。我還將代碼重新格式化了一些,並隱藏了可點擊文本背後的鏈接以提高可讀性。 – rcollyer

+0

感謝您編輯我的問題!由於我在這裏是新手,所以在編輯時遇到了一些問題。我下次嘗試做得更好。 – partial81

+0

沒問題。你在這裏的新事物,並列出你的問題/答案需要練習。 – rcollyer

回答

10

如果選擇的圖形用手感興趣的區域是沒有問題的,那麼你可以:

首先,創建一個使用可視化,使您可以輕鬆手動選擇:

S = Table[-Sin[i/50.] - Sin[j/50.], {i, 400}, {j, 400}]; 
img = [email protected] 
通過獲取對應於您的多邊形(再次,右鍵單擊該面具

enter image description here

如下:

然後用前端的圖形工具,畫在您感興趣的區域的多邊形(右鍵單擊鼠標按鈕)按鈕):

enter image description here

最後,使二值圖像進行掩模,並用它來恢復該多邊形內的像素的總和:

Total[S*[email protected], Infinity] 

整個過程是這樣的:

enter image description here

編輯:如果您想定義的使用手繪輪廓感興趣的區域,用徒手線工具而不是多邊形。確保增加筆劃的寬度,以便在繪製時很容易關閉輪廓。您可以通過將Stroke> Thickness滑塊移動到右側來完成。

這將是這樣的:

enter image description here

然後使用功能FillingTransform填充徒手輪廓內創建蒙版,和以前一樣繼續:

enter image description here

+0

OMG!這正是我一直在尋找的解決方案!非常感謝你! 我只是做了一些小的修改。例如,我在ReliefImage中使用自己的ColorFunction(出於品味問題),並且我正在創建一個額外的矩陣來再次繪製我感興趣的區域。我這樣做:SROI = MatrixForm [S * ImageData @ mask];然後我把張量SROI減少到一個矩陣,其中SROImatrix = SROI [[1,All,All]] [[All,All,1]];所以我可以輕鬆地使用SROImatrix來計算總和(Total [SROImatrix,2])並繪製它。 工作很好,我簡直不敢相信! – partial81

+0

好吧,如果可以畫一條手繪線,而不僅僅是感興趣的區域上的多邊形,這也會很棒。但目前我無法填補封閉手繪線的內部。因爲之後我可以調整多邊形的頂點,所以我並不關心這個問題。大聲笑,我很高興有這樣一個非常好的解決方案:-)再次感謝你這個有用的職位! – partial81

+0

@ user842603我編輯了我的答案以展示如何使用自由輪廓。這應該回答你的問題。此外,我可以請您將標籤圖像處理添加到您的問題嗎? –

5

也許這:

upl = 20; 
s = Table[-Sin[i/2] - Sin[j/2], {i, upl}, {j, upl}]; 

xmin = N[Min[s]]; xmax = N[Max[s]]; mycolorfun = 
Function[Blend[{Blue, Cyan, Green, Yellow, Red}, #]]; 

mp = MatrixPlot[s, PlotRange -> {All, All, All}, AspectRatio -> 1/1, 
ColorFunction -> (mycolorfun[Rescale[#1, {xmin, xmax}]] &), 
ColorFunctionScaling -> False, MaxPlotPoints -> Automatic, 
FrameLabel -> {"y", "x"}]; 
Manipulate[ 
{{x1, y1}, {x2, y2}} = 
Floor /@ {{p1[[1]], upl - p1[[2]]}, {p2[[1]], upl - p2[[2]]}}; 
    mp, 
{{p1, {1, 1}}, Locator}, {{p2, {19, 19}}, Locator}] 

Dynamic[{{x1, y1}, {x2, y2}}] 
Dynamic[[email protected][[y2 ;; y1, x1 ;; x2]] // MatrixForm] 

產生之類的東西 enter image description here 與基體,當您移動定位器實時更新的一部分。

要創建多邊形,只需添加更多的定位器。選擇矩陣的一部分則更加複雜,這取決於你想要輸出的東西。

+0

謝謝你acl(我希望你喜歡德累斯頓;你也會說德語嗎?)他的詳細答案。我嘗試了你的建議,它甚至可以用於我真實的大型(2048 x 2048)矩陣。添加更多的定位器很簡單(很容易就可以讀出它們的座標/指標),但是你是對的:選擇我感興趣的矩陣部分實際上更加複雜。既然我已經閱讀了你的答案,我正在思考並試圖爲兩個以上的定位器(以及五邊形和六邊形等)尋找解決方案,但直到現在我還沒有一個好主意。 – partial81

+0

我可以告訴你,我認爲六角形應該總是足夠好,可以將感興趣的區域包含在矩陣中。 作爲輸出,我可以想象,我產生了一個新的矩陣(由具有最小和最大索引的6個定位符中的4個(或更多)拉伸)。位於感興趣區域之外的新矩陣的部分可以用0填充。因此,如果使用這個新矩陣,事件的總和將被正確計算。 但我真的不知道如何實現這一點。 – partial81

+0

@user是的,如果選擇多邊形區域,提取相關元素並不那麼簡單,並且使用它們可能也很麻煩。也許你可以在這裏提出另一個單獨的更具體的問題。 [德累斯頓很順利,謝謝:)] – acl

5

如果我找對了,你需要找到一個相似像素值的連通分量。

可以使用圖像處理功能:

首先Binarize使用適當的閾值的圖像。然後使用MorphologicalComponents來識別所有連接的區域。最後,您可以提取圖像數據並使用Pick來獲取與您感興趣的組件對應的像素值。

編輯:這裏的概念的說明:

enter image description here

+0

但如果他想自動選擇,不是直接在原始矩陣上做更好嗎?使用例如「位置」? – acl

+0

謝謝Szabolcs這種完全不同的方法。不幸的是,我目前無法上傳其中一個矩陣圖與實際測量數據。有人可以看到,如果我嘗試你的解決方案,我會陷入困境。原因很簡單:有幾個區域具有相似的像素值。就我的分析而言,我必須分別統計這些地區的事件數量。對不起,沒有提到更早! – partial81

+1

@user,看看MorphologicalComponents的第二個例子,你會發現每個斷開的區域都是分開處理的。這意味着,你只需要找到'Binarize'的閾值,這將在你的數據中創建這些不連貫的區域。然後,使用'MorphologicalComponents'來爲每個地區編號。 – rcollyer

相關問題