algorithm - 如何根据强度值创建蒙版或检测图像部分?

标签 algorithm matlab image-processing matrix matlab-figure

我有一个名为 figmat 的矩阵从中我获得了以下 pcolor 图(Matlab-Version R 2016b)。

基本上我只想从此图中提取底部红色高强度线。

我想通过某种方式从矩阵中提取最大值并在主矩阵上创建某种掩码。但我不明白实现这一目标的可能方法。能否借助任何边缘/图像检测算法来完成?

我正在尝试使用以下代码来创建掩码

A=max(figmat);
figmat(figmat~=A)=0;
imagesc(figmat);

但这只给出了最大值的边界。我还需要整个红色色带。

pcolor plot

最佳答案

好吧,我假设红线是线性的,它的值可以唯一地与图片的其余部分分开。让我们生成一些测试数据...

[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 来描述。我给它添加了一点噪音,使它更逼真。

Test Data

我们现在选择 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);

xvecyvec 现在包含所有值的坐标 > thresh。

Filtered points

最后一步是对所有点执行一些线性多项式。

pp = polyfit(xvec(idx),yvec(idx),1)

pp =

    0.1946    1.0134

显然,这些大致是 y = 0.2*x+1 的系数。

Fitted line

我不知道这是否也适用于您的数据,因为我做了一些假设。必须仔细选择阈值水平。如果你真的想自动处理你的图像,也许必须做一些预处理来动态检测这个级别。可能还有一种更简单的方法...但对我来说,这个方法很简单,不需要任何工具箱。

关于algorithm - 如何根据强度值创建蒙版或检测图像部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44836130/

相关文章:

java - 解码字符串有多少种方法?

matlab - 无法收听 UIAxes 的 YLim 属性

image-processing - 围绕自定义焦点裁剪图像并调整图像大小

c++ - 特定颜色范围内的阈值图像

algorithm - 快速计算 `dot(a(n:end), b(1:end-n))`

algorithm - 从多个集合中找到元素的最佳组合

c++ - 有效关联事件

c++ - 如何使用 Eigen 库实现 max(A),其中 A 是双复数矩阵

matlab - 定向梯度直方图(HOG)特征matlab

python - 使用 OpenCV 或 Gimp 使用水洗墨水提高旧手写出生声明的质量