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