我有一个名为 figmat
的矩阵从中我获得了以下 pcolor
图(Matlab-Version R 2016b)。
基本上我只想从此图中提取底部红色高强度线。
我想通过某种方式从矩阵中提取最大值并在主矩阵上创建某种掩码。但我不明白实现这一目标的可能方法。能否借助任何边缘/图像检测算法来完成?
我正在尝试使用以下代码来创建掩码
A=max(figmat);
figmat(figmat~=A)=0;
imagesc(figmat);
但这只给出了最大值的边界。我还需要整个红色色带。
最佳答案
好吧,我假设红线是线性的,它的值可以唯一地与图片的其余部分分开。让我们生成一些测试数据...
[x,y] = meshgrid(-5:.2:5, -5:.2:5);
n = size(x,1)*size(x,2);
z = -0.2*(y-(0.2*x+1)).^2 + 5 + randn(size(x))*0.1;
figure
surf(x,y,z);
此脚本生成表面函数。它的最大值集 (x,y) 可以用线性函数 y = 0.2*x+1 来描述。我给它添加了一点噪音,使它更逼真。
我们现在选择 z 小于最大值的所有点,比方说,最大值的 95%。因此可以使用find
。后来,我们要用一维数据,所以我们reshape
一切。
thresh = min(min(z)) + (max(max(z))-min(min(z)))*0.95;
mask = reshape(z > thresh,1,n);
idx = find(mask>0);
xvec = reshape(x,1,n);
yvec = reshape(y,1,n);
xvec
和 yvec
现在包含所有值的坐标 > thresh。
最后一步是对所有点执行一些线性多项式。
pp = polyfit(xvec(idx),yvec(idx),1)
pp =
0.1946 1.0134
显然,这些大致是 y = 0.2*x+1 的系数。
我不知道这是否也适用于您的数据,因为我做了一些假设。必须仔细选择阈值水平。如果你真的想自动处理你的图像,也许必须做一些预处理来动态检测这个级别。可能还有一种更简单的方法...但对我来说,这个方法很简单,不需要任何工具箱。
关于algorithm - 如何根据强度值创建蒙版或检测图像部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44836130/