Algorithm 如何根据强度值创建遮罩或检测图像部分?

Algorithm 如何根据强度值创建遮罩或检测图像部分?,algorithm,matlab,image-processing,matrix,matlab-figure,Algorithm,Matlab,Image Processing,Matrix,Matlab Figure,我有一个名为的矩阵,从中我获得以下pcolorplot(Matlab版本R 2016b) 基本上,我只想从这个图中提取底部红色的高强度线 我想用某种方法从矩阵中提取最大值,并在主矩阵上创建某种遮罩。但我不明白实现这一目标的可能途径。可以借助任何边缘/图像检测算法来完成吗 我试着用下面的代码创建一个掩码 A=max(figmat); figmat(figmat~=A)=0; imagesc(figmat); 但这只给出了最大值的边界。我还需要整个红色的带子 好的,我假设红线是线性的,它的值可以唯

我有一个名为的矩阵,从中我获得以下
pcolor
plot(Matlab版本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
。稍后,我们希望使用一维数据,因此我们对所有内容进行重塑

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
现在包含所有值的坐标>阈值

最后一步是在所有点上做一些线性多项式

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

pp =

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


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

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

[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
。稍后,我们希望使用一维数据,因此我们对所有内容进行重塑

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
现在包含所有值的坐标>阈值

最后一步是在所有点上做一些线性多项式

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

pp =

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

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

假设:

  • 只有一个波段需要提取
  • 它始终具有最大值
  • 它是线性的
  • 我也可以接受这种情况,只需稍作改动:

    首先,我们得到矩阵中值的分布,并在顶部值中寻找一个总体,它可以与较小的值区分开来。这是通过在柱状图上找到最大值
    x(i)
    来实现的:

  • 是局部最大值(其箱位高于
    x(i+1)
    x(i-1)
  • 上面的值比里面的值多(箱子高度
    x(i+1)
    x(end)
    <箱子高度
    x
    ):
  • 这是如何做到的:

    [h,x] = histcounts(figmat); % get the distribution of intesities
    d = diff(fliplr(h)); % The diffrence in bin height from large x to small x
    band_min_ind = find(cumsum(d)>size(figmat,2) & d<0, 1); % 1st bin that fit the conditions
    flp_val = fliplr(x); % the value of x from large to small
    band_min = flp_val(band_min_ind); % the value of x that fit the conditions
    
    如果我们把它画出来,我们可以看到探测带所在的红线:

    接下来,我们可以将这条线加厚,以更好地表示这条线:

    thick = max(sum(mA)); % mode thickness of the line
    tmp = (1:thick)-ceil(thick/2); % helper vector for expanding
    rows = bsxfun(@plus,tmp.',floor(f_line(1:size(A,2)))); % all the rows for each column
    rows(rows<1) = 1; % make sure to not get out of range
    rows(rows>size(A,1)) = size(A,1); % make sure to not get out of range
    inds = sub2ind(size(A),rows,repmat(1:size(A,2),thick,1)); % convert to linear indecies
    mA(inds) = true; % add the interpolation to the mask
    result = figmat.*mA; % apply the mask on figmat
    
    假设:

  • 只有一个波段需要提取
  • 它始终具有最大值
  • 它是线性的
  • 我也可以接受这种情况,只需稍作改动:

    首先,我们得到矩阵中值的分布,并在顶部值中寻找一个总体,它可以与较小的值区分开来。这是通过在柱状图上找到最大值
    x(i)
    来实现的:

  • 是局部最大值(其箱位高于
    x(i+1)
    x(i-1)
  • 上面的值比里面的值多(箱子高度
    x(i+1)
    x(end)
    <箱子高度
    x
    ):
  • 这是如何做到的:

    [h,x] = histcounts(figmat); % get the distribution of intesities
    d = diff(fliplr(h)); % The diffrence in bin height from large x to small x
    band_min_ind = find(cumsum(d)>size(figmat,2) & d<0, 1); % 1st bin that fit the conditions
    flp_val = fliplr(x); % the value of x from large to small
    band_min = flp_val(band_min_ind); % the value of x that fit the conditions
    
    如果我们把它画出来,我们可以看到探测带所在的红线:

    接下来,我们可以将这条线加厚,以更好地表示这条线:

    thick = max(sum(mA)); % mode thickness of the line
    tmp = (1:thick)-ceil(thick/2); % helper vector for expanding
    rows = bsxfun(@plus,tmp.',floor(f_line(1:size(A,2)))); % all the rows for each column
    rows(rows<1) = 1; % make sure to not get out of range
    rows(rows>size(A,1)) = size(A,1); % make sure to not get out of range
    inds = sub2ind(size(A),rows,repmat(1:size(A,2),thick,1)); % convert to linear indecies
    mA(inds) = true; % add the interpolation to the mask
    result = figmat.*mA; % apply the mask on figmat
    

    红色是一个范围<代码>figmat(figmat-10)=0试试适合你的东西是的。但我不想硬编码值为0到10,因为这不是每个绘图的常数。(该值不断变化,但通常我希望提取最大强度值,如红色)。有没有办法使用强度检测来实现这一点?你认为这条红带有什么特性?可以假定它是线性的吗?可以有多个乐队吗?在-25处似乎有一条微弱的第二线。与其他局部最大值的强度距离是多少?如果没有任何信息,很难检测和提取红线,因为它可能是不连续的,也可能不是唯一的。它与您的有什么不同?@EBH在我的上一个问题中,我没有完整的图表,斜率的值比其他所有图都少。之前的图像是经过处理的图像,而不是根据原始值生成的直接pcolor绘图。在这一个我有完整的g