【问题标题】:How to detect a particular contour in a MATLAB plot?如何检测 MATLAB 图中的特定轮廓?
【发布时间】:2017-11-10 19:18:12
【问题描述】:

我正在尝试从 MATLAB pcolor 图中提取特定轮廓(从一个名为 M 的矩阵生成,该矩阵也在此处上传),如下图所示: p>


图。原图

但是我想只提取轮廓,如下所示:


图。所需的情节

黄色线是我想提取的,这里为了说明目的而突出显示。

但我得到的结果如下:


图。获得的地块

除了曲线之外,我不需要任何其他位/杂物。

我在matrix M 上应用以下代码以获得错误结果。

[~, threshold] = edge(M, 'sobel');
fudgeFactor = 0.6;
BWs = edge(M,'sobel', threshold * fudgeFactor);
se90 = strel('line',6,70);
se0 = strel('line',3,90);
BWsdil = imdilate(BWs, [se90 se0]);
BWnobord = imclearborder(BWsdil,18);
seD = strel('cube',3);
BWfinal = imerode(BWnobord,seD);
BWfinal = imerode(BWfinal,seD);
pcolor(BWfinal);colormap(jet);   shading interp;   colorbar;

如何只根据需要获取轮廓?我必须使用任何边缘检测过滤器还是必须在应用任何过滤器之前执行平滑处理?

更新:我应用了高斯滤波器并获得了以下图像。上部的噪音仍然存在。我只想提取曲线。 Image after applying a Gaussian filter

sigma = 30;
smoothImage = imgaussfilt(M,sigma);
smoothGradient = imgradient(smoothImage,'CentralDifference');
pcolor(smoothGradient);colormap(jet);   shading interp;   colorbar;

【问题讨论】:

  • 那不是数据的轮廓,是吗?那条线实际上并不在数据中,而是您想从数据中计算出来的东西。你选择这条线的标准是什么?您需要想出一种伪数学方式来描述它,例如下面没有更多“红色”的地方
  • 感谢您的澄清。是的,这条线最初不在数据中,我将其标记为黄色以进行说明。 (这是我需要提取的部分)。我只需要获取与曲线对应的矩阵值,即底部的第一个红色值,之后我不需要杂乱。
  • 是的,但事实上,这太宽泛了。对此没有通用的解决方案,除非您尝试用更具体的术语来定义该行是如何描述的
  • 我更新了应用高斯滤波器后获得的图像。我想要这样的东西(一条漂亮的曲线),上面所有的杂乱或噪音都消失了。该线是从底部定义的每个第一个像素。 (从底部看的第一个红色条目/矩阵值)

标签: image matlab image-processing edge-detection noise-reduction


【解决方案1】:

你可以做这样的事情,虽然这在数学上不是很合理,并且对于你提供的特定矩阵有点硬编码..

clear; close all; clc;
load('Matrix M.mat');

M(181:182,:)=0; % some noise (?) you can skip this line, it will still work..
M(M>0)=1; % binary

% smoothing
sigma = 10;
gauss_submatrix = imgaussfilt(M, sigma); 

% thresholding
threshold = 0.05;
gauss_submatrix(gauss_submatrix<threshold) = 0; 
gauss_submatrix(gauss_submatrix>=threshold) = 1; 

% getting the boundary
a = cumsum(gauss_submatrix);
[rows, cols] = find(a==1);

figure;
hold on;
imagesc(M(1:450,:));
line(cols, rows);
hold off;
ylim([0 450]);
xlim([0 size(M, 2)]);

您可以使用sigmathreshold 让边界更接近您的实际需求。

【讨论】:

  • 我希望消除红线以上的所有噪音。 (杂乱无章的点点滴滴)
  • 您可以执行a(a~=1) = 0 之类的操作,然后矩阵 a 将在轮廓所在的位置显示 0,在其他所有位置显示 0。您可以通过绘制imagesc(a(1:450,:)) 来查看这一点。我不确定你想要的数据格式到底是什么。在解决方案中我给了colsrows 给你边界的坐标。
  • a(a~=1)=0 完美运行。但是图表是倒置的。曲线不是从底部>顶部>底部,而是顶部>底部>顶部。有什么解决办法吗?
  • set(gca,'YDir','normal') 是一种解决方案。
  • 完美解决方案,是的,我需要rowscols 格式的值。!很好的解释
猜你喜欢
  • 1970-01-01
  • 2014-04-04
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多