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

par*_*l81 8 wolfram-mathematica image-processing

我有一个(mathematica 8.0.1.0-)问题,我自己无法解决.我有一个矩阵中的测量数据,我想选择其中的一些,然后将它们加起来.

为了更好地解释我的问题,这是一个简单的例子.数据可以由矩阵S产生:

S = Table[ -Sin[i/2] - Sin[j/2], {i,20}, {j,20}];
Run Code Online (Sandbox Code Playgroud)

它们可以很好地绘制:

xmin = N[Min[S]]; 
xmax = N[Max[S]]; 
mycolorfun = Function[ Blend[{Blue,Cyan,Green,Yellow,Red},#] ];
Run Code Online (Sandbox Code Playgroud)

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

那么应该得到一张类似于这张的照片:

在此输入图像描述

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

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

我会很乐意提供一些帮助和提示!

Mat*_*sio 10

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

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

S = Table[-Sin[i/50.] - Sin[j/50.], {i, 400}, {j, 400}];
img = ReliefImage@S
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

在此输入图像描述

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

Total[S*ImageData@mask, Infinity]
Run Code Online (Sandbox Code Playgroud)

整个过程如下:

在此输入图像描述

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

这看起来像这样:

在此输入图像描述

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

在此输入图像描述


acl*_*acl 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]
Run Code Online (Sandbox Code Playgroud)

它产生的东西就像 在此输入图像描述 当您移动定位器时,矩阵的一部分会更新.

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


Sza*_*lcs 5

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

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

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

编辑:这是一个概念的例证:

在此输入图像描述