Moin! Ich brauch mal ein wenig Denkhilfe zu einem Ansatz. Ich möchte zu einem Font möglichst schnell ähnlich aussehende andere Fonts finden. Zu diesem Zweck nehme ich mir einen Buchstaben, erstelle mit ImageMagick ein Bild von diesem Buchstaben und stauche das alles ein wenig zurecht. Von diesem Bild erstelle ich mir ein "Fingerprint", welches bestimmte Eigenschaften numerisch erfasst. So ein Fingerprint sieht ungefähr so aus: 50-50-50-50-50-50-50 Ein Font, der sehr ähnlich aussieht, und sich nur ein klein wenig unterscheidet, könnte diesen Fingerprint haben: 50-50-50-51-49-50-50 Also einmal +1 (wegen 51) und einmal -1 (wegen 49), macht zusammen eine Differenz von "2". Zusätzlich muß ich sagen, daß der Fingerprint nicht aus 7 Zahlen besteht, wie eben behauptet, sondern aus 64, mit Werten von 00 bis 99. So. Und jetzt möchste ich das ganze über MySQL suchen. Gibt es eine Möglichkeit, sowas in MySQL zu realisieren, ohne - den Fingerprint in 64 Felder ... - ... oder 64 Datensätze aufzusplitten - und ohne ALLE Werte auszulesen und die Nachverarbeitung in perl zu machen? Also, sprich: SELECT * FROM fingerprints ORDER DESC komische_formel ....und ich muß mir nur noch die besten 10 Treffer abholen? Der beste Tipgeber darf ein Exemplar unserer Freien Software kostenlos downloaden! :-) Gruß, Ratti -- -o) fontlinge | Fontmanagement for Linux | Schriftenverwaltung in Linux /\\ http://freshmeat.net/projects/fontlinge/ _\_V http://www.gesindel.de https://sourceforge.net/projects/fontlinge/
Joerg Rossdeutscher schrieb:
Ich brauch mal ein wenig Denkhilfe zu einem Ansatz.
Ich möchte zu einem Font möglichst schnell ähnlich aussehende andere Fonts finden. Zu diesem Zweck nehme ich mir einen Buchstaben, erstelle mit ImageMagick ein Bild von diesem Buchstaben und stauche das alles ein wenig zurecht. Von diesem Bild erstelle ich mir ein "Fingerprint", welches bestimmte Eigenschaften numerisch erfasst.
So ein Fingerprint sieht ungefähr so aus:
50-50-50-50-50-50-50
Ein Font, der sehr ähnlich aussieht, und sich nur ein klein wenig unterscheidet, könnte diesen Fingerprint haben:
50-50-50-51-49-50-50
Also einmal +1 (wegen 51) und einmal -1 (wegen 49), macht zusammen eine Differenz von "2".
Zusätzlich muß ich sagen, daß der Fingerprint nicht aus 7 Zahlen besteht, wie eben behauptet, sondern aus 64, mit Werten von 00 bis 99.
So. Und jetzt möchste ich das ganze über MySQL suchen.
Gibt es eine Möglichkeit, sowas in MySQL zu realisieren, ohne - den Fingerprint in 64 Felder ... - ... oder 64 Datensätze aufzusplitten - und ohne ALLE Werte auszulesen und die Nachverarbeitung in perl zu machen?
Also, sprich:
SELECT * FROM fingerprints ORDER DESC komische_formel
....und ich muß mir nur noch die besten 10 Treffer abholen?
SELECT SIMILAR_FONT, SIMILARITY FROM SIMILAR_FONTS WHERE FONT = ? AND SIMILARITY > 0.75 ORDER BY SIMILARITY DESC, sprich, zu jedem Font eine Liste ähnlicher Fonts (so etwas wie eine Fontfamilie) zu hinterlegen, wäre vielleicht ein einfacherer Ansatz. BTW, falls Du eine sinnvolle Kodierung hast, könntest Du die (Hamming-)Abstände je zweier Fonts programmatisch berechnen und das Ergebnis zwecks späterer Verwendung in einer Tabelle speichern. Speicheraufwand: N * (N - 1) / 2, wobei N die Anzahl der Fonts ist. -- Gruß Alex
Am Samstag, den 25.12.2004, 18:26 +0100 schrieb Alexander Veit:
Joerg Rossdeutscher schrieb:
Also, sprich:
SELECT * FROM fingerprints ORDER DESC komische_formel
....und ich muß mir nur noch die besten 10 Treffer abholen?
SELECT SIMILAR_FONT, SIMILARITY FROM SIMILAR_FONTS WHERE FONT = ? AND SIMILARITY > 0.75 ORDER BY SIMILARITY DESC,
sprich, zu jedem Font eine Liste ähnlicher Fonts (so etwas wie eine Fontfamilie) zu hinterlegen, wäre vielleicht ein einfacherer Ansatz.
Das klappt aber nur, wenn SIMILARITY eine Zahl ist. Schau dir nochmal meine Ursprungsmail an, es geht um eine ganze Kaskade von Zahlen.
BTW, falls Du eine sinnvolle Kodierung hast, könntest Du die (Hamming-)Abstände je zweier Fonts programmatisch berechnen und das Ergebnis zwecks späterer Verwendung in einer Tabelle speichern. Speicheraufwand: N * (N - 1) / 2, wobei N die Anzahl der Fonts ist.
Nun ist es aber so, daß ich 400.000 Fonts besitze, und der Vergleich jeder-mit-jedem wohl nicht mehr in meiner Lebenszeit fertig werden würde... :-) Deswegen der Versuch, über grobe Ähnlichkeiten eine Vorsortierung zu erreichen. Gruß, Ratti -- -o) fontlinge | Fontmanagement for Linux | Schriftenverwaltung in Linux /\\ http://freshmeat.net/projects/fontlinge/ _\_V http://www.gesindel.de https://sourceforge.net/projects/fontlinge/
Joerg Rossdeutscher schrieb:
[...]
SELECT SIMILAR_FONT, SIMILARITY FROM SIMILAR_FONTS WHERE FONT = ? AND SIMILARITY > 0.75 ORDER BY SIMILARITY DESC,
sprich, zu jedem Font eine Liste ähnlicher Fonts (so etwas wie eine Fontfamilie) zu hinterlegen, wäre vielleicht ein einfacherer Ansatz.
Das klappt aber nur, wenn SIMILARITY eine Zahl ist. Schau dir nochmal meine Ursprungsmail an, es geht um eine ganze Kaskade von Zahlen.
Der Ansatz war so gemeint, daß zu jedem Font eine Liste ähnlicher Fonts (Tabelle SIMILAR_FONTS) samt Grad der Ähnlichkeit hinterlegt würde. Vielleicht zu aufwendig bei 400.000 zu klassifizierenden Fonts.
BTW, falls Du eine sinnvolle Kodierung hast, könntest Du die (Hamming-)Abstände je zweier Fonts programmatisch berechnen und das Ergebnis zwecks späterer Verwendung in einer Tabelle speichern. Speicheraufwand: N * (N - 1) / 2, wobei N die Anzahl der Fonts ist.
Nun ist es aber so, daß ich 400.000 Fonts besitze, und der Vergleich jeder-mit-jedem wohl nicht mehr in meiner Lebenszeit fertig werden würde... :-)
Naja, 80 Mrd. Datensätzen in der MySQL-Abstandstabelle, ist wohl wirklich nicht so ganz das Wahre.
Deswegen der Versuch, über grobe Ähnlichkeiten eine Vorsortierung zu erreichen.
Falls der Fingerprint als String und in _einem_ Feld der Datenbank vorliegt, wird es mit normalen SQL-Konstrukten wahrscheinlich schwierig, das elegant und performant hinzubekommen. Immerhin gibt es in MySQL die Möglichkeit, benutzerdefinierte Funktionen (in C/C++) zu definieren. Das würde mir auf den ersten Blick noch am praktikabelsten erscheinen. -- Gruß, Alex
Hi Joerg. rechen mal aus: 100^64 das ist die Anzahl der Unterschiede die du Speichern möchtest. Ist das wirklich nötig um die Fonts vergleichen zu können? Vielleicht solltest du den Fingerprint erst mal überarbeiten. Ob es eine "komische_formel" in mysql gibt bezweifele ich, --> http://dev.mysql.com/doc/mysql/de/Functions.html du wirst dir wohl deinen eigenen Vergleichsalgorithmus, passen zu dem Fingerprint stricken müssen. gruss und schönes Fest Kai
Hallo Am Samstag, den 25.12.2004, 20:41 +0100 schrieb Kai Hauser:
Hi Joerg. rechen mal aus: 100^64 das ist die Anzahl der Unterschiede die du Speichern möchtest.
Ne, möchte ich eben nicht. Es gibt ja nur einen Fingerprint pro Font - also bei 400.000 Fonts ebensoviele Fingerprints. Nötig wäre eben "nur" eine Funktion in MySQL, der ich den gesuchten Fingerprint übergeben würde, z.B. "10-20-30-40-50", und die mir die "ähnlichsten" Fingerprints zurückgibt - eben sortiert nach Ähnlichkeit. Ich hatte schon vermutet, daß es diese Funktion nicht gibt. Schade.
Ist das wirklich nötig um die Fonts vergleichen zu können? Vielleicht solltest du den Fingerprint erst mal überarbeiten.
Naja, das Aussehen eines Fonts kann man eben nicht in einer einfach Zahl speichern. Der Fingerprint kommt so zustande: Ich erstelle ein leeres Bild. Darin wird der Buchstabe mit 128 Pixeln Größe geschrieben. Dann wird der weiße Rand abgeschnitten. (Damit ist sichergestellt, daß der Buchstabe komplett drauf ist und genau bis an den Rand geht) Das Bild wird jetzt unproportional gezerrt, bis es genau 128x128 Pixel groß ist. Dann wird es in 8x8 kleine Bilder zerlegt - macht 64 Bilder. Für jedes dieser Bilder wird ermittelt, wieviele Pixel weiss sind, und wie viele Schwarz, umgerechnet in Prozent. (Naja. Fast. Um der Zweistelligkeit willen rechne ich mit 99 statt 100 als Maximum) Die 64 Werte ergeben dann den Fingerprint: 00 für weiss, 99 für Schwarz, 50 für "halb". Das mag sich umständlich lesen, da es aber auf Manipulationsmethoden in ImageMagick zurückgeht, läuft es schneller als ein perl-Eigenbau. Wenn ich zwei Bilder XOR überblende, finde ich ziemlich fix raus, wie ähnlich sich die abgebildeten Buchstaben sind. Und da es auf sw-Bilder optimiert ist, liefert es bessere Resultate als die ImageMagick-Bildvergleichsfunktion. Fast alles prima, also. Aber: Wenn ich das jetzt so durchlaufen lasse, kann ich anhand eines gescannten Bildes innerhalb einiger Stunden herausfinden, ob ich den abgebildeten Font habe. Es werden einfach ALLE Fonts aus einer vorsortierten Kategorie getestet, so ungefähr bis zu 80.000. Wenn es mir gelänge, vorher Fingerprints zu checken, liesse sich das auf ganz wenig Zeit reduzieren.
Ob es eine "komische_formel" in mysql gibt bezweifele ich, --> http://dev.mysql.com/doc/mysql/de/Functions.html du wirst dir wohl deinen eigenen Vergleichsalgorithmus, passen zu dem Fingerprint stricken müssen.
Da die Software herumpubliziert wird, ist das wohl zum scheitern verurteilt. Zumal C++ sich konsequent dem gelerntwerden widersetzt, die freche Sprache, die. ;) Aber Danke! Gruß, Ratti -- -o) fontlinge | Fontmanagement for Linux | Schriftenverwaltung in Linux /\\ http://freshmeat.net/projects/fontlinge/ _\_V http://www.gesindel.de https://sourceforge.net/projects/fontlinge/
Joerg Rossdeutscher schrieb:
Hallo
Am Samstag, den 25.12.2004, 20:41 +0100 schrieb Kai Hauser:
Hi Joerg. rechen mal aus: 100^64 das ist die Anzahl der Unterschiede die du Speichern möchtest.
Ne, möchte ich eben nicht. Es gibt ja nur einen Fingerprint pro Font - also bei 400.000 Fonts ebensoviele Fingerprints.
du hattest geschrieben: "mit Werten von 00 bis 99" nicht mit 3 Werten (00,50,99)
Naja, das Aussehen eines Fonts kann man eben nicht in einer einfach Zahl speichern.
Sicher kann man das, für die CPU sind Fonts auch nur Zahlen (0,1) und außerdem die ganze Welt besteht nur aus Zahlen (den Film PI gesehn?) ;-)
Der Fingerprint kommt so zustande:
Ich erstelle ein leeres Bild. Darin wird der Buchstabe mit 128 Pixeln Größe geschrieben. Dann wird der weiße Rand abgeschnitten.
(Damit ist sichergestellt, daß der Buchstabe komplett drauf ist und genau bis an den Rand geht)
Das Bild wird jetzt unproportional gezerrt, bis es genau 128x128 Pixel groß ist.
geht daruch nicht der Font "kaputt"? Wie erkennt man da noch den Unterschied zw zb einem o und einer 0, unproportional gezerrt sehn die in etwa gleich aus oder?
Dann wird es in 8x8 kleine Bilder zerlegt - macht 64 Bilder.
hmm nicht 16 Bilder, ok 64 Werte.
Für jedes dieser Bilder wird ermittelt, wieviele Pixel weiss sind, und wie viele Schwarz, umgerechnet in Prozent. (Naja. Fast. Um der Zweistelligkeit willen rechne ich mit 99 statt 100 als Maximum)
Die 64 Werte ergeben dann den Fingerprint: 00 für weiss, 99 für Schwarz, 50 für "halb".
Die drei Werte kannst du in 2 bits speichern. In Zahlen wär das 0, 1 und 2. 00 = weis = 0 01 = schwarz = 1 10 = "halb" = 2 Um so 64 Werte zu Speichern bräuchtest du 128 bit = 16 Byte Das kannst du evtl sogar noch in einer Varibalen in mysql speichern wenn nicht halt in 16 unsigned tinyint und da die Werte schön binär Vorliegen würden kann die CPU auch schneller mit umgehn. hoffe es hilft dir etwas weiter, denn das ganze hört sich richtig Praktisch an.
Hi Nachtrag zu meinem vorherigen Posting: Die von mir vorgeschlagenen Werte müßten natürlich aus den Pixel gewonnen werden und nicht aus den Fingerprints.
Die drei Werte kannst du in 2 bits speichern. In Zahlen wär das 0, 1 und 2. 00 = weis = 0 01 = schwarz = 1 10 = "halb" = 2
Um so 64 Werte zu Speichern bräuchtest du 128 bit = 16 Byte Das kannst du evtl sogar noch in einer Varibalen in mysql speichern wenn nicht halt in 16 unsigned tinyint und da die Werte schön binär Vorliegen würden kann die CPU auch schneller mit umgehn.
Wie kannst Du aus dem Wert eine für Dich interessante Aussage ziehen? Letztendlich willst Du wahrscheinlich auf eine mathematische Differenz raus. Aber da Du das Problem, dass höherwertige Bits eine höhere Differenz ergeben, obwohl sie eigentlich keinen grösseren Unterschied ausdrücken. Bye -- 1 Bodo Kaelberer 123 http://www.webkind.de/ http://www.kaelberer-aio.de/ 3 Seelig sind die, die da arm an Geist sind, denn sie werden 4 sich Christlich Soziale Union nennen.
Bodo Kaelberer schrieb:
Wie kannst Du aus dem Wert eine für Dich interessante Aussage ziehen? Letztendlich willst Du wahrscheinlich auf eine mathematische Differenz raus. Aber da Du das Problem, dass höherwertige Bits eine höhere Differenz ergeben, obwohl sie eigentlich keinen grösseren Unterschied ausdrücken.
durch Bitweises vergleichen. Bei der Auswertung gibts du dem halb-bit nur 50% gewichtigkeit, schwarz und weis 100% Beispiel mit einem Prozentwert: Font1: 01 Font2: 01 100% übereinstimmung Font1: 00 Font2: 01 0% übereinstimmung sonderfall "halb"-bit ist gesetz: Font1: 10 Font2: 10 100% übereinstimmung Font1: 00 Font2: 10 50% übereinstimmung Was ist mit der unproportionalen Verzerrung der Font-Bitmaps, erklärst du mir warum das funktioniert?
Morgen!
Wie kannst Du aus dem Wert eine für Dich interessante Aussage ziehen? Letztendlich willst Du wahrscheinlich auf eine mathematische Differenz raus. Aber da Du das Problem, dass höherwertige Bits eine höhere Differenz ergeben, obwohl sie eigentlich keinen grösseren Unterschied ausdrücken.
durch Bitweises vergleichen. Bei der Auswertung gibts du dem halb-bit nur 50% gewichtigkeit, schwarz und weis 100% Beispiel mit einem Prozentwert: Font1: 01 Font2: 01 100% übereinstimmung Font1: 00 Font2: 01 0% übereinstimmung
sonderfall "halb"-bit ist gesetz: Font1: 10 Font2: 10 100% übereinstimmung Font1: 00 Font2: 10 50% übereinstimmung
Im vorliegenden Fall hast Du aber 64 Werte, die je eine 0%, 50% oder 100% Übereinstimmung haben können. OP wollte keine 64 Spalten machen (nachvollziehbar). Wenn aber die 128 Bit in eine einzige Zahl verpackt werden, wie dann einen Unterschied berechenbar machen? Doch nur über eine Differenz. Aber dann kann selbst bei einer Abweichung in lediglich einem der 64 Werten ein Unterschied zwischen 1 und 2^127 (?) die Folge sein. Da bräuchtest Du eine Möglichkeit die Anzahl der 1-er in der binären Darstellung einer Zahl zu erhalten. Ich glaube nicht, dass MySQL so etwas anbietet. Im Programm ist es dann möglich und sicherlich schneller als eine Zeichenkette mit 64 * 2 Chars zu analysieren.
Was ist mit der unproportionalen Verzerrung der Font-Bitmaps, erklärst du mir warum das funktioniert?
Das sollte keine Rolle spielen, wenn die Verzerrung im selben Masse auf die zu untersuchende Bitmap wie auf die in der Datenbank angewendet werden. WARUM OP das gemacht hat, kann ich mir auch nicht gänzlich erklären. Ich vermute, weil es die Handhabung erleichert. Denn sonst wäre es ziemlich schwierig, die Zeichen richtig auszuschneiden und zugleich eine einheitliche Behandlung durchführen zu können. Was ich mich auch noch frage: Werden eigentliche alle Buchstaben so indiziert (also 400.000 * >= 52) oder nur einzelne. Was aber, wenn dann ausgerechnet die nicht im zu erkennenen Text vorhanden sind - bei kurzen Texten sicherlich möglich. Bye -- 1 Bodo Kaelberer 123 http://www.webkind.de/ http://www.kaelberer-aio.de/ 3 Seelig sind die, die da arm an Geist sind, denn sie werden 4 sich Christlich Soziale Union nennen.
Bodo Kaelberer schrieb:
Wenn aber die 128 Bit in eine einzige Zahl verpackt werden, wie dann einen Unterschied berechenbar machen? Doch nur über eine Differenz.
Stichwort: Bitoperatoren
Aber dann kann selbst bei einer Abweichung in lediglich einem der 64 Werten ein Unterschied zwischen 1 und 2^127 (?) die Folge sein. Da bräuchtest Du eine Möglichkeit die Anzahl der 1-er in der binären Darstellung einer Zahl zu erhalten. Ich glaube nicht, dass MySQL so etwas anbietet.
mysql ist keine Programmiersprache, sql ist eine Datenabfragesprache Perl ist eine Programmiersprache
Am Sonntag, den 26.12.2004, 14:51 +0100 schrieb Kai Hauser:
Bodo Kaelberer schrieb:
Wenn aber die 128 Bit in eine einzige Zahl verpackt werden, wie dann einen Unterschied berechenbar machen? Doch nur über eine Differenz.
Stichwort: Bitoperatoren
Liefert dir eine bitweise Verknüpfung. Was man aber bräuchte, ist die Anzahl(!) der "Einsen" im Resultat. Geht also nicht.
Aber dann kann selbst bei einer Abweichung in lediglich einem der 64 Werten ein Unterschied zwischen 1 und 2^127 (?) die Folge sein. Da bräuchtest Du eine Möglichkeit die Anzahl der 1-er in der binären Darstellung einer Zahl zu erhalten. Ich glaube nicht, dass MySQL so etwas anbietet.
mysql ist keine Programmiersprache, sql ist eine Datenabfragesprache Perl ist eine Programmiersprache
Eine exakte Beschreibung meines Problems. :-) Gruß, Ratti -- -o) fontlinge | Fontmanagement for Linux | Schriftenverwaltung in Linux /\\ http://freshmeat.net/projects/fontlinge/ _\_V http://www.gesindel.de https://sourceforge.net/projects/fontlinge/
Joerg Rossdeutscher schrieb:
Am Sonntag, den 26.12.2004, 14:51 +0100 schrieb Kai Hauser:
Bodo Kaelberer schrieb:
Wenn aber die 128 Bit in eine einzige Zahl verpackt werden, wie dann einen Unterschied berechenbar machen? Doch nur über eine Differenz.
Stichwort: Bitoperatoren
Liefert dir eine bitweise Verknüpfung. Was man aber bräuchte, ist die Anzahl(!) der "Einsen" im Resultat. Geht also nicht.
Wieso soll das nicht gehn, ach du meine Güte. Du könntest zb shiften. Mein Vorschlag: Perl doku lesen (und verstehen)
Moin, Am Sonntag, den 26.12.2004, 15:53 +0100 schrieb Kai Hauser:
Joerg Rossdeutscher schrieb:
Am Sonntag, den 26.12.2004, 14:51 +0100 schrieb Kai Hauser:
Stichwort: Bitoperatoren
Liefert dir eine bitweise Verknüpfung. Was man aber bräuchte, ist die Anzahl(!) der "Einsen" im Resultat. Geht also nicht.
Wieso soll das nicht gehn, ach du meine Güte. Du könntest zb shiften. Mein Vorschlag: Perl doku lesen (und verstehen)
Geht natürlich, aber eben in perl und nicht in MySQL. Du kannst dir ja verstellen, wie lange eine 400000er-Schleife in perl läuft, die alle Datensätze abholt und was damit macht... Um das noch mal deutlich zu machen: Das alles ist überhaupt nicht schwer zu programmieren - ich habe einfach ein erhebliches Performanceproblem! Das Programm ist ja schon fertig. Es ist nur einfach zu langsam, deswegen suche ich nach Optimierungen, die weniger perl und mehr MySQL verwenden. Gruß, Ratti -- -o) fontlinge | Fontmanagement for Linux | Schriftenverwaltung in Linux /\\ http://freshmeat.net/projects/fontlinge/ _\_V http://www.gesindel.de https://sourceforge.net/projects/fontlinge/
Joerg Rossdeutscher schrieb:
Geht natürlich, aber eben in perl und nicht in MySQL. Du kannst dir ja verstellen, wie lange eine 400000er-Schleife in perl läuft, die alle Datensätze abholt und was damit macht...
Um das noch mal deutlich zu machen: Das alles ist überhaupt nicht schwer zu programmieren - ich habe einfach ein erhebliches Performanceproblem!
Das Programm ist ja schon fertig. Es ist nur einfach zu langsam, deswegen suche ich nach Optimierungen, die weniger perl und mehr MySQL verwenden.
Die Daten in mysql zu speichern ist aber keine Optimierung sondern machts eher noch langsamer da zusätzlich mysql arbeiten muss und du zusätzliche mysql-funktionen verwenden musst. Wenn du den Fingerprint und die meta-beschreibungen für die Fonts optimiert hast kannst du das natürlich auch in mysql speichern, wenns aber so schon langsam ist machts wohl Sinn, verstehst du.
Hallöchen
Liefert dir eine bitweise Verknüpfung. Was man aber bräuchte, ist die Anzahl(!) der "Einsen" im Resultat. Geht also nicht.
Wieso soll das nicht gehn, ach du meine Güte. Du könntest zb shiften. Mein Vorschlag: Perl doku lesen (und verstehen)
Geht natürlich, aber eben in perl und nicht in MySQL. Du kannst dir ja verstellen, wie lange eine 400000er-Schleife in perl läuft, die alle Datensätze abholt und was damit macht...
Das hängt natürlich stark davon ab, welche Datenmengen Du ausliest und wie aufwendig diese zu verarbeiten sind. Es ist wahrscheinlich, dass sich die Performance mit einem weniger aufwendigen Kriterium deutlich verbessern wird. 400.000 Zahlwerte auszulesen und zu subtrahieren ist etwas ganz anderes als 400.000 Zeichenketten a 128 chars auszulesen und mittels je 64 Operationen (plus Typenumwandlungen) zu vergleichen. Mit besseren Kriterien könntest Du also die Performance sicher steigern ohne auf komplexe Logik im Perl-Code zu verzichten. Bye -- 1 Bodo Kaelberer 123 http://www.webkind.de/ http://www.kaelberer-aio.de/ 3 Seelig sind die, die da arm an Geist sind, denn sie werden 4 sich Christlich Soziale Union nennen.
Am Sonntag, den 26.12.2004, 11:41 +0100 schrieb Bodo Kaelberer:
Was ich mich auch noch frage: Werden eigentliche alle Buchstaben so indiziert (also 400.000 * >= 52) oder nur einzelne. Was aber, wenn dann ausgerechnet die nicht im zu erkennenen Text vorhanden sind - bei kurzen Texten sicherlich möglich.
Der "Text" ist nur ein einzelnes Zeichen. Alles andere wäre jetzt erstmal zu komplex (und, so zeigt die Praxis, eigentlich auch nicht nötig) Derzeit läuft das so: fontlinge_compare suchbild.png "X" In "suchbild.png" befindet sich der Buchstabe X abgebildet. Dann werden alle Fonts, deren Pfad in einer MySQL-Datenbank aufgelistet ist, durchprobiert. Es wird ein Bild mit einem "X" drin generiert und grafisch verglichen. Sollte meine Frage hier zu einer vernünftigen Lösung führen, würde eine Datenbank erstellt, die die Fingerprints für jeden Font und für jeden Buchstaben generiert. Ja, 400.000 x 52. Das Programm würde dann aus dem Bild einen Fingerprint berechnen und aus der Datenbank die sagenwirmal 100 ähnlichsten Fingerprints für den gleichen Buchstaben raussuchen. Für diese 100 Fonts würde nach dem bereits jetzt funktionierenden Verfahren der "best match" gesucht. Derzeit muß ich auf die Vorauswahl verzichten, und das dauert dann recht lange. Gruß, Ratti -- -o) fontlinge | Fontmanagement for Linux | Schriftenverwaltung in Linux /\\ http://freshmeat.net/projects/fontlinge/ _\_V http://www.gesindel.de https://sourceforge.net/projects/fontlinge/
Moin, Am Samstag, den 25.12.2004, 23:24 +0100 schrieb Kai Hauser:
Joerg Rossdeutscher schrieb:
Am Samstag, den 25.12.2004, 20:41 +0100 schrieb Kai Hauser: Ne, möchte ich eben nicht. Es gibt ja nur einen Fingerprint pro Font - also bei 400.000 Fonts ebensoviele Fingerprints.
du hattest geschrieben: "mit Werten von 00 bis 99" nicht mit 3 Werten (00,50,99)
00,50,99 sind nur Beispiele gewesen. Ich definier den Fingerprint jetzt mal ganz genau. Er hat genau die Form: XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX wobei jedes XX-Pärchen ein Integer zwischen(!) 0 und 99 ist.
Naja, das Aussehen eines Fonts kann man eben nicht in einer einfach Zahl speichern.
Sicher kann man das, für die CPU sind Fonts auch nur Zahlen (0,1) und außerdem die ganze Welt besteht nur aus Zahlen (den Film PI gesehn?) ;-)
Der ganz Font besteht aus Zahlen. :-) Allerdings müssen diese Zahlen wohl in eine genehmere Form gewandelt werden, jedenfalls solange, bis MySQL v99.9 einen Query erlaubt wie: SELECT fonts WHERE look_like_the_image SCAN.PNG :-)
Das Bild wird jetzt unproportional gezerrt, bis es genau 128x128 Pixel groß ist.
geht daruch nicht der Font "kaputt"? Wie erkennt man da noch den Unterschied zw zb einem o und einer 0, unproportional gezerrt sehn die in etwa gleich aus oder?
Mehrere Dinge: 1. Die Routine erlaubt mir, von einem gescannten Text den abgebildeten Font zu ermitteln. Da man in jeder DTP-Software an Schriften "rumziehen" kann, ist die Möglichkeit größer, daß das Original erkannt wird. 2. Oft hilft eine Fehlerkennung trotzdem weiter. Die Routine matcht ja nur auf Fonts, die man besitzt, und wenn ein Bild auf "Helvetica Condensed" matched, obwohl auf dem Bild definitv eine "Regular" zu sehen ist, brauche ich mir nur das Schriftmuster des Herstellers im Internet anzusehen, und das kann ich dann kaufen. 3. Die Routine erlaubt auf diese Weise eine gewisse Vorsortierung, bei der der Rechner ohne manuellen Eingriff erkennt, welcher Kategorie die Schrift angehört. Zum Beispiel skalieren bei serifenlosen Schriften fast alle kleinen "i" zu dem gleichen Bild. Die Software vergleicht nicht nur Bild-mit-Font, sondern auch Font-mit-Font. Wenn ich das "i" von "Unbekannt.ttf" vergleiche mit dem "i" aus "Arial.ttf", erhalte ich dank der Skalierung Werte über 98%. Die Routine vergleicht immer nur einen einzelnen Buchstaben. Daher kann ein "o" nicht mit einer "0" verwechselt werden. Der Trick ist, bei einer Suche lieber einen Buchstaben wie "Q" zu verwenden, wenn man DIESEN Font sucht, und lieber ein "l" oder "i" zu nehmen, wenn man grobe Kategorien sucht. 4. Man sucht selten nach einem Font, der eine normale Brotschrift zeigt. Wieso auch - davon hat man etliche. Meistens geht es um eine irgendwie besondere Schrift, und da hat man durch die Skalierung bessere Resultate, weil man auch ähnliche Fonts findet. Häufig reicht das.
Für jedes dieser Bilder wird ermittelt, wieviele Pixel weiss sind, und wie viele Schwarz, umgerechnet in Prozent. (Naja. Fast. Um der Zweistelligkeit willen rechne ich mit 99 statt 100 als Maximum)
Die 64 Werte ergeben dann den Fingerprint: 00 für weiss, 99 für Schwarz, 50 für "halb".
Die drei Werte kannst du in 2 bits speichern. In Zahlen wär das 0, 1 und 2. 00 = weis = 0 01 = schwarz = 1 10 = "halb" = 2
Wie gesagt: Das wareb Beispiele. Für 0-99 brauche ich 7 Bits
Um so 64 Werte zu Speichern bräuchtest du 128 bit = 16 Byte Das kannst du evtl sogar noch in einer Varibalen in mysql speichern wenn nicht halt in 16 unsigned tinyint und da die Werte schön binär Vorliegen würden kann die CPU auch schneller mit umgehn.
Die Repräsentation der Daten ist ja relativ egal, ich denke, das Problem liegt so, egal, welches Format man jetzt wählt: Es gibt eine "Liste" mit Werten. Alle diese Werte sind gleich wichtig. Es gibt keine Funktion in MySQL, die zwei Listen miteinander vergleicht und die Anzahl/Stärke der Abweichungen zurück gibt. Alle Formate gehen davon aus, daß es "wichtige" und "weniger wichtigere" Daten gibt, in denen man dann mit größer, kleiner, gleich den besten Treffer ermittelt.
Wo Du schon "Kategorien" sagst: Wie wäre es mit einem Zahlenwert, der zwar nicht die Präzision Deines Fingerprints hat, aber eine gewisse Vorsortierung erlaubt? So das sich mit einem Statement die X % der Fonts gewinnen lassen, bei denen eine Untersuchung mit höher Präzission aussichtsreich ist?
Genau das soll der Fingerprint ja sein - eine Vorsortierung, bevor die Bilder/Fonts richtig verglichen werden, denn das dauert.
Dazu könnte man ein paar Kriterien erarbeiten, deren Ergebnis sich je in einer kleinen Zahl ausdrücken läßt. Was mir einfällt:
A: Der summierte Schwarzanteil in allen 64 Werten. Mit einem solchen Wert lassen sich dicke Fonts von eher zarten trennen.
Hm, die Idee ist gut. Sehr gut. Kennt MySQL denn eine Funktion SELECT * FROM fonts SORT zahl möglichst nahe an 6743653475 ? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
B: Die Wahrscheinlichkeit, dass im Umfeld eines Wertes ein ähnlicher Wert kommt, daß also z.B. neben einem schwarzen Punkt wieder ein schwarzer kommt. Dieser Wert müsste beim serifenlosen Schriften niedriger sein als bei Schriften mit Serifen.
Das Projekt läuft in perl. Bestimmte Dinge verbieten sich einfach, weil sie zu lahm sind. (A) bekomme ich mit Tricks grafisch raus. Sowas wie (B) nicht. Grübel, grübel... tja, da hast du wohl gerade meiner Freundin den Feiertag versaut. Ich muß heute coden. :-) Gruß, Ratti -- -o) fontlinge | Fontmanagement for Linux | Schriftenverwaltung in Linux /\\ http://freshmeat.net/projects/fontlinge/ _\_V http://www.gesindel.de https://sourceforge.net/projects/fontlinge/
Hallo
Dazu könnte man ein paar Kriterien erarbeiten, deren Ergebnis sich je in einer kleinen Zahl ausdrücken läßt. Was mir einfällt:
A: Der summierte Schwarzanteil in allen 64 Werten. Mit einem solchen Wert lassen sich dicke Fonts von eher zarten trennen.
Hm, die Idee ist gut. Sehr gut.
Kennt MySQL denn eine Funktion SELECT * FROM fonts SORT zahl möglichst nahe an 6743653475 ? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Die Sortierung? Wäre wohl nützlicher als ein Grenzwert für die Abweichung. Fällt mir aber leider kein Statement zu ein.
B: Die Wahrscheinlichkeit, dass im Umfeld eines Wertes ein ähnlicher Wert kommt, daß also z.B. neben einem schwarzen Punkt wieder ein schwarzer kommt. Dieser Wert müsste beim serifenlosen Schriften niedriger sein als bei Schriften mit Serifen.
Das Projekt läuft in perl. Bestimmte Dinge verbieten sich einfach, weil sie zu lahm sind. (A) bekomme ich mit Tricks grafisch raus. Sowas wie (B) nicht.
Zur Zeit der Erkennung des verwendeten Fonts wäre das nicht angebracht. Aber warum nicht bei einer einmaligen Analyse der Fonts?
Grübel, grübel... tja, da hast du wohl gerade meiner Freundin den Feiertag versaut. Ich muß heute coden. :-)
Dann kann ich jetzt mit meiner Tochter spielen (-: Bye -- 1 Bodo Kaelberer 123 http://www.webkind.de/ http://www.kaelberer-aio.de/ 3 Seelig sind die, die da arm an Geist sind, denn sie werden 4 sich Christlich Soziale Union nennen.
Joerg Rossdeutscher schrieb:
Moin,
du hattest geschrieben: "mit Werten von 00 bis 99" nicht mit 3 Werten (00,50,99)
00,50,99 sind nur Beispiele gewesen. Ich definier den Fingerprint jetzt mal ganz genau. Er hat genau die Form:
XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX
wobei jedes XX-Pärchen ein Integer zwischen(!) 0 und 99 ist.
64 Felder mit Werten zw 0 und 99: 100^64 verschiedene Werte(!)
Allerdings müssen diese Zahlen wohl in eine genehmere Form gewandelt werden, jedenfalls solange, bis MySQL v99.9 einen Query erlaubt wie:
SELECT fonts WHERE look_like_the_image SCAN.PNG
:-)
Ich würde mysql, wenn überhaupt, als reinen Datenspeicher benutzen. Mit Perl die Daten auslesen und analysieren.
Am Sonntag, den 26.12.2004, 14:40 +0100 schrieb Kai Hauser:
Joerg Rossdeutscher schrieb:
00,50,99 sind nur Beispiele gewesen. Ich definier den Fingerprint jetzt mal ganz genau. Er hat genau die Form:
XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX
wobei jedes XX-Pärchen ein Integer zwischen(!) 0 und 99 ist.
64 Felder mit Werten zw 0 und 99: 100^64 verschiedene Werte(!)
Hm? 400.000 Fonts. Jeder mit 52 Zeichen [a-zA-Z] Macht 400.000 x 52 Fingerprints/Datensätze. Was ich ja vermeiden wollte, war, für jeden der 64 Einzelwerte ein Feld anzulegen, aber selbst dann kommen wir auf 400.000 x 52 x 64 Fingerprint"werte". Unangenehm viel, aber kein 100^64.
Ich würde mysql, wenn überhaupt, als reinen Datenspeicher benutzen. Mit Perl die Daten auslesen und analysieren.
Das tue ich ja schon, das klappt auch, ist aber zu lahm. Ich brauche eine Vorauswahl. Da hat sich hier ja inzwischen was nettes ergeben. Gruß, Ratti -- -o) fontlinge | Fontmanagement for Linux | Schriftenverwaltung in Linux /\\ http://freshmeat.net/projects/fontlinge/ _\_V http://www.gesindel.de https://sourceforge.net/projects/fontlinge/
Joerg Rossdeutscher schrieb:
Am Sonntag, den 26.12.2004, 14:40 +0100 schrieb Kai Hauser:
Joerg Rossdeutscher schrieb:
00,50,99 sind nur Beispiele gewesen. Ich definier den Fingerprint jetzt mal ganz genau. Er hat genau die Form:
XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX-XX
wobei jedes XX-Pärchen ein Integer zwischen(!) 0 und 99 ist.
64 Felder mit Werten zw 0 und 99: 100^64 verschiedene Werte(!)
Hm?
400.000 Fonts. Jeder mit 52 Zeichen [a-zA-Z]
Macht 400.000 x 52 Fingerprints/Datensätze.
Was ich ja vermeiden wollte, war, für jeden der 64 Einzelwerte ein Feld anzulegen, aber selbst dann kommen wir auf 400.000 x 52 x 64 Fingerprint"werte".
Unangenehm viel, aber kein 100^64.
ok letzter versuch *g* Stichwort: _Zahlensysteme_ zu vereinfachung, schreib einfach 64 mal 99 nebeneinander: 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 da jedes XX von 0-99 (100 Werte) geht, hast du 100^64 verschiedene Werte. um genau zu sein wären es dann also 100^64 * 400.000 * 52 Werte insgesamt.
Ich würde mysql, wenn überhaupt, als reinen Datenspeicher benutzen. Mit Perl die Daten auslesen und analysieren.
Das tue ich ja schon, das klappt auch, ist aber zu lahm. Ich brauche eine Vorauswahl. Da hat sich hier ja inzwischen was nettes ergeben.
genau das ist was ich im ersten Reply geschrieben habe: optimiere den Vergleichsalgorithmus + Fingerprint. Ich denke es macht nicht wirklich Sinn einen Bildbereich mit einem Prozentwert von 0-99 zu beschreiben, da kann man auch gleich die Bitmaps vergleichen. Als erstes würde ich die Meta-Daten der Fonts auslesen und vergleichen, dann würd ich von allen Fonts ein Bitmap speichern, das muss nur einmal gemacht werden nicht bei jedem Vergleich, dann würd ich zu jedem Font Meta-Angaben generieren, wenn die internen nicht reichen, zb Abstände und Stil. Dann Kategorien bilden. Das ganze in mysql speichern. Um dann von einem eingescannten bzw Font als Bitmap zu vergleichen, würd ich ein zwei Buchstaben bei denen die Unterschiede am ausgeprägtesten sind als Referenz definiern. Dann erkennen welcher Stil es ist (serif oder was) und nur die Kategorie vergleichen. Kein Ergebniss - die Suchkategorien erweitern und nochmal. blabla, das sind alles Denkansätze die dir hoffentlich weiterhelfen, oder auch nicht, ich kenn mich mit Fonts nicht genug aus um dir eine detailierte Lösung zu präsentieren. mach doch mal n announcment auf Sourceforge http://sf.net/people/ vielleicht joint ja der ein oder andere noch deinem Projekt. Was sagen eigentlich die anderen Projektmitglieder haben die keine Ideen? Hier wirst du sehr wahrscheinlich nur Hilfe zu grundsätzlichen Problemen bekommen, da diese Liste sich mit Programmieren unter Linux beschäftigt, Perl und mysql kann man da einschliesen, Fonts eher nicht. Weist du warum mysql "so schnell ist", weil es die Daten binär speichert. Dazu kommen noch die Indizes und die optimierte Strukturierung der Daten, wofür aber der Benutzer zuständig ist.
Abend!
Dann wird es in 8x8 kleine Bilder zerlegt - macht 64 Bilder.
Für jedes dieser Bilder wird ermittelt, wieviele Pixel weiss sind, und wie viele Schwarz, umgerechnet in Prozent. (Naja. Fast. Um der Zweistelligkeit willen rechne ich mit 99 statt 100 als Maximum)
Die 64 Werte ergeben dann den Fingerprint: 00 für weiss, 99 für Schwarz, 50 für "halb".
Das mag sich umständlich lesen, da es aber auf Manipulationsmethoden in ImageMagick zurückgeht, läuft es schneller als ein perl-Eigenbau.
Wenn ich zwei Bilder XOR überblende, finde ich ziemlich fix raus, wie ähnlich sich die abgebildeten Buchstaben sind. Und da es auf sw-Bilder optimiert ist, liefert es bessere Resultate als die ImageMagick-Bildvergleichsfunktion.
Fast alles prima, also.
Aber: Wenn ich das jetzt so durchlaufen lasse, kann ich anhand eines gescannten Bildes innerhalb einiger Stunden herausfinden, ob ich den abgebildeten Font habe. Es werden einfach ALLE Fonts aus einer vorsortierten Kategorie getestet, so ungefähr bis zu 80.000.
Wo Du schon "Kategorien" sagst: Wie wäre es mit einem Zahlenwert, der zwar nicht die Präzision Deines Fingerprints hat, aber eine gewisse Vorsortierung erlaubt? So das sich mit einem Statement die X % der Fonts gewinnen lassen, bei denen eine Untersuchung mit höher Präzission aussichtsreich ist? Dazu könnte man ein paar Kriterien erarbeiten, deren Ergebnis sich je in einer kleinen Zahl ausdrücken läßt. Was mir einfällt: A: Der summierte Schwarzanteil in allen 64 Werten. Mit einem solchen Wert lassen sich dicke Fonts von eher zarten trennen. B: Die Wahrscheinlichkeit, dass im Umfeld eines Wertes ein ähnlicher Wert kommt, daß also z.B. neben einem schwarzen Punkt wieder ein schwarzer kommt. Dieser Wert müsste beim serifenlosen Schriften niedriger sein als bei Schriften mit Serifen. Weitere Kriterien fallen mir nicht ein, aber bei Durchsicht Deiner 400.000 Fonts wirst Du sicher ein paar weitere finden. Schon mit 3 wirksamen (läßt sich durch eine Durchsicht der Werte kontrollieren) Kriterien, die je 4 Unterscheidungen erlauben, wäre statistisch eine Reduzierung der zu untersuchenden Schriften auf ein 4^3-tel, also 1/64 der Gesamtmenge möglich. Bei 4 Kriterien mit 6 Unterscheidungen sogar auf 1/1296 -> 300 statt 400.000 Oder nicht? (-: Bye -- 1 Bodo Kaelberer 123 http://www.webkind.de/ http://www.kaelberer-aio.de/ 3 Seelig sind die, die da arm an Geist sind, denn sie werden 4 sich Christlich Soziale Union nennen.
Hallo Liste, der Ansatz von Bodo hat mich auf eine Idee gebracht. Es gibt in der Mustererkennung viele (>50) solcher Klassifikationskriterien, teils auch sehr mathematik-lastige (Schwarzanteil, Verteilung, ...). Die Grundlage ist fast immer die gleiche - von einem auf schwarz-weiß normierten Bild werden die Klassifikationskriterien berechnet und dann von jedem Kriterium einzeln der Abstand von einer Refernz (anderen Schrift) bestimmt. Diese Abstände können dann noch (gewichtet) Addiert werden und man hat eine Zahl, die die Ähnlichkeit einer Schrift mit der anderen beschreibt. Es ist sogar sinnvoller, die Kriterien in der Datenbank zu speichern als nur den Schwarzanteil der Teilbilder. Vielleicht findest Du in veröffentlichten Mustererkennungs-Skripten von Uni's oder FH's etwas darüber. Gruß Christian Am Samstag, 25. Dezember 2004 23:38 schrieb Bodo Kaelberer:
Dazu könnte man ein paar Kriterien erarbeiten, deren Ergebnis sich je in einer kleinen Zahl ausdrücken läßt. Was mir einfällt:
A: Der summierte Schwarzanteil in allen 64 Werten. Mit einem solchen Wert lassen sich dicke Fonts von eher zarten trennen.
B: Die Wahrscheinlichkeit, dass im Umfeld eines Wertes ein ähnlicher Wert kommt, daß also z.B. neben einem schwarzen Punkt wieder ein schwarzer kommt. Dieser Wert müsste beim serifenlosen Schriften niedriger sein als bei Schriften mit Serifen.
Weitere Kriterien fallen mir nicht ein, aber bei Durchsicht Deiner 400.000 Fonts wirst Du sicher ein paar weitere finden.
der Ansatz von Bodo hat mich auf eine Idee gebracht. Es gibt in der Mustererkennung viele (>50) solcher Klassifikationskriterien, teils auch sehr mathematik-lastige (Schwarzanteil, Verteilung, ...). Die Grundlage ist fast immer die gleiche - von einem auf schwarz-weiß normierten Bild werden die Klassifikationskriterien berechnet und dann von jedem Kriterium einzeln der Abstand von einer Refernz (anderen Schrift) bestimmt.
Und die Referenz ist für alle Vergleiche dieselbe? Man bestimmt dann für die zu erkennende Schrift den Ähnlichkeitswert zur Referenz- schrift, holt aus der Tabelle die Schriften, die einen ähnlichen Wert haben und führt für diese einen detailierten Vergleich durch. Super (-: -- 1 Bodo Kaelberer 123 http://www.webkind.de/ http://www.kaelberer-aio.de/ 3 Seelig sind die, die da arm an Geist sind, denn sie werden 4 sich Christlich Soziale Union nennen.
Moin, Am Sonntag, den 26.12.2004, 11:34 +0100 schrieb Christian Mang:
Hallo Liste,
der Ansatz von Bodo hat mich auf eine Idee gebracht. Es gibt in der Mustererkennung viele (>50) solcher Klassifikationskriterien, teils auch sehr mathematik-lastige (Schwarzanteil, Verteilung, ...). Die Grundlage ist fast immer die gleiche - von einem auf schwarz-weiß normierten Bild werden die Klassifikationskriterien berechnet und dann von jedem Kriterium einzeln der Abstand von einer Refernz (anderen Schrift) bestimmt. Diese Abstände können dann noch (gewichtet) Addiert werden und man hat eine Zahl, die die Ähnlichkeit einer Schrift mit der anderen beschreibt. Es ist sogar sinnvoller, die Kriterien in der Datenbank zu speichern als nur den Schwarzanteil der Teilbilder.
Das bedeutet, statt 64 Zahlen, die in unterschiedlichen Bildbereichen die selbe Operation durchführen, nimmt man einfach deutlich weniger Methoden, die aber alle etwas völlig unterschiedliches berechnen... Also, sagenwirmal zum Beispiel folgende Zahlen: - Die Anzahl der schwarzen Pixel - Das Verhältnis der schwarzen Pixel in der oberen Hälfte zur unteren - Wie oft wechselt eine Diagonale die Pixelfarbe? - Die Farbe des Pixel exakt in der Mitte - Die vorrangige Farbe im Quadraten rechts unten - Die Länge der längsten horizontalen schwarze Linie Jede dieser Eigenschaften ergibt keine komplexen Fingerprint, sondern eine simple Zahl. Da der Scan kein 100%iges Abbild ist, liegen einige dieser Zahlen daneben, aber viele werden stimmen. Mit einer MySQL-Funktion (Wahrscheinlich irgendwas mit ORDER und Absolutwerten von Soll minus Ist) könnte ich die nächsten Treffer herausfinden. Mit denen geht's dann gleich in die grafische Vergleichsfunktion. Subba! Gibt es da vielleicht zum Googeln einen schönen Fachbegriff? "Mustererkennung" ist etwas schwammig... Übrigens, wen es interessiert: Es gibt sowas schon im Web, kommerziell, arbeitet mit Worten statt einem Einzelbuchstaben und ist sehr schnell: http://www.myfonts.com/WhatTheFont/ Technisch gesehen das gleiche. Inhaltlich indizieren die natürlich nur Löhn-Fonts, und man bekommt nicht den Font, sondern einen Kauflink. Ich will natürlich nur die lokalen Fonts indizieren, denn was nützt einem sonst die Fundstelle, wenn sie bloß ein Preisettiket zeigt statt einer Fontdatei. :-) Gruß und DANKE! Ratti -- -o) fontlinge | Fontmanagement for Linux | Schriftenverwaltung in Linux /\\ http://freshmeat.net/projects/fontlinge/ _\_V http://www.gesindel.de https://sourceforge.net/projects/fontlinge/
Am Sonntag, 26. Dezember 2004 15:33 schrieb Joerg Rossdeutscher:
Also, sagenwirmal zum Beispiel folgende Zahlen:
- Die Anzahl der schwarzen Pixel - Das Verhältnis der schwarzen Pixel in der oberen Hälfte zur unteren - Wie oft wechselt eine Diagonale die Pixelfarbe? - Die Farbe des Pixel exakt in der Mitte - Die vorrangige Farbe im Quadraten rechts unten - Die Länge der längsten horizontalen schwarze Linie Ja, so ähnlich funktioniert das.
Gibt es da vielleicht zum Googeln einen schönen Fachbegriff? "Mustererkennung" ist etwas schwammig... Mustererkennung ist nur der Oberbegriff. Vielleicht findest Du bei einer Uni oder FH ein veröffentlichtes Skript, das kann sicher weiterhelfen. Die FH München hat einen Lehrstuhl für Mustererkennung und künstliche Intelligenz, was aber davon im Internet steht, weiß ich nicht.
"Next neighborhood" Klassifikator: Um aus vorgegebenen Kriterien die Zugehörigkeit zur ähnlichen Gruppe (Schriftarten) zu bestimmen Die Kriterien betreffen Texturanalyse, Texturen, Texturklassifikation Gruß Christian
participants (5)
-
Alexander Veit
-
Bodo Kaelberer
-
Christian Mang
-
Joerg Rossdeutscher
-
Kai Hauser