J'ai écrit un petit script en python où j'essaie d'extraire ou de recadrer la partie de la carte à jouer qui représente uniquement l'illustration, en supprimant tout le reste. J'ai essayé différentes méthodes de seuillage mais je n'ai pas pu y arriver. Notez également que je ne peux pas simplement enregistrer manuellement la position de l'illustration car elle n'est pas toujours dans la même position ou taille, mais toujours dans une forme rectangulaire où tout le reste n'est que du texte et des bordures.
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()
La sortie actuelle est la chose la plus proche que j'ai pu obtenir. Je pourrais être sur la bonne voie et essayer d'autres disputes pour dessiner un rectangle autour des parties blanches, mais je ne pense pas que ce soit une méthode durable:
Comme dernière note, voir les cartes ci-dessous, tous les cadres n'ont pas exactement les mêmes tailles ou positions, mais il y a toujours une œuvre d'art avec uniquement du texte et des bordures autour. Il n'a pas besoin d'être coupé avec une précision extrême, mais il est clair que l'art est une "région" de la carte, entourée d'autres régions contenant du texte. Mon objectif est d'essayer de capturer la région de l'œuvre d'art du mieux que je peux.
la source
Réponses:
J'ai utilisé la transformation de ligne de Hough pour détecter des parties linéaires de l'image. Les croisements de toutes les lignes ont été utilisés pour construire tous les rectangles possibles, qui ne contiennent pas d'autres points de croisement. Étant donné que la partie de la carte que vous recherchez est toujours la plus grande de ces rectangles (au moins dans les échantillons que vous avez fournis), j'ai simplement choisi la plus grande de ces rectangles comme gagnante. Le script fonctionne sans interaction de l'utilisateur.
Voici les résultats avec les échantillons que vous avez fournis:
Le code pour trouver les croisements de lignes peut être trouvé ici: trouver le point d'intersection de deux lignes tracées à l'aide de lignes de repère opencv
Vous pouvez en savoir plus sur Hough Lines ici .
la source
Nous savons que les cartes ont des limites droites le long des axes x et y. Nous pouvons l'utiliser pour extraire des parties de l'image. Le code suivant implémente la détection des lignes horizontales et verticales dans l'image.
Il vous suffit de cliquer sur deux zones à inclure. Un exemple de zone de clic et le résultat correspondant sont les suivants:
Résultats d'autres images:
la source
Je ne pense pas qu'il soit possible de recadrer automatiquement le ROI de l'illustration en utilisant des techniques de traitement d'image traditionnelles en raison de la nature dynamique des couleurs, des dimensions, des emplacements et des textures de chaque carte. Vous devrez vous pencher sur la machine / l'apprentissage en profondeur et former votre propre classificateur si vous voulez le faire automatiquement. Au lieu de cela, voici une approche manuelle pour sélectionner et recadrer un retour sur investissement statique à partir d'une image.
L'idée est d'utiliser
cv2.setMouseCallback()
et des gestionnaires d'événements pour détecter si la souris a été cliquée ou relâchée. Pour cette implémentation, vous pouvez extraire le ROI de l'illustration en maintenant le bouton gauche de la souris enfoncé et en faisant glisser pour sélectionner le ROI souhaité. Une fois que vous avez sélectionné le retour sur investissement souhaité, appuyez surc
pour recadrer et enregistrer le retour sur investissement. Vous pouvez réinitialiser le retour sur investissement en utilisant le bouton droit de la souris.Retour sur investissement des illustrations enregistrées
Code
la source