numpy Bool-Maske ausweiten

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
G-Rizzle
User
Beiträge: 90
Registriert: Donnerstag 18. Februar 2021, 12:26

Hi! mir liegt ein 2D-array aus Bools vor, das eine Maske darstellt.

Folgende Skizze zeigt die grobe Form der Maske; dabei stellt der rote Bereich den False-Bereich und der grüne (inkl. schwarzer Kontur) den True-Bereich dar.
Die Dimensionen in x und y sind etwa 5000 Einträge


Bild


Nun möchte ich den True-Bereich gleichmäßig vergrößern. Momentan erledige ich dies über Umrechnung der Maske in integer-Werte und dann eine 3x3 Kernel-Konvolution drüber. Nach jeder Konvolution setze ich alle Werte >1 gleich 1, dadurch ergibt sich eine schöne, gleichmäßige Vergrößerung der Maske. Nur ist dies für "größere" Vergrößerungen, wie ich sie brauche relativ ineffektiv. Dies mache ich momentan schlichtweg über eine for-schleife, bei der ich die konvultion einfach n-mal durchführe. Wie gesagt, das funktioniert, ist aber ineffektiv.

Hat wer eine Idee, wie es effektiver zu lösen wäre? Gibt es vllt eine pre-build Funktion? Die Kontur (also den schwarzen Bereich im Bild) kann ich extrahieren; gibt es hier vielleicht eine Funktion zur Kontur-Vergrößerung?

Beste Grüße
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das sind die morphologischen Operationen, in diesem Fall "Dilation". https://docs.opencv.org/3.4/d9/d61/tuto ... l_ops.html

Denen kannst du einen Kernel mitgeben, der sowohl Form als auch Groesse deiner Vergroesserung bestimmt.
G-Rizzle
User
Beiträge: 90
Registriert: Donnerstag 18. Februar 2021, 12:26

__deets__ hat geschrieben: Donnerstag 31. März 2022, 17:33 Das sind die morphologischen Operationen, in diesem Fall "Dilation". https://docs.opencv.org/3.4/d9/d61/tuto ... l_ops.html

Denen kannst du einen Kernel mitgeben, der sowohl Form als auch Groesse deiner Vergroesserung bestimmt.
Jetzt muss ich mich mal wirklich für deine schnellen & kompetenten Antworten immer bedanken, selbst zu so spezifischen Sachen. Hast mir wirklich schon enorm geholfen!

Was für einen Kernel würdest du da nehmen? Bei Erosion wird ja ein 5x5 vorgeschlagen. Hast du dazu eine Meinung?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der muss ungerade sein aus offensichtlichen Gründen, aber der Rest ist ausprobieren. Bei dir sollte er rund sein, wenn du eine gleichmäßige Vergrößerung willst. Aus dem Bauch heraus würde ich eher kleiner und mehrfach probieren, aber das kann Einbildung sein.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Hi, vielleicht ginge es auch auf diese Art und Weise hier:
https://answers.opencv.org/question/445 ... a-contour/
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
G-Rizzle
User
Beiträge: 90
Registriert: Donnerstag 18. Februar 2021, 12:26

__deets__ hat geschrieben: Donnerstag 31. März 2022, 17:33 Das sind die morphologischen Operationen, in diesem Fall "Dilation". https://docs.opencv.org/3.4/d9/d61/tuto ... l_ops.html

Denen kannst du einen Kernel mitgeben, der sowohl Form als auch Groesse deiner Vergroesserung bestimmt.
ich habe diese methode verwendet und es ist phänomenal. lasse das wie gesagt über ein ca. 5000x5000 array durchlaufen mit 20 wiederholungen und es rechnet einfach innerhalb von <2 Sekunden. Dabei wird kaum RAM verwendet.

Wie funktioniert das? ich hatte jetzt schon häufiger die Feststellung, dass meine eigenen Algorithmen Unmengen RAM & Zeit bei Durchführung gefressen haben und die pre-built aus cv2 oder numpy schaffen das gleiche in 1 Promille der Zeit. Was machen die anders?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Eine Programmiersprache zu verwenden, die nicht so unglaublich mit dem Speicher rumsaut wie Python. Und native Operationen auf den Grunddatentypen durchführt. Statt aus jedem Byte ein 20 Byte Objekt mit Sprungtabelle für Methoden zu machen. Das ist dann eben der Gewinn, dafür aber auch viel mühseliger zu programmieren.
Antworten