在矩阵中选择感兴趣区域中的数据(使用Mathematica)

时间:2011-07-13 12:25:31

标签: image-processing wolfram-mathematica

我遇到了(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} ]

然后人们应该得到一张与此相似的图片:

enter image description here

现在我想选择褐色绘制多边形内部的数据。这些数据应该在最后加起来。

我该怎么做? 好吧,我可以使用矩形并通过选择/猜测好的开始和结束索引来构建子矩阵。然后我只需要构建这个子矩阵的总和。但我更喜欢多边形(如果我们不争论多边形线交叉的矩阵值的小问题,则更为精确)。如果我可以通过将多边形“绘制”到矩阵中来直接选择我感兴趣的区域(ROI),我会喜欢它(不再需要选择/猜测矩阵索引)。 有人可以帮助我解决我的问题吗?如果用mathematica无法解决,我还可以使用其他程序吗?

我会对一些帮助和提示感到非常高兴!

3 个答案:

答案 0 :(得分:10)

如果手动选择感兴趣的区域不是问题,那么您可以:

首先,使用可视化创建数据中的图像,以便您以后手动选择:

S = Table[-Sin[i/50.] - Sin[j/50.], {i, 400}, {j, 400}];
img = ReliefImage@S

然后使用前端图形工具在您感兴趣的区域上绘制多边形(右键单击鼠标按钮):

enter image description here

然后获取与多边形对应的蒙版(再次,右键单击按钮):

enter image description here

最后,从掩模中制作二进制图像并使用它来恢复多边形内像素的总和:

Total[S*ImageData@mask, Infinity]

整个过程如下:

enter image description here

编辑:如果您想使用自由手轮廓定义您感兴趣的区域,请使用自由手线工具而不是多边形。确保增加笔划的宽度,以便在绘图时轻松关闭轮廓。您可以通过将“笔触”>“厚度”滑块向右移动来完成此操作。

看起来像这样:

enter image description here

然后使用函数FillingTransform填充无手轮廓的内部来创建蒙版,并像以前一样继续:

enter image description here

答案 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]

产生类似的东西 enter image description here 当您移动定位器时,矩阵的一部分会更新。

要创建多边形,只需添加更多定位器即可。选择矩阵的一部分会更复杂,这取决于你想要输出的东西。

答案 2 :(得分:5)

如果我做对了,你需要找到一个相似像素值的连通分量。

您可以使用图像处理功能:

使用适当的阈值首先Binarize图像。然后使用MorphologicalComponents来识别所有连接的区域。最后,您可以提取图像数据并使用Pick来获取与您感兴趣的组件相对应的像素值。

编辑:以下是这个概念的说明:

enter image description here