Forum: PC-Programmierung Binäres Rastermuster mit eindeutigen Ausschnitten


von Dussel (Gast)


Lesenswert?

Moin,

nehmen wir einen binären Rastercode, wie zum Beispiel einen QR-Code. 
Zumindest unter bestimmten Umständen ist es möglich, so zu codieren, 
dass jeder beliebige (rechteckige) Ausschnitt mit einer gewissen 
Mindestgröße eindeutig ist, also im Muster nicht nochmal vorkommt.

Hat das ganze einen Namen? Unter welchen Begriffen findet man was dazu? 
Wie erstellt man so ein Muster?

Als Beispiel (0 schwarz, 1 weiß) das Muster:
10001
11001
11011
10011
10010

Wenn man jetzt zum Beispiel den 3x3-Ausschnitt
001
011
011
bekommt, ist eindeutig bestimmbar, dass dessen obere linke Ecke in der 
zweiten Zeile und dritten Spalte des Ausgangsmusters liegt. Das gilt 
entsprechend für jeden anderen 3x3-Ausschnitt.
Allerdings ist das Erstellen größerer Muster nicht trivial, weil sich 
die Ausschnitte überlappen können.

von Grummler (Gast)


Lesenswert?

Dussel schrieb:

> Hat das ganze einen Namen? Unter welchen Begriffen
> findet man was dazu?

Meine Antwort passt nicht zu 100%, aber ich würde mal
im Umfeld "Pseudozufallszahlen", "Korrelationssignale",
"Korrelationsfolgen", "Korrelationsarrays" suchen.

Folgen bzw. Arrays ohne sich wiederholende Teilmuster
sind i.d.R. gute Kandidaten für Signale mit einer
guten Autokorrelationsfunktion.

von Badende Pythia (Gast)


Lesenswert?

Dussel schrieb:
> Hat das ganze einen Namen?
> Unter welchen Begriffen findet man was dazu?
> Wie erstellt man so ein Muster?

?
Redundanz? Selbstähnlichkeit?
?scharfes Hingucken? Faltung?

von Fabian (Gast)


Lesenswert?

Hammingdistanz?

von Dussel (Gast)


Lesenswert?

Grummler schrieb:
> Dussel schrieb:
>
>> Hat das ganze einen Namen? Unter welchen Begriffen
>> findet man was dazu?
>
> Meine Antwort passt nicht zu 100%, aber ich würde mal
> im Umfeld "Pseudozufallszahlen", "Korrelationssignale",
> "Korrelationsfolgen", "Korrelationsarrays" suchen.
>
> Folgen bzw. Arrays ohne sich wiederholende Teilmuster
> sind i.d.R. gute Kandidaten für Signale mit einer
> guten Autokorrelationsfunktion.
Pseudozufall habe ich direkt verworfen, weil das ja mit der gesuchten 
Eigenschaft nichts zu tun hat (das Muster kann grundsätzlich auch total 
vorhersehbar sein), aber Korrelation ist ein interessanter Gedanke.

Badende Pythia schrieb:
> Redundanz? Selbstähnlichkeit?
> ?scharfes Hingucken? Faltung?
Faltung eventuell im Bezug auf die Korrelation, aber die anderen 
Vorschläge? Vom Gefühl her haben die wenig mit der Fragestellung zu tun.

Fabian schrieb:
> Hammingdistanz?
Ja, die Hammingdistanz der Ausschnitte zueinander müssen paarweise 
größer als 0 sein.

Danke für die Vorschläge. Vielleicht kennt ja noch jemand einen Begriff 
dazu. Auch im eindimensionalen würde das schon eventuell etwas bringen.

von Badende Pythia (Gast)


Lesenswert?

Dussel schrieb:
> Badende Pythia schrieb:
>> Redundanz? Selbstähnlichkeit?
>> ?scharfes Hingucken? Faltung?
> Faltung eventuell im Bezug auf die Korrelation, aber die anderen
> Vorschläge? Vom Gefühl her haben die wenig mit der Fragestellung zu tun.

Na wenn dein Gefühl Dich nicht weiter führt, mußt Du halt den Verstand 
einschalten.

Redundanz meint hier, das die selbe Information/Muster mehrmals 
vorkommt, also gerade das Gegenteil des von dir geschilderten Falles. Du 
suchst also einen QR-Code ohne diese Redundanz.
Redundanz, also mehrmaliges Vorkommen, bedeudet auch abschnittsweise 
"Selbstähnlichkeit", die man eben durch Faltung, oder auch (Auto-) 
Korrelation ermittelt.

https://www.spektrum.de/lexikon/biologie/autokorrelation/6405

Ein Indiz für geringe Redundanz ist hohe Komprimierungsrate. Du könntest 
also eine Huffmann-Codierung über den QR-Code laufen lassen um zu 
schauen, ob das ganze im geforderten Sinne frei von Duplikaten ist. 
Mglw. ist der von dir gesuchte Algo für QR-Codes ohne Wiederholung 
ähnlich dem Huffman-Tree aus der Komprimierung. Nur das eben kein Pfad 
vom Stamm zu den Blättern gleich gewählt wird:
https://commons.wikimedia.org/wiki/File:Huffman_tree_2.svg
https://en.wikipedia.org/wiki/Huffman_coding

von Tom (Gast)


Lesenswert?

"Maximum Length Sequence" geht zumindest in die gesuchte Richtung.

von Dussel (Gast)


Lesenswert?

Badende Pythia schrieb:
> Redundanz meint hier, das die selbe Information/Muster mehrmals
> vorkommt, […]
> Redundanz, also mehrmaliges Vorkommen,
Ok, in dem Sinne könnte es passen. Ich dachte an Redundanz im 
allgemeinen Sinn.

Badende Pythia schrieb:
> Ein Indiz für geringe Redundanz ist hohe Komprimierungsrate.
Ist es nicht umegekehrt? Bei hoher Redundanz kann viel weggelassen 
werden, was zu einer hohen Komprimierungsrate führt.

Allgemein ist das größere Problem auch nicht das Prüfen eines Musters 
auf die geforderte Eigenschaft, sondern das Erzeugen des Musters.

Tom schrieb:
> Maximum Length Sequence
Das könnte auch ein Ansatz sein.

Vielen Dank für die Vorschläge.

von foobar (Gast)


Lesenswert?

Ich vermute mal, es geht um absolute Positionierung in der Ebene (z.B. 
ne Maus, die ausgibt, wo sie sich auf dem Mauspad befindet).  Keine 
Ahnung, ob es dafür einen Namen gibt.  Aber ein interessantes Problem, 
wenn der Ausschnitt klein ist (wenn er, bezogen auf die möglichen 
Positionen, groß ist, reicht schon ein Rauschmuster).

Für ein 5x5 Feld reicht ein 2x2 Ausschnitt, um alle möglichen Positionen 
eindeutig zu markieren (5x5 ergibt 4x4=16 mögliche Positionen, ein 2x2 
Ausschnitt ermöglicht 2^(2*2)=16 Kodierungen, passt exakt).  Gibt es 
überhaupt Lösungen?  Ein QnD-Programm (brute force) zeigt, es gibt sogar 
800 Lösungen (hätt ich nicht erwartet).  Eine davon:
1
  10101
2
  00111
3
  11001
4
  11000
5
  10101

Ich vermute, dass es einen (rekursiven) Algorithmus gibt, um zumindest 
eine Untermenge aller Lösungen, auch für größere Felder generieren zu 
können.  Bleibt dem Leser überlassen ;-)

von Dussel (Gast)


Lesenswert?

foobar schrieb:
> Ich vermute mal, es geht um absolute Positionierung in der Ebene
Richtig. :-)

foobar schrieb:
> Aber ein interessantes Problem,
> wenn der Ausschnitt klein ist (wenn er, bezogen auf die möglichen
> Positionen, groß ist, reicht schon ein Rauschmuster).
Genau, aber meine Mathekenntnisse (im Sinne von Beweisen und sowas) sind 
zu gering. Da es aber interessant ist, könnte ich mir vorstellen, dass 
sich jemand schonmal mit sowas beschäftigt hat.

foobar schrieb:
> Für ein 5x5 Feld reicht ein 2x2 Ausschnitt, um alle möglichen Positionen
> eindeutig zu markieren (5x5 ergibt 4x4=16 mögliche Positionen, ein 2x2
> Ausschnitt ermöglicht 2^(2*2)=16 Kodierungen, passt exakt).
Das ist die Frage. Können alle 16 Codierungen benutzt werden, ohne dass 
es Doppelungen gibt? Es könnte ja auch sein, dass eine Untergrenze gibt, 
die wegen der notwendigen Überlappung die nutzbaren Codierungen 
einschränkt. Wenn sich die Ausschnitte nicht überlappen könnten, wäre es 
in der Tat trivial.

foobar schrieb:
> Ein QnD-Programm (brute force) zeigt, es gibt sogar
> 800 Lösungen (hätt ich nicht erwartet).
2^(5*5) ist mehr als 33 Millionen. Das heißt, nur 0,0024 % der möglichen 
Muster erfüllen die Bedingung. So gesehen sind 800 mögliche Lösungen 
sogar sehr wenig.

von Sigi (Gast)


Lesenswert?

Auf die Schnelle war mir Gestern der Algorithmenbereich
"Pattern Matching" eingefallen, den ja "jeder" auch als
String-Matching etc. kennt. Ich hatte mal ein Buch zu
diesem Thema ausgeliehen, in dem im hinteren Teil auch
2D-Bereichsverfahren vorgestellt wurden, die gar nicht mal
so kompliziert waren (Erkennen von Mustern als auch Erstellen
von Automaten aus vorgegebenen Mustern). Vlt. hift das ja.
Da aber JEDER Ausschnitt einer best. Grösse nur einmal
vorkommen darf, müssten ja viele Automaten erstellt und
angewendet werden. Hm, klingt aber sehr aufwendig?

Ein anderer Ansatz: Du fängst mit einem beliebigen Muster
der Grösse k,k in (i,j)=(0,0) an. Eine Bewegung nach Rechts
(i=>i+1) bzw. nach Unten (j=>j+1) bewirkt ja das Schiften
der Bits nach Links bzw. nach Oben plus das Ergänzen um
k Bits Rechts bzw. Unten. Eine diagonale Bewegung (i=>i+1,
j=>j+1) ergibt sich damit als Bewegung nach Links und dann
nach Unten oder erst nach Unten und dann nach Rechts. Beide
Folgen müssen dann dasselbe Muster erzeugen. Durch einfache
Überlegung/Skizze wird schnell klar, dass damit nur 2*k+1
Bits als Freiheit für eine konsistente Diagonalbewegung
gegeben sind. Daraus ergeben sich aber noch lange nicht,
wie die Bits zu setzen sind, es ist aber ein doch sehr
einfaches Verfahren.

Als Ansatz zum Ausfüllen der gesamten Fläche würde ich hier
wegen der Breite (= Anzahl neuzusetzender Bits) eher Tiefen-
als Breitensuche verwenden. Je Schritt muss dann das aktuelle
Muster mit den schon gegebenen Mustern verglichen und bei
Ungleichheit entsprechend abgespeichert und den Tiefensuchpfad
fortsetzen bzw. bei Gleichheit den Tiefensuchpfad zurückgesetzt
werden. Zum Abspeichern würde ich eine Graphenstruktur wählen.

Hast du dann per Tiefensuche einen "Gewinner" gefunden,
dann kannst du im nächsten Versuch so weit im Graph
zurückgehen, bis eine Stelle gefunden ist, in der beim
Bitsetzen noch Wahlfreiheit besteht. Setze ein Bit neu
und schreite mit der Tiefensuche fort etc. So bekommt
man alle Muster.

Ah, und noch eine Erkenntnis: Hast du eine minimale
Mustergrösse festgelegt und einen QR-Code/oÄ gefunden,
dann sich Vergleiche mit grösseren Mustern überfüssig,
nicht aber mit kleineren! Aber ich denke mal, dass die
Bestimmung der min. Mustergrösse nur über ein wie z.B.
Oben vorgestelltes Verfahren bestimmen lässt.

von Dussel (Gast)


Lesenswert?

Sigi schrieb:
> Da aber JEDER Ausschnitt einer best. Grösse nur einmal
> vorkommen darf, müssten ja viele Automaten erstellt und
> angewendet werden. Hm, klingt aber sehr aufwendig?
Ich hatte gehofft, dass es einen einfachen Algorithmus gibt, aber ich 
denke inzwischen, dass es den nicht gibt.

Sigi schrieb:
> Daraus ergeben sich aber noch lange nicht,
> wie die Bits zu setzen sind, es ist aber ein doch sehr
> einfaches Verfahren.
Vielleicht einfach, durch die erforderliche Suche trotzdem 
rechenzeitintensiv.

Die Überlegungen sind interssant. Danke.

von Johann L. (gjlayde) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo,

am ehesten passt wohl ein 2-dimensionaler deBruijn-Torus.

Das gewünschte Muster könnte man dann "deBruijn-Rechteck" nennen.  Der 
Torus erfüllt mehr Bedingungen als das Rechteckt; jeder dB-Torus ist 
also auch ein dB-Rechteck, aber nicht unbedingt umgekehrt.

https://en.wikipedia.org/wiki/De_Bruijn_torus

Um aus dem Rechteck einen (topologischen 2-)Torus zu erhalten, verklebt 
man untere mit oberer Kante des Rechtecks sowie linke Kante mit der 
rechten.

Ein (X,Y;x,y) dB-Torus ist dann ein X×Y 2-Torus, in dem jedes x×y 
Teil-Rechteck höchstens 1× vorkommt.  Zum Beispiel ist ein (4,4;2,2) 
dB-Torus:
1
0100
2
0111
3
1110
4
0010
es gibt 2^(2·2) = 16 Teil-Rechtecke, und alle sind verschieden.

Die Eigenschaft, ein (X,X;x,x) dB-Toris zu sein, ist invariant unter 
Invertierung, sowie unter Spiegelungen und 90°-Rotatonen sofern diese 
den Torus auf sich selbst abbilden.

Auf Wikipedia ist die SVG-Grafik eines (256,256;4,4) dB-Torus.  Das SVG 
hab ich mal in ein 256×256 PNG umgewandelt (und gesestet, dass es sich 
wirklich um einen solchen dB-Torus handelt).  Grafik anbei.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Johann L. schrieb:
> Auf Wikipedia ist die SVG-Grafik eines (256,256;4,4) dB-Torus.  Das SVG
> hab ich mal in ein 256×256 PNG umgewandelt (und gesestet, dass es sich
> wirklich um einen solchen dB-Torus handelt).  Grafik anbei.

...falls man direkten Zugriff auf die Pixel-Werte haben möchte ohne 
aufwändige Grafik-Libs zu nutzen, kann man PNG zum Beispiel nach PBM 
umwandeln mit
1
> convert xxx.png -compress none yyy.pbm

Das resultierende PBM ist eine reine Textdatei (zu lange, um sie hier zu 
posten).

"convert" ist Teil von ImageMagick:

https://imagemagick.org/

Hier die Matrix als Text: https://pastebin.com/tkiNzrdL

: Bearbeitet durch User
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Artikel zur Konstruktion hab ich keine gefunden, zumindest keine frei 
einsehbaren.

Allerdings gibt es ein Projekt auf Github, das Python-Scripte zur 
Konstruktion hat; insbesondere auch das Verfahren von Shiu, auf dem die 
obige Grafik basiert:

https://github.com/man4/debruijn-torus

von foobar (Gast)


Lesenswert?

de Bruijn Array/Torus ist zumindest ein guter Suchbegriff für das 
Problem des TO.  Unter anderem findet man "Coding Schemes for 
Two-Dimensional Position Sensing"[1].  Allen ist aber gemein, dass sie 
sehr mathematisch gehalten sind - da jeder Author sich seine eigene 
mathematische DSL[2] bastelt, ist das Lesen echt mühsam.


[1] https://hplabs.itcs.hp.com/techreports/92/HPL-92-19.pdf
[2] Domain Specific Language

von mIstA (Gast)


Lesenswert?

Dussel schrieb:
> Wie erstellt man so ein Muster?

Johann L. schrieb:
> Allerdings gibt es ein Projekt auf Github, das Python-Scripte
> zur Konstruktion hat

Ich denke mal, wenn Dir quadratische Ausschnitte bis zur Mindestgröße 6 
* 6 ausreichen, dann ist das von Johann L. gefundene GitHub-Projekt 
schon alles was Du brauchst, denn das liefert Dir Beispiel-Skripte, um 
ein 4096 * 8192 Raster, das alle möglichen 5 * 5 Muster genau einmal 
enthält sowie auch eines mit allen möglichen 6 * 6 Mustern (ergibt dann 
ein Raster aus 262144 * 262144 Punkten und wird 8GiB groß) zu erzeugen.

Das Beispiel-Skript ließe sich auch einfach für 7*7 Muster aufbohren, 
falls Du noch größere Raster haben willst und mal eben 64TiB auf der 
Platte frei hast.
Für noch größeres bräuchtest Du dann aber so richtig viel Platz: das 
Raster für 8*8 Muster hätte 4294967296² Punkte und käme auf gigantische 
2EiB (2.30584*10^18 Byte), womit auch die meisten gängigen Dateisysteme 
(ntfs wie auch ext4) überfordert wären; zfs wäre noch im Rennen. ;)

Nachdem Deine Anforderungen schwächer sind als die eines de Bruijn 
Arrays (Dir reicht ja daß, jedes Muster max. einmal enthalten ist statt 
genau einmal), kannst Du auch beliebige, kleinere Ausschnitte des 
jeweiligen de Bruijn Arrays (für 4*4, 5*5 oder 6*6 Muster) nehmen.

Zumindest für rechteckige Muster der Größe n * (n-1) sollten sich die 
Beispielskripte auch recht einfach anpassen lassen, denn die werden, 
wenn ich das richtig gesehen habe, ohnehin immer als Zwischenschritt 
erzeugt, um von n*n auf (n+1)*(n+1) zu kommen.


Dussel schrieb:
> foobar schrieb:
>> Ich vermute mal, es geht um absolute Positionierung in der
>> Ebene
> Richtig. :-)

In dem Fall solltest Du Dir vielleicht mal folgendes Paper anschauen:
https://link.springer.com/article/10.1134/S1990478919020091
Das beschäftigt sich lt. Abstract mit der Erstellung von de Bruijn 
Arrays, bei denen sich die Position eines gegebenen Musters im Array 
leicht ermitteln läßt.
Denn bei Mustern größer 4*4 wird wahrscheinlich eine naive brute-force 
Suche doch schnell langweilig werden.

von Dussel (Gast)


Lesenswert?

Vielen Dank für die vielen zusätzlichen Informationen.
De-Bruin-Array(s) sieht/sehen ja in dem Zusammenhang interessant aus. 
Insbesondere geht es ja sogar noch weiter, was bei der 
Rotationsinvarianz auch nützlich ist.

mIstA schrieb:
> Nachdem Deine Anforderungen schwächer sind als die eines de Bruijn
> Arrays (Dir reicht ja daß, jedes Muster max. einmal enthalten ist statt
> genau einmal)
mIstA schrieb:
> Das beschäftigt sich lt. Abstract mit der Erstellung von de Bruijn
> Arrays, bei denen sich die Position eines gegebenen Musters im Array
> leicht ermitteln läßt.
> Denn bei Mustern größer 4*4 wird wahrscheinlich eine naive brute-force
> Suche doch schnell langweilig werden.
Das ist halt immer die Frage, gibt es sowas oder ist man da von der 
Komplexität schnell aus P (Äquivalenz) raus.

Ich werde das mal durchlesen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.