piv_cross_correlate — PIV estimate op

• Datenarten: image2d × image2d → flow2d

• Aufruf: import fullseye as fs; fs.ledger.piv_cross_correlate(a, b, window=32, overlap=0.5, peak='gauss3', window_func='hann', subtract_mean=True, shift=None, normalize='overlap', search_limit=0.25) (die Implementierung direkt: import pivops; pivops.piv_cross_correlate(a, b, window=32, overlap=0.5, peak='gauss3', window_func='hann', subtract_mean=True, shift=None, normalize='overlap', search_limit=0.25); aus dem Register: opspiv.get("piv_cross_correlate"))

• Rückgabewert über das Register: fullseye.ledger.piv_cross_correlate(...) liefert nur den Wert des deklarierten Out-Typs flow2d (die zugrunde liegende Funktion gibt zusätzlich Hilfsinformationen zurück). Wird das Verworfene gebraucht, nutze fullseye.ledger.piv_cross_correlate.raw(...) oder rufe pivops.piv_cross_correlate direkt auf.

• Rückgabe der Funktion: (flow, info) -> flow2d

Verwendung

Bestimmt das Verschiebungsfeld durch fensterweise Kreuzkorrelation. Rückgabe: (flow, info).

In jedem Fenster wird 2-mal FFT gebildet und das konjugierte Produkt zurücktransformiert (zirkuläre Korrelation); die Position des Maximums liefert die ganzzahlige Verschiebung, die 3 Punkte darum herum die Subpixel-Verschiebung.

Verzerrung zur Null hin und ihre Korrektur (gemessen): die reine Kreuzkorrelation zieht die Verschiebung zur Null. Verschiebt man das Fenster, schrumpft der überlappende Bereich, sodass der Korrelationswert selbst mit der Verschiebung sinkt; auch gemessen war die Verzerrung proportional zur Verschiebung (win=32, Hann, dx von 0.5 bis 6 px variiert, Verzerrung / (d/N) = 1.30, 1.29, 1.28, 1.28, 1.28 —— konstante Steigung).

normalize="overlap" korrigiert dies durch Division durch die Autokorrelation der Fensterfunktion (gleichbedeutend mit Normierung auf die Überlappungsfläche). Am Rand geht der Divisor jedoch gegen 0, daher wird es stets gepaart mit search_limit, das den Suchbereich auf 1/4 des Fensters begrenzt. Gemessen:

=============== ========== ========== ==========

dx [px] ohne Korr Korr.+1/4 nur Korr.

=============== ========== ========== ==========

Bias bei 1.0 -0.0402 -0.0020 -0.2659

Bias bei 5.0 -0.2001 -0.0128 -0.9210

RMS bei 5.0 0.2081 0.0301 4.8881

=============== ========== ========== ==========

Die rechte Spalte ist der Fall "nur normieren, ohne die Suche zu begrenzen": die Korrektur verschlechtert den Fehler um das 23-fache. Das Messergebnis, dass man nicht nur eines von beiden einschalten darf, ist direkt der Default.

Args:

a, b: Bildpaar (H, W).

window: Seitenlänge des Fensters [px]. Gerade, 8 oder mehr.

overlap: Überlappungsgrad der Fenster [0, 1). 0.5 ist üblich.

peak: PEAK_MODES.

window_func: WINDOW_FUNCS.

subtract_mean: pro Fenster den Mittelwert abziehen (verhindert, dass der Gleichanteil des Hintergrunds in der Mitte einen riesigen

Gipfel bildet). Ausgeschaltet klebt es an der Nullverschiebung.

shift: vorhergesagte Verschiebung (2, h, w) (für mehrstufig). Das Fenster des 2. Bildes wird um diesen ganzzahligen Betrag

versetzt ausgeschnitten und das Residuum gemessen.

normalize: "overlap" (Default) oder "none".

search_limit: Obergrenze der gesuchten Verschiebung als Anteil des Fensters (Default 0.25 = die

"1/4-Regel" von PIV). None heißt unbegrenzt —— zusammen mit normalize="overlap"

wird es schlechter, wie in der Tabelle oben.

Returns:

(flow (2, h, w), info). info ist ein dict mit rows / cols (Bildkoordinaten der

Fenstermitten), peak_ratio (1. Gipfel / 2. Gipfel; je näher an 1, desto weniger

verlässlich), window / overlap / peak.

Ausführlicher Anwendungsleitfaden

• Leitfaden zur Familie piv_displacement

Referenzen (Beispieldaten, Literatur)

• Katalog der Beispieldaten (Download-URLs / Lizenzen) — 2-D nutzt skimage.data (BSD/Public Domain) plus synthetische Bilder, 3-D nennt Download-URLs echter Datenquellen (Stanford, PDS, …).

• Herkunft und Literatur der Operatoren — die Quellen der Forschung/Verfahren, auf denen diese Operatorfamilie beruht.

• Der kanonische Algorithmus (Autor, Jahr) und seine Anwendungen stehen im Familienleitfaden oben.

Ausführbare Beispiele (verifizierte Samples, die diesen Operator wirklich aufrufen)

• piv_field_analysis_tour — py -3.11 examples/piv_field_analysis_tour.py

• piv_flow_from_particles — py -3.11 examples/piv_flow_from_particles.py

• poc_beam_modal_video — py -3.11 examples/poc_beam_modal_video.py

• poc_change_detection_misreg — py -3.11 examples/poc_change_detection_misreg.py

• poc_dic_strain — py -3.11 examples/poc_dic_strain.py

• poc_print_registration — py -3.11 examples/poc_print_registration.py

• poc_river_surface_velocity — py -3.11 examples/poc_river_surface_velocity.py

• poc_strain_history — py -3.11 examples/poc_strain_history.py

• poc_superresolution_limits — py -3.11 examples/poc_superresolution_limits.py

• poc_tacsim_marker_shear — py -3.11 examples/poc_tacsim_marker_shear.py

Typkompatible Folge-Operatoren (nehmen flow2d als Eingabe)

piv_deform_pass · piv_outlier_mask · piv_replace_outliers · piv_vorticity · piv_divergence · piv_flow_magnitude · piv_to_velocity · piv_velocity_gradient

Gleiche Kategorie (estimate)

piv_multipass · piv_deform_pass · piv_ensemble_correlate


*Provenance: pivops.py — PIV Operator-Registry. Diese Notiz wird von tools/opdocs.py md erzeugt (nicht von Hand bearbeiten).*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.