7
votes

Une détection d'un tridimensionnel

Au lieu de la détection des bords d'une image 2D, je souhaite détecter des arêtes sur chaque rangée (i.g. une ligne) d'une image séparément. C'est la détection des bords d'un vecteur d'entrée 1D dont les valeurs sont des intensités de pixels allant de 0 à 255 (image ci-dessous): Entrez la description de l'image ici

Je voudrais détecter les principaux bords comme apparaissent dans l'entrée d'échantillon (image ci-dessous) Entrez la description de l'image ici


1 commentaires

Merci à tous pour les réponses. S'il vous plaît si vous rencontrez des nouvelles idées nouvelles (détections de pointe 1Dimentry), partagez cela aussi.


3 Réponses :


1
votes

Vous recherchez donc un changement particulier de pente - c'est-à-dire un certain changement de Y par échantillon?

N'est-ce pas simplement regarder la différence de y entre deux échantillons et s'il est une valeur absolue modifiée par plus d'une marque limite que comme un bord?


3 commentaires

Non vraiment, ce ne serait pas aussi simple du tout. Pour le réfraction, regardez: en.wikipedia.org/wiki/edge_detection (pourquoi la détection de bord est une tâche non triviale)


@Cgraphics: sur les images que vous avez postées une différence simple ou une dérivée de l'opérateur gaussien devrait fonctionner correctement. Si vous pensez que "ce n'est pas si simple du tout", veuillez poster les données réelles que vous rencontrez des problèmes.


@nikie qui est l'image réelle, mais elle n'est pas aussi simple qu'un simple seuil. Nous avons besoin d'une détection précise des bords non seulement, disons, de les compter.



10
votes

Un moyen d'accéder à votre résultat souhaité consiste à adapter le détecteur de bord de canin 2D comme suit (code dans Mathematica):

Tout d'abord, calculez la dérivée spatiale à l'aide d'un filtre dérivé gaussien, définissant la valeur Sigma par rapport à la balance des bords que vous voulez détecter. Prenez la valeur absolue du résultat. P>

t = FindThreshold@data[[steps]];
steps2 = Select[steps, data[[#]] <= t &];

ListLinePlot[data, Epilog -> {Red, PointSize[Large], Map[Point[{#, data[[#]]}] &, steps2]}]


0 commentaires

2
votes

Étant donné le bon contraste de ces bords, il existe une solution facile qui fonctionnera de manière robuste: détecter toutes les séquences monotones de valeurs de pixels (augmenter ou diminuer strictement). Vous garderez les séquences ayant une hauteur totale au-dessus d'un seuil (50 dans votre cas) pour rejeter les pics bruyants.

En tant que sous-produit, vous obtiendrez les points de départ et de fin (pas exactement où vous l'attendez cependant, mais cela peut être amélioré si nécessaire).

Codes à barres?


1 commentaires

Ne pas quitter exactement, mais vous pouvez penser à cela comme code à barres coloré