1
votes

Quantifier la rugosité d'une surface 2D en fonction de points de dispersion donnés géométriquement

Comment concevoir un code simple pour quantifier automatiquement une surface rugueuse 2D basée sur des points de dispersion donnés géométriquement? Par exemple, pour utiliser un nombre, r = 0 pour une surface lisse, r = 1 pour une surface très rugueuse et la surface est entre lisse et rugueuse lorsque 0 Pour illustrer plus explicitement cette question, la figure ci-dessous est utilisée pour montrer plusieurs esquisses de surfaces rugueuses 2D. Les points sont les points dispersés avec des coordonnées données. En conséquence, tous les deux points adjacents peuvent être connectés et un vecteur normal de chaque segment peut être calculé (marqué par une flèche). Je voudrais concevoir une fonction comme

def roughness(x, y):

   ...   

   return r

x et y sont des séquences de coordonnées de chaque point de dispersion. Par exemple, dans le cas (a), x = [0,1,2,3,4,5,6] , y = [0,1,0,1,0, 1,0] ; dans le cas (b), x = [0,1,2,3,4,5] , y = [0,0,0,0,0,0] code >. Lorsque nous appelons la fonction rugosité (x, y) , nous obtiendrons r = 1 (très grossier) pour le cas (a) et r = 0 (lisse) pour le cas (b). Peut-être r = 0,5 (moyen) pour le cas (d). La question est affinée à quels composants appropriés devons-nous mettre dans la fonction roughness?

Quelques réflexions initiales:

La rugosité d'une surface est un local concept, que nous considérons uniquement dans une plage spécifique de zone, c'est-à-dire uniquement avec plusieurs points locaux autour de l'emplacement d'intérêt. Utiliser la moyenne des vecteurs normaux locaux? Cela peut échouer: (a) et (b) ont la même moyenne, (0,1), mais (a) est une surface rugueuse et (b) est une surface lisse. Utiliser la variance des vecteurs normaux locaux? Cela peut également échouer: (c) et (d) ont la même variance, mais (c) est plus grossier que (d).

 Esquisses de surfaces rugueuses 2D


2 commentaires

quelle est la vraie question? cela pourrait être plus adapté à stats.stackexchange.com ? peut-être que vous posez des questions sur la corrélation entre les sommets adjacents?


@SamMason J'ai rendu la question plus explicite. Il s'agit de concevoir une fonction pour déterminer ou quantifier automatiquement la rugosité d'une surface en renvoyant une valeur. Les arguments d'entrée sont des informations de coordonnées x et y.


3 Réponses :


0
votes

Peut-être devriez-vous envisager une définition de protocole:

1) définition géométrique de la surface en premier

2) accorder à cette surface géométrique des propriétés intrinsèques.

2.a) step function can be based on quadratic curve between two peaks or two troughs with their concatenated point as the focus of the 'roughness quadratic' using the slope to define roughness in analogy to the science behind road speed-bumps.
2.b) elliptical objects can be defined by a combination of deformation analysis with centered circles on the incongruity within the body.  This can be solved in many ways analogous to step functions.
2.c) flat lines: select points that deviate from the mean and do a Newtonian around with a window of 5-20 concatenated points or what ever is clever.


0 commentaires

1
votes

Peut-être quelque chose comme ceci:

import numpy as np

def roughness(x, y):
    # angles between successive points
    t = np.arctan2(np.diff(y), np.diff(x))

    # differences between angles
    ts = np.sin(t)
    tc = np.cos(t)
    dt = ts[1:] * tc[:-1] - tc[1:] * ts[:-1]

    # sum of squares
    return np.sum(dt**2) / len(dt)

vous donnerait quelque chose comme vous demandez?


0 commentaires

0
votes

Les définitions mathématiques de nombreux paramètres de surface peuvent être trouvées ici, qui peuvent être facilement mises dans numpy:

https://www.keyence.com/ss /products/microscope/roughness/surface/parameters.jsp

L'image (d) montre un défi: en gros, vous voulez aplatir la forme avant de faire le calcul. Cela nécessite une connaissance préalable du type de géométrie que vous souhaitez ajuster. J'ai trouvé une application Gwyddion qui peut faire cela en 3D, mais elle ne peut s'interfacer qu'avec Python 2.7, pas 3.

Si vous savez quelle forme de base se trouve en dessous:

  1. adapter la forme connue
  2. calculer la distance de l'arc entre chacun des deux points
  3. remappez les nombres en soustrayant 1) des données d'origine et en attribuant de nouvelles coordonnées selon 2)
  4. effectuer des calculs de rugosité 2D / 3D normaux

1 commentaires

Veuillez éviter d'ajouter des commentaires ou des questions dans les sections de réponses