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,并像以前一样继续:

也许这个:
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)
它产生的东西就像
当您移动定位器时,矩阵的一部分会更新.
要改为创建多边形,只需添加更多定位器即可.选择矩阵的一部分会更复杂,这取决于你想要输出的东西.
如果我做对了,你需要找到一个相似像素值的连通分量.
您可以使用图像处理功能:
首先使用适当的阈值对图像进行二值化.然后使用将识别所有连接区域的MorphologicalComponents.最后,您可以提取图像数据并使用它Pick来获取与您感兴趣的组件相对应的像素值.
编辑:这是一个概念的例证:
