Wie gebe ich das ähnlichste Unicode-Zeichen an einen Bildausschnitt zurück?

8

Ich habe einen einfachen Konverter in Python gemacht, um Bilder in ASCII zu konvertieren. Im Moment verwendet es verschiedene Schattierungen von dunklen Zeichen, so dass es funktioniert, aber es ist schwer mit niedrigen Auflösungen zu erkennen: Das Google-Logo erscheint beispielsweise als:

%Vor%

Das ist kaum zu erkennen. Gibt es eine Möglichkeit, dass ich jeden Abschnitt mit einer Teilmenge von Unicode-Zeichen vergleichen und das ähnlichste zurückgeben könnte, sodass es beispielsweise wie folgt zurückgegeben werden kann:

%Vor%     
Skyler 07.12.2011, 15:55
quelle

3 Antworten

3
  1. Erstellen Sie für jedes Zeichen, das Sie verwenden möchten, ein Bild in der Schriftart, die Sie verwenden. Sie werden wahrscheinlich eine Schriftart mit fester Breite verwenden, mit der Sie ein großes Bild erstellen und später aufteilen können. Dies könnte so einfach sein wie das Eintippen der Zeichen in einen Editor und das Durchführen einer Bildschirmaufnahme.
  2. Vergleichen Sie für jedes Patch des Eingabebilds das Patch mit allen Zeichenbildern. Ich würde entsprechende Pixel aus dem Patch und dem Zeichen nehmen und die Differenz quadrieren und zusammenfassen - das Zeichen mit der niedrigsten Summe ist dasjenige, das dem Patch am nächsten kommt.

Sie können die Ergebnisse verbessern, indem Sie die Zeichenbilder, das Eingabebild oder beide weichzeichnen. Sie können auch bessere Ergebnisse erzielen, wenn Sie den Kontrast des Eingabebilds erhöhen.

Eine weitere Idee zur Verbesserung von Ergebnisqualität und Geschwindigkeit wäre, die durchschnittliche Dunkelheit jedes Charakters zu berechnen und nur Charaktere zu vergleichen, die fast die gleiche Dunkelheit wie das Patch haben.

    
Mark Ransom 07.12.2011, 19:40
quelle
1

Wenn Sie sagen

  

Vergleiche jeden Abschnitt mit einer Teilmenge von Unicode

Das ist nicht wirklich klar, weil es mehr als eine Möglichkeit gibt, dies zu tun. Ich würde den Vergleich auf die Pixelebene bringen. In einem grauen Bild hat jedes Pixel einen Grauwert. Angenommen, Sie möchten jedes Pixel durch ein passendes Zeichen ersetzen, wie hat dieses Zeichen, um mit dem Pixel übereinzustimmen? Wenn Sie einen Charakter von wirklich weit betrachten, sehen Sie nur einen grauen Punkt. Wenn Sie jetzt ein Pixel durch ein Zeichen ersetzen, sollten Sie das Zeichen mit dem ähnlichsten Grauwert zu diesem Pixel wählen.

In einer Schriftart mit einem festen Abstand verwendet jedes Zeichen den gleichen Platz. Wenn Sie jetzt dieses Rechteck des Raumes nehmen, zeichnen Sie ein Zeichen darauf, können Sie den mittleren Grauwert berechnen. Dieser mittlere Grauwert ist nicht größer als die Fläche des Rechtecks, die im Vergleich zum gesamten Rechteck weiß ist. Ein Leerzeichen hat einen Grauwert von 1. Und vielleicht ist ein Dollarzeichen eines der am meisten schwarzen Zeichen, die Sie finden.

Also hier ist was ich tun würde:

  1. Nimm eine Reihe von Zeichen, egal, ob du nur ASCII oder Unicode verwendest. Berechnen Sie für jedes Zeichen die Menge an Weiß. Es sollte offensichtlich sein, dass dies für verschiedene Schriftarten unterschiedlich sein kann, aber Sie müssen einen monospaced verwenden.
  2. Sie haben jetzt eine Liste, die jedes Zeichen einem Grauwert zuordnet. Sie sollten nun die Grauwerte auf Ihr Ziel-Grauwertintervall neu skalieren. Wenn Sie ein 8-Bit-Bild haben, sollte Ihr hellstes Zeichen (Leerzeichen) einem Wert von 255 entsprechen und Ihre dunkelste Stelle sollte der Graustufe 0 entsprechen.
  3. Skalieren Sie nun Ihr Eingabebild so, dass es nicht zu groß ist, denn selbst mit einer sehr kleinen Schrift werden Sie möglicherweise nicht 2000 Zeichen in einer Zeile erhalten.
  4. Ersetzen Sie jedes Pixel durch das Zeichen, dessen Graustufe der eigenen Graustufe am nächsten ist

In Mathematica sind das nur ein paar Zeilen Code. In Python ist es vielleicht ein bisschen länger, aber es sollte auch in Ordnung sein.

Auf diese Weise erhalten Sie ziemlich erstaunliche Ergebnisse, wenn Sie den Text von weitem betrachten und wenn Sie näher kommen, sehen Sie, dass alles aus Zeichen besteht.

Aktualisieren

Wenn Sie ein Bild mit der gleichen Größe wie das Original erstellen möchten, ist die Vorgehensweise nicht sehr unterschiedlich, aber auch hier haben Sie, wie schon Mark betont, ein Rasterbild für jeden von Ihnen verwendeten Buchstaben. Ich sehe keinen schnelleren Weg, deine Bildkacheln mit einem Buchstaben zu vergleichen, um zu entscheiden, welcher am besten geeignet ist.

Vielleicht ein Tipp: Wenn Sie diesen Ansatz verwenden, werden die Buchstaben in Ihrem Bild sichtbar sein, denn wenn Sie z. eine 12pt Schriftart, jeder Buchstabe wird mindestens eine Bildgröße von etwa 10x15 haben. Wenn Sie jetzt ein Bild von 1000x1500 konvertieren, das nicht so klein ist, verwenden Sie nur 100x100 Buchstaben. Daher kann es sinnvoll sein, nicht das Bild selbst, sondern die Bildverläufe zu verwenden. Dies kann zu besseren Bildern führen, weil dann ein Buchstabe gewählt wird, der den Kanten recht gut folgt. Mit nur den Steigungen sieht das Google-Logo nicht so schlecht aus

    
halirutan 07.12.2011 23:25
quelle
1

Dies ist ein alter Thread, aber ich könnte hier auch meine Lösung hinzufügen. Sie können Braillezeichen verwenden, um pixelgenaue Darstellungen zu erhalten. Wie so:

⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⡿⡻⡫⡫⡣⣣⢣⢇⢧⢫⢻⣿⣿⣿⣿ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⡟⡟⣝⣜⠼⠼⢚⢚⢚⠓⠷⣧⣇⠧⡳⡱⣻⣿⣿⣿ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⡟⣏⡧⠧⠓⠍⡂⡂⠅⠌⠄⠄⠄⡁⠢⡈⣷⡹⡸⣪⣿⣿⣿⣿ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢿⠿⢿⢿⢿⢟⢏⡧⠗⡙⡐⡐⣌⢬⣒⣖⣼⣼⣸⢸⢐⢁⠂⡐⢰⡏⣎⢮⣾⣿⣿⣿⣿ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣽⣾⣶⣿⢿⢻⡱⢕⠋⢅⠢⠱⢼⣾⣾⣿⣿⣿⣿⣿⣿⣿⡇⡇⠢⢁⢂⡯⡪⣪⣿⣿⣿⣿⣿⣿ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢟⠏⢎⠪⠨⡐⠔⠁⠁⠀⠀⠀⠙⢿⣿⣿⣿⣿⣿⣿⣿⢱⠡⡁⣢⢏⢮⣾⣿⣿⣿⣿⣿⣿⣿ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢟⢍⢆⢃⢑⠤⠑⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣿⣿⣿⣿⡿⡱⢑⢐⢼⢱⣵⣿⣿⣿⣿⣿⣿⣿⣿⣿ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢿⢫⡱⢊⢂⢢⠢⡃⠌⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣿⢟⢑⢌⢦⢫⣪⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⡻⡱⡑⢅⢢⣢⣳⢱⢑⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⡑⡑⡴⡹⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢟⢝⠜⠨⡐⣴⣵⣿⣗⡧⡣⠢⢈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣜⢎⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⡫⡱⠑⡁⣌⣮⣾⣿⣿⣿⣟⡮⡪⡪⡐⠠⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⢏⠜⠌⠄⣕⣼⣿⣿⣿⣿⣿⣿⣯⡯⣎⢖⠌⠌⠄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢨⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢟⢕⠕⢁⠡⣸⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⡽⡮⡪⡪⠨⡂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢟⢕⠕⢁⢐⢔⣽⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢽⡱⡱⡑⡠⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢟⢕⠕⢁⢐⢰⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣟⣞⢜⠔⢄⠡⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ⣿⣿⣿⣿⣿⣿⣿⣿⡿⡹⡰⠃⢈⠠⣢⣿⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡮⣇⢏⢂⠢⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ⣿⣿⣿⣿⣿⣿⣿⢫⢒⡜⠐⠀⢢⣱⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣳⢕⢕⠌⠄⡀⠀⠀⢀⣤⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ⣿⣿⣿⣿⣿⡿⡑⣅⠗⠀⡀⣥⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⢙⠙⠿⣿⣿⣿⣿⣿⣿⣿⣿⣯⢮⡪⣂⣢⣬⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ⣿⣿⣿⣿⡟⡜⢌⡞⡀⣡⣾⣿⣿⣿⣿⣿⣿⣿⡿⠛⠉⢀⡠⠔⢜⣱⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ⣿⣿⣿⡿⡸⡘⢜⣧⣾⣿⣿⣿⣿⣿⣿⠿⢛⡡⠤⡒⢪⣑⣬⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ⣿⣿⣿⡇⡇⡣⣷⣿⣿⣿⣿⣿⠿⡛⡣⡋⣕⣬⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ⣿⣿⣿⣿⣮⣺⣿⣿⣟⣻⣩⣢⣵⣾⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿⠿

Ich habe ein Werkzeug dafür in Go namens dotmatrix erstellt: Ссылка

    
Kevin Cantwell 01.08.2017 17:18
quelle