1

Je suis en train d'extraire un plan particulier d'une parcelle Matlab pcolor (généré à partir d'une matrice nommée M qui est téléchargé ici aussi) comme le montre cette image.Comment détecter un contour particulier dans un graphe MATLAB?

Original Plot
Fig originale Terrain

Cependant, je voudrais extraire le seul contour , comme indiqué ici:

Required Plot
Fig. Terrain requis

La ligne de couleur jaune est celui que je voudrais extraire et est mis en évidence ici à des fins d'illustration.

Mais je reçois le résultat comme suit:.

Obtained Plot
Figure Obtenu Terrain

Je ne nécessitent pas d'autres bits/encombrement en dehors de la courbe.

J'applique le code suivant sur le matrix M pour obtenir le résultat erroné.

[~, 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; 

Comment obtenir le contour uniquement si nécessaire? Dois-je utiliser des filtres de détection de bord ou dois-je effectuer un lissage avant d'appliquer des filtres? MISE À JOUR: J'ai appliqué un filtre de guassian et j'ai obtenu l'image suivante:

Le bruit dans les parties supérieures existe toujours. Je veux seulement que la courbe soit extraite. Image after applying a Gaussian filter

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

Ce n'est pas un contour des données, est-il? Cette ligne n'est pas vraiment dans les données, c'est quelque chose que vous voulez calculer à partir de vos données. Quel est votre critère pour choisir cette ligne? Vous devez trouver une manière pseudo-mathématique de le décrire, par ex. Le point où il n'y a plus de "rouge" ci-dessous –

+0

Merci pour la clarification. Oui, la ligne n'est pas à l'origine dans les données et je l'ai marqué en jaune pour l'illustration. (Quelle est la partie que j'ai besoin d'extraire). Je n'ai besoin que des valeurs matricielles correspondant à la ligne courbe, c'est-à-dire les premières valeurs rouges du bas et après cela je n'ai pas besoin du fouillis. – Sack11

+0

Oui, mais comme c'est, c'est trop large.Il n'y a pas de solution générale à ceci, sauf si vous essayez de définir en termes plus spécifiques comment cette ligne est décrite –

Répondre

1

Vous pourriez faire quelque chose comme cela, bien que ce n'est pas vraiment mathématiquement son et est en quelque sorte codé en dur pour la matrice particulière que vous avez fourni ..

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)]); 

Vous pouvez jouer avec le sigma et le threshold pour rapprocher la frontière de ce que vous désirez réellement.

enter image description here

+0

Je veux que tout le bruit au-dessus de la ligne rouge soit éliminé. (Le fouillis comme des morceaux) – Sack11

+0

Vous pouvez faire quelque chose comme 'a (a ~ = 1) = 0', alors la matrice a aura ceux où le contour est et 0 partout ailleurs. vous pouvez le voir en le traçant 'imagesc (a (1: 450, :))'. Je ne suis pas sûr dans exactement quel format vous voulez les données .. Dans la solution que j'ai donné 'cols' et' rows' vous donner les coordonnées de la frontière. –

+0

'a (a ~ = 1) = 0' fonctionnait parfaitement. Mais le graphique est inversé. Au lieu de la courbe allant du bas> haut> bas, c'est haut> bas> haut. Toute solution à cela? – Sack11