Ich habe ein kleines Skript in Python geschrieben, in dem ich versuche, den Teil der Spielkarte zu extrahieren oder zuzuschneiden, der nur das Bildmaterial darstellt, und den Rest zu entfernen. Ich habe verschiedene Methoden des Schwellenwerts ausprobiert, konnte aber nicht dorthin gelangen. Beachten Sie auch, dass ich die Position des Bildmaterials nicht einfach manuell aufzeichnen kann, da es sich nicht immer an derselben Position oder Größe befindet, sondern immer in einer rechteckigen Form, bei der alles andere nur aus Text und Rahmen besteht.
from matplotlib import pyplot as plt
import cv2
img = cv2.imread(filename)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,binary = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY)
binary = cv2.bitwise_not(binary)
kernel = np.ones((15, 15), np.uint8)
closing = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)
plt.imshow(closing),plt.show()
Die aktuelle Ausgabe ist die nächste, die ich bekommen könnte. Ich könnte auf dem richtigen Weg sein und weiter streiten, um ein Rechteck um die weißen Teile zu zeichnen, aber ich denke nicht, dass dies eine nachhaltige Methode ist:
Als letzte Anmerkung siehe die Karten unten, nicht alle Rahmen haben genau die gleiche Größe oder Position, aber es gibt immer ein Kunstwerk mit nur Text und Rändern. Es muss nicht sehr präzise geschnitten sein, aber die Kunst ist eindeutig eine "Region" der Karte, umgeben von anderen Regionen, die Text enthalten. Mein Ziel ist es, die Region des Kunstwerks so gut wie möglich zu erfassen.
quelle
Antworten:
Ich habe die Hough-Linientransformation verwendet, um lineare Teile des Bildes zu erkennen. Die Kreuzungen aller Linien wurden verwendet, um alle möglichen Rechtecke zu konstruieren, die keine anderen Kreuzungspunkte enthalten. Da der Teil der Karte, den Sie suchen, immer das größte dieser Rechtecke ist (zumindest in den von Ihnen bereitgestellten Beispielen), habe ich einfach das größte dieser Rechtecke als Gewinner ausgewählt. Das Skript funktioniert ohne Benutzerinteraktion.
Dies sind die Ergebnisse mit den von Ihnen bereitgestellten Beispielen:
Den Code zum Auffinden von Linienkreuzungen finden Sie hier: Finden Sie den Schnittpunkt zweier Linien, die mit houghlines opencv gezeichnet wurden
Weitere Informationen zu Hough Lines finden Sie hier .
quelle
Wir wissen, dass Karten entlang der x- und y-Achse gerade Grenzen haben. Wir können dies verwenden, um Teile des Bildes zu extrahieren. Der folgende Code implementiert das Erkennen horizontaler und vertikaler Linien im Bild.
Sie müssen nur auf zwei Bereiche klicken, um sie einzuschließen. Ein Beispiel für einen Klickbereich und das entsprechende Ergebnis lauten wie folgt:
Ergebnisse aus anderen Bildern:
quelle
Ich denke nicht, dass es möglich ist, den ROI des Bildmaterials mithilfe traditioneller Bildverarbeitungstechniken automatisch zuzuschneiden, da die Farben, Abmessungen, Positionen und Texturen für jede Karte dynamisch sind. Sie müssten sich mit maschinellem / tiefem Lernen befassen und Ihren eigenen Klassifikator trainieren, wenn Sie dies automatisch tun möchten. Stattdessen finden Sie hier einen manuellen Ansatz zum Auswählen und Zuschneiden eines statischen ROI aus einem Bild.
Die Idee ist, mithilfe von
cv2.setMouseCallback()
Ereignishandlern zu erkennen, ob die Maus angeklickt oder losgelassen wurde. Für diese Implementierung können Sie den ROI des Bildmaterials extrahieren, indem Sie die linke Maustaste gedrückt halten und ziehen, um den gewünschten ROI auszuwählen. Wenn Sie den gewünschten ROI ausgewählt haben, drücken Siec
, um den ROI zuzuschneiden und zu speichern. Sie können den ROI mit der rechten Maustaste zurücksetzen.Gespeicherte Grafik-ROIs
Code
quelle