如何检测 MATLAB 图中的特定轮廓?
How to detect a particular contour in a MATLAB plot?
我正在尝试从 MATLAB pcolor
图中提取 特定轮廓(从名为 M
的矩阵生成,该矩阵也已上传到此处) 如此图所示:
但是我只想提取 轮廓, 如下所示:
黄色线 是我要提取的线,此处突出显示以供说明。
但我得到的结果如下:
我不需要任何其他 bits/clutter 除了曲线。
我在 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;
你可以做这样的事情,虽然这在数学上并不是很合理,而且对于你提供的特定矩阵有点硬编码..
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)]);
你可以玩玩 sigma
和 threshold
来让边界更接近你真正想要的。
我正在尝试从 MATLAB pcolor
图中提取 特定轮廓(从名为 M
的矩阵生成,该矩阵也已上传到此处) 如此图所示:
但是我只想提取 轮廓, 如下所示:
黄色线 是我要提取的线,此处突出显示以供说明。
但我得到的结果如下:
我不需要任何其他 bits/clutter 除了曲线。
我在 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;
你可以做这样的事情,虽然这在数学上并不是很合理,而且对于你提供的特定矩阵有点硬编码..
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)]);
你可以玩玩 sigma
和 threshold
来让边界更接近你真正想要的。