我遇到了(mathematica 8.0.1.0-)问题,我自己无法解决。 我有一个矩阵中的测量数据,我想选择其中的一些,然后将它们加起来。
为了更好地解释我的问题,这里有一个简单的例子。数据可以由矩阵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} ]
然后人们应该得到一张与此相似的图片:
现在我想选择褐色绘制多边形内部的数据。这些数据应该在最后加起来。
我该怎么做? 好吧,我可以使用矩形并通过选择/猜测好的开始和结束索引来构建子矩阵。然后我只需要构建这个子矩阵的总和。但我更喜欢多边形(如果我们不争论多边形线交叉的矩阵值的小问题,则更为精确)。如果我可以通过将多边形“绘制”到矩阵中来直接选择我感兴趣的区域(ROI),我会喜欢它(不再需要选择/猜测矩阵索引)。 有人可以帮助我解决我的问题吗?如果用mathematica无法解决,我还可以使用其他程序吗?
我会对一些帮助和提示感到非常高兴!
答案 0 :(得分:10)
如果手动选择感兴趣的区域不是问题,那么您可以:
首先,使用可视化创建数据中的图像,以便您以后手动选择:
S = Table[-Sin[i/50.] - Sin[j/50.], {i, 400}, {j, 400}];
img = ReliefImage@S
然后使用前端图形工具在您感兴趣的区域上绘制多边形(右键单击鼠标按钮):
然后获取与多边形对应的蒙版(再次,右键单击按钮):
最后,从掩模中制作二进制图像并使用它来恢复多边形内像素的总和:
Total[S*ImageData@mask, Infinity]
整个过程如下:
编辑:如果您想使用自由手轮廓定义您感兴趣的区域,请使用自由手线工具而不是多边形。确保增加笔划的宽度,以便在绘图时轻松关闭轮廓。您可以通过将“笔触”>“厚度”滑块向右移动来完成此操作。
看起来像这样:
然后使用函数FillingTransform
填充无手轮廓的内部来创建蒙版,并像以前一样继续:
答案 1 :(得分: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[N@s[[y2 ;; y1, x1 ;; x2]] // MatrixForm]
产生类似的东西 当您移动定位器时,矩阵的一部分会更新。
要创建多边形,只需添加更多定位器即可。选择矩阵的一部分会更复杂,这取决于你想要输出的东西。
答案 2 :(得分:5)
如果我做对了,你需要找到一个相似像素值的连通分量。
您可以使用图像处理功能:
使用适当的阈值首先Binarize图像。然后使用MorphologicalComponents来识别所有连接的区域。最后,您可以提取图像数据并使用Pick
来获取与您感兴趣的组件相对应的像素值。
编辑:以下是这个概念的说明: