Bibliothek zur Erkennung farbiger Bereiche eines Bildes

Ich möchte eine App codieren, um eine Imagemap zu generieren .

Es scannt ein Bild und erklärt zusammenhängende Bereiche derselben Farbe als Teile desselben Imagemap-Bereichs.

Ich kann mir vorstellen zu sagen, dass Schwarz für Kanten verwendet wird, um Bereiche abzugrenzen, und Marine für Text verwendet wird, also sollte es ignoriert werden. Stellen Sie sich eine Karte der USA vor, auf der die Staaten schwarz umrandet sind, die Namen der Staaten in Marineblau und die Staaten weder in Schwarz noch in Marineblau koloriert sind.

Kennen Sie eine Bibliothek, die Ihnen dabei helfen würde? Ich bevorzuge C/C++ oder Python oder Delphi, akzeptiere aber jede Sprache, nur um zu sehen, wie es gemacht wird

Antworten (2)

Vielleicht, wenn wir auf Ihre vorherige Frage zurückkommen : Sie haben einen farbigen Grundriss, den Sie in eine Bildkarte umgewandelt haben, und Sie möchten jetzt herausfinden, in welchem ​​​​Raum sich der Cursor befindet. Warum nicht, anstatt sich mit der Zwischenbildkarte herumzuärgern einfach Javascript verwenden, um jederzeit die Farbe des Pixels unter dem Cursor zu bestimmen? Sie würden diesen RGB-Wert dann in einer Liste von Raumfarben nachschlagen.

Da Sie die Farben des Grundrisses wählen, können Sie für jeden Raum eine andere Farbe garantieren. Bei Bedarf können Räume mit der gleichen scheinbaren Farbe geringfügige RGB-Unterschiede aufweisen, die kaum sichtbar sind. Wenn das Pixel unter dem Cursor schwarzer Text ist, können Sie es mit ein paar Pixeln auf beiden Seiten versuchen.

Eine ausgezeichnete Idee! ABER ich möchte, dass Kunden den Grundriss zeichnen, was es schwierig macht, die Farbauswahl einzuschränken. Ich kann jedoch - wie Sie sagen - "leichte RGB-Unterschiede" prüfen und solche ablehnen, wenn Sie das Bild zum ersten Mal analysieren.
Ich bin sehr von dieser Lösung versucht, da sie sehr einfach erscheint. Ich bin mir jedoch nicht sicher, wie gut es bei vielen Räumen funktionieren wird – denken Sie an ein großes Einkaufszentrum, eine Fabrik, ein Hotel oder ein Bürogebäude. Ich denke, dass der Unterschied für das menschliche Auge sichtbar sein könnte.
Sie können 2 Bilder verwenden, eines, das Sie dem Benutzer präsentieren, und ein zweites, in dem Sie die Farbsuche durchführen. (Sie benötigen in jedem Fall eine separate Leinwand in Javascript). Sie könnten dieses zweite Bild manuell verarbeiten, indem Sie jeden Bereich mit einer einzigartigen Farbe füllen und gleichzeitig die Zuordnung der Farbe zur Bereichsidentifikation erstellen.
Du meinst, ich habe ein zweites Bild, zeige es aber nicht an? Wenn der Benutzer dann auf das angezeigte Bild bei X, Y klickt, kann ich context.getImageData(X,Y, ...)das zweite Bild aufrufen?
Ja. Vielleicht könnten Sie Ihre Kunden dazu bringen, mit dem zweiten Bild als Basis zu beginnen und dann ihre Anmerkungen und "schöneren" Farben hinzuzufügen, um das erste Bild zu erstellen.

Wenn Sie nur einfache Rechtecke statt komplexer Polygone in Ihrer Imagemap akzeptieren möchten, besteht ein möglicher Untersuchungsweg darin, ImageMagick zu verwenden, um die Größe und Position eines farbigen Bereichs zu bestimmen. Wenn Sie beispielsweise das Bild in Ihrer vorherigen Frage verwenden und die Farbe des linken Raums als Hex-RGB-Wert auswählen e97978, können Sie ausführen

convert https://i.stack.imgur.com/fp5Ff.jpg -fill white +opaque '#e97978'  /tmp/out.png

um nur diesen Raum auf weißem Hintergrund einzufärben:Zimmer

Wenn Sie die -trimOption am Ende hinzufügen, erhalten Sie das zugeschnittene Bild:

getrimmter Raum

Dies ist der Begrenzungsrahmen des Raums, aber wenn Sie identifydas resultierende Bild verwenden, haben Sie nicht nur die Größe dieses Rahmens (196 x 179), sondern auch seine Position oben links (+111 + 53) im ursprünglichen größeren Bild:

$ identify /tmp/out.png
/tmp/out.png PNG 196x179 900x291+111+53  ...

Wenn Sie also jeden Raum anders einfärben können und vorzugsweise kein verlustbehaftetes JPG verwenden, das die Farben dithert, sind Sie einem automatisierten Algorithmus möglicherweise näher.

Ich mag diese 9 und stimme ihr zu), aber es muss Polygonunterstützung geben :-(
Canny Edge Detection sieht auch sehr interessant aus