2011-07-13 26 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

相关问题