MatLens · Ecuaciones y modelos

AFM / SPM

Esta sección describe las operaciones que MatLens aplica a los mapas de alturas AFM/SPM: nivelado, rugosidad, altura de escalón, densidad espectral de potencia y granos. Un mapa es una matriz z[\text{fila},\text{columna}] en metros con tamaños de píxel \Delta x (a lo largo de la fila) y \Delta y (entre filas).

Nivelado: plano, polinomio y alineado de filas

Código: matlens/core/afm.py::poly_background, matlens/core/afm.py::plane_level, matlens/core/afm.py::poly_level, matlens/core/afm.py::align_rows, matlens/core/afm.py::level.

Fondo polinómico 2-D ajustado por mínimos cuadrados (sin pesos) y restado:

z_{\mathrm{fondo}}(x,y) = \sum_{i+j \le p} c_{ij}\, x^i y^j, \qquad x, y \in [-1, 1]

Las coordenadas de píxel se reescalan a [-1,1] para condicionar bien la base. El plano corresponde a p=1; poly2 y poly3 a p=2,3. Con una máscara solo se ajustan los píxeles seleccionados.

Alineado de filas por la mediana de diferencias: para cada fila i \ge 1,

z_i \leftarrow z_i - \operatorname{mediana}\left(z_i - z_{i-1}\right)

donde z_{i-1} es la fila ya alineada; al final se resta la media global. El método plane_rows aplica primero el plano y después el alineado.

Control de nivelado: fracción de varianza explicada por un plano,

F = 1 - \frac{\operatorname{Var}\left(z - z_{\mathrm{plano}}\right)}{\operatorname{Var}(z)}

Si F > 0.10 se avisa de que la imagen no está nivelada (umbral heurístico, TILT_VARIANCE_FRACTION).

Significado y límites. La inclinación de la muestra y el arco del escáner piezoeléctrico añaden a la topografía un fondo suave que no es rugosidad; sin restarlo, todos los parámetros de altura crecen (en el ejemplo, S_q pasa de 1 nm a más de 8 nm). Restar un polinomio de orden p también elimina cualquier forma real de la superficie de longitud de onda comparable al tamaño de la imagen, de modo que la rugosidad resultante está limitada a escalas menores que la imagen. El alineado de filas corrige los saltos entre líneas de barrido (deriva térmica, cambios de punta), pero elimina también cualquier escalón real paralelo al barrido rápido; la mediana lo hace robusto a objetos que ocupan menos de la mitad de la fila. Con un escalón o con partículas grandes, el plano ajustado sin máscara se inclina hacia ellos; para esos casos poly_background admite una máscara y step_height evalúa la inclinación dentro de cada terraza. Si quedan menos píxeles que términos del polinomio, error.

Referencias: Nečas & Klapetek, Cent. Eur. J. Phys. 10, 181–188 (2012), doi:10.2478/s11534-011-0096-2; manual de usuario de Gwyddion, "Data Levelling and Background Subtraction".

Rugosidad areal (ISO 25178-2) y de perfil (ISO 4287)

Código: matlens/core/afm.py::roughness, matlens/core/afm.py::line_roughness.

Con \eta = z - \langle z\rangle sobre los N píxeles válidos (o seleccionados):

S_a = \langle |\eta| \rangle, \qquad S_q = \sqrt{\langle \eta^2 \rangle}, \qquad S_p = \max \eta, \qquad S_v = -\min \eta, \qquad S_z = S_p + S_v
S_{sk} = \frac{\langle \eta^3\rangle}{S_q^3}, \qquad S_{ku} = \frac{\langle \eta^4\rangle}{S_q^4}

Para cada fila con al menos 4 píxeles, respecto a su línea media:

R_a = \langle |p - \bar{p}| \rangle, \qquad R_q = \sqrt{\langle (p - \bar{p})^2\rangle}

y se informan los promedios de R_a y R_q sobre las filas.

SímboloSignificadoUnidades
S_a, S_qaltura media aritmética y cuadráticaunidad de z
S_p, S_v, S_zpico máximo, valle máximo y altura máximaunidad de z
S_{sk}, S_{ku}asimetría y curtosis—
R_a, R_qrugosidad de perfil media sobre filasunidad de z

Validez: se avisa si la imagen no está nivelada (solo sin máscara). S_{sk} y S_{ku} valen 0 si S_q = 0.

Nota (diferencia con la literatura): ISO 25178-2 define los parámetros sobre la superficie limitada en escala (operadores F y filtros S/L), e ISO 4287 sobre el perfil filtrado con \lambda_c (ISO 16610). MatLens no aplica filtros: usa la media de alturas (no un plano ajustado) como referencia areal y la media de cada fila como línea media; el nivelado debe hacerse antes.

Incertidumbre: no se propaga.

Referencias: ISO 25178-2:2012, §4.1–4.2; ISO 4287:1997, §4.2.1–4.2.2.

Perfil de línea

Código: matlens/core/afm.py::line_profile.

Alturas a lo largo del segmento p_0 \to p_1 (coordenadas de píxel) por interpolación bilineal (scipy.ndimage.map_coordinates, orden 1); con anchura w>1 se promedian w líneas paralelas desplazadas a lo largo de la normal. La distancia es \sqrt{(\Delta c\,\Delta x)^2 + (\Delta r\,\Delta y)^2}. Referencia: implementación propia.

Altura de escalón y número de capas

Código: matlens/core/afm.py::step_height.

h = \langle z\rangle_{\mathrm{sup}} - \langle z\rangle_{\mathrm{inf}}, \qquad u(h) = \sqrt{\frac{s_{\mathrm{inf}}^2}{n_{\mathrm{inf}}} + \frac{s_{\mathrm{sup}}^2}{n_{\mathrm{sup}}}}, \qquad \text{dispersión} = \sqrt{s_{\mathrm{inf}}^2 + s_{\mathrm{sup}}^2}
N = \frac{|h|}{d}, \qquad u(N) = \frac{u(h)}{d}
SímboloSignificadoUnidades
sdesviación típica muestral (ddof = 1) de cada terrazaunidad de z
nnúmero de píxeles de cada región—
ddistancia interplanar (p. ej. grafito c/2 = 0.3354 nm)unidad de z
Nnúmero de capas (también redondeado a entero)—

Incertidumbre: evaluación de tipo A de la diferencia de medias, incertidumbre típica (k=1). Como los píxeles están correlacionados, u(h) es una cota inferior; compárese con la dispersión.

Validez: aviso si |h| es menor que la dispersión combinada y si un plano explica más del 10 % de la varianza dentro de alguna terraza (con al menos 10 píxeles).

Algoritmo. Las regiones son máscaras booleanas o rectángulos (col0, fila0, col1, fila1) en píxeles, inclusivos (rect_mask); se descartan los píxeles no finitos y cada región necesita al menos dos píxeles. La comprobación de nivelado ajusta un plano solo a los píxeles de cada terraza (el escalón mismo correlaciona con un plano global y daría un falso aviso) y avisa en cuanto una terraza supera el 10 %.

Límites del recuento de capas. La altura AFM de una monocapa sobre un sustrato distinto suele diferir de la distancia interplanar del cristal (capas de agua o adsorbatos, interacción punta–muestra, modo de medida), por lo que el número de capas solo es fiable entre capas del mismo material (escalón capa–capa) o con calibración propia. N redondeado a entero no comprueba que \lvert N - \mathrm{round}(N)\rvert sea pequeño frente a u(N).

Referencias: GUM, JCGM 100:2008, §4.2; ISO 5436-1:2000; Novoselov et al., Science 306, 666 (2004), doi:10.1126/science.1102896; Trucano & Chen, Nature 258, 136 (1975), doi:10.1038/258136a0.

Ejemplo resuelto: escalón de tres capas

Escalón sintético: dos terrazas de 64 × 64 píxeles con ruido gaussiano de 0.08 nm, la superior elevada 3 \times 0.3354 nm (tres capas de grafeno). Regiones rectangulares (col0, fila0, col1, fila1) = (5, 5, 55, 58) y (72, 5, 122, 58); step_height(..., interlayer=0.3354 nm).

MagnitudMatLens
h (nm)1.0069
u(h) (nm), k=10.00215
dispersión \sqrt{s_\text{inf}^2+s_\text{sup}^2} (nm)0.113
n_\text{inf}, n_\text{sup}2754, 2754
N = \lvert h\rvert/d3.002 ± 0.0064
N entero3

u(h) es muy pequeña porque trata los píxeles como independientes; en una imagen real los píxeles vecinos están correlados y la incertidumbre efectiva es mayor (cota superior orientativa: la dispersión).

Densidad espectral de potencia 1-D

Código: matlens/core/afm.py::psd_1d.

Para cada línea con su media restada (NaN sustituidos por 0) y ventana w normalizada a \langle w^2\rangle = 1 (Hann opcional, por defecto rectangular):

C(f_k) = \frac{\Delta x}{n}\,\left\langle |\hat{z}_k|^2 \right\rangle_{\text{líneas}} \times \begin{cases} 1 & k = 0 \text{ o } k = n/2 \ (n \text{ par})\\ 2 & \text{resto}\end{cases}, \qquad f_k = \frac{k}{n\,\Delta x}

normalizada de modo que \sum_k C(f_k)\,\Delta f es la altura cuadrática media de las líneas (Parseval). Unidades: f en 1/(unidad de \Delta x) y C en (unidad de z)²·(unidad de \Delta x). Con axis=0 se calcula a lo largo de las columnas.

Significado. La PSD reparte la varianza de alturas entre longitudes de onda \lambda = 1/f; su integral es S_q^2 (de las líneas). Una superficie autoafín muestra una ley de potencias C \propto f^{-(1+2H)} con exponente de Hurst H (MatLens no ajusta H). La ventana rectangular produce fuga espectral si la línea no es periódica; la Hann la reduce y se compensa en potencia (normalización \langle w^2\rangle = 1), lo que conserva la integral pero no el valor exacto de cada componente. Las frecuencias por encima de \sim 1/(2\Delta x) (Nyquist) no existen, y las altas frecuencias reales están atenuadas por la convolución con la punta. Sustituir NaN por 0 tras restar la media introduce un pequeño sesgo si hay muchos píxeles no válidos.

Referencia: Jacobs, Junge & Pastewka, Surf. Topogr.: Metrol. Prop. 5, 013001 (2017), ec. (A.1)–(A.6), doi:10.1088/2051-672X/aa51f8.

Ejemplo resuelto: rugosidad, nivelado y Parseval

Mapa sintético de 128 × 128 píxeles con rugosidad gaussiana blanca de 1 nm rms (semilla fija) más una inclinación de 0.2 nm/píxel en x y 0.1 nm/píxel en y. Se ejecuta roughness sobre la imagen sin nivelar y tras level(z, "plane").

Parámetrosin nivelarnivelada (plano)
S_a (nm)6.9770.7979
S_q (nm)8.331
S_z (nm)41.47.864
S_{sk}0.0016270.01842
S_{ku}2.2053.031
R_q (nm)7.4610.995
validezwarningok

La fracción de varianza explicada por un plano en la imagen sin nivelar es levelling_residual = 0.986 (> 0.10, de ahí el aviso). En la imagen nivelada, S_q vuelve a ≈ 1 nm, S_{sk} ≈ 0 y S_{ku} ≈ 3, los valores de una distribución gaussiana.

Parseval con psd_1d (\Delta x = 10 nm): \sum C(f_k)\,\Delta f = 0.99366 nm², frente a la varianza media de las filas 0.99366 nm².

Granos por umbral de altura

Código: matlens/core/afm.py::grains.

Los píxeles por encima del umbral t (Otsu por defecto, o los métodos de umbral de imagen; manual toma una fracción del rango de alturas) forman granos; se eliminan objetos de menos de 4 píxeles y opcionalmente los que tocan el borde. Para cada grano g con n_g píxeles:

A_g = n_g\,\Delta x\,\Delta y, \qquad \mathrm{ECD} = \sqrt{\frac{4A_g}{\pi}}, \qquad h_{\max} = \max_g z - t, \qquad \bar{h} = \langle z\rangle_g - t, \qquad V_g = \Delta x\,\Delta y\sum_g (z - t)

La cobertura es la fracción de píxeles que pertenecen a granos. Se avisa si la imagen no está nivelada o si no se detectan granos.

Los píxeles no finitos se sustituyen por el mínimo de la imagen antes del umbral. Si el método no da umbral, se toma el mínimo de la imagen. Las alturas y el volumen se miden sobre el nivel del umbral, no sobre el sustrato: una partícula parcialmente bajo el umbral se subestima. El ECD es el diámetro del círculo de igual área proyectada; la punta ensancha lateralmente las partículas en aproximadamente su radio, de modo que el ECD de partículas pequeñas está sobreestimado, mientras que la altura máxima es la magnitud más fiable del AFM.

Avisos de validez del módulo (textos literales de matlens/core/afm.py): «La imagen no está nivelada: un plano explica el … % de la varianza de alturas; nivele antes de medir» (roughness sin máscara, step_height por terraza, grains); «La altura del escalón (…) es menor que la rugosidad combinada de las terrazas (…)» (step_height); «No se detectaron granos con este umbral» (grains). Todos son de tipo aviso; ninguno invalida el resultado.

Referencia: Nečas & Klapetek 2012 (análisis de granos de Gwyddion).

Generado desde MatLens c0ab138. ← Todas las técnicas