[PYTHON] Lisez l'image du jeu de puzzle et sortez la séquence de chaque bloc

Objectif

Par exemple, je veux lire l'image ci-dessous et déterminer la disposition de chaque bloc. Pazudora01.png

problème

J'ai essayé d'obtenir la valeur par Template Matching en utilisant OpenCV, mais il faut du temps pour faire correspondre chaque image, et toutes les images avec une forte corrélation dans le seuil sont sorties, alors sélectionnez-les. Le coût était élevé car je devais écrire un programme.

politique

En utilisant les données RVB de la bibliothèque PIL, les données RVB de l'image découpée pour chaque bloc sont corrélées et reconnues comme la couleur la plus proche de la valeur de référence.

la mise en oeuvre

Utilisez l'objet Image PIL.

import numpy
from PIL import Image

def get_rgb(pic, box=""):
    if box == "":
        box = (0, 0, pic.width, pic.height)
    rgbimg = pic.crop(box).convert("RGB")
    rgb = np.array(rgbimg.getdata())
    return [__round(rgb[:,0]),
            __round(rgb[:,1]),
            __round(rgb[:,2])]

def color(array):
    col = {}
    col["red"] = [100, 20, 20] #adapté
    #Pendant ce temps, intégrez la valeur standard de la couleur
    col["heart"] = [100, 70, 70] #adapté
    
    max = 0
    result = ""
    for k, c in col.items:
       tmp = numpy.corrcoef(numpy.array(array), numpy.array(c))[0][1]
       if max < tmp:
           result = k
           max = tmp
    return result

def __round(array):
    return int(round(np.average(array)))

if __name__ == "__main__":
    '''
        xa :point de départ, xs :Largeur de bloc, xb :point final
     ya :point de départ, ys :Hauteur de bloc, yb :point final
    '''
    pic = Image.open("/path/to/Image.png ", 'r')
    for i in xrange(6):
        for j in xrange(5):
           box = (xa + xs*i,
                  ya + ys*j,
                  xb + xs*i,
                  yb + ys*j)
           rgb = get_rgb(pic, box)
           print color(rgb)

Dans ce cas, il n'y a pas de problème particulier en termes de vitesse, et le taux de détection est également raisonnable, parfois il baisse comme une division zéro.

Conclusion

Pazudora est-il intéressant? Je ne l'ai jamais fait.

Recommended Posts

Lisez l'image du jeu de puzzle et sortez la séquence de chaque bloc
Lisez l'image du graphique avec OpenCV et obtenez les coordonnées du point final du graphique
Lire la sortie du sous-processus, ouvrir en temps réel
J'ai lu et implémenté les variantes de UKR
Coordination de chaque processus dans MPI et mise en mémoire tampon de la sortie standard
Filtrer la sortie de tracemalloc
[EC2] Comment installer Chrome et le contenu de chaque commande
Lire la sortie standard d'un sous-processus ligne par ligne en Python
L'histoire de Python et l'histoire de NaN
[Python] La pierre d'achoppement de l'importation
Exécutez Pylint et lisez les résultats
Demandez à python de lire la sortie de la commande
Jugez l'extension et téléchargez l'image
[Reconnaissance d'image] Comment lire le résultat de l'annotation automatique avec VoTT
Retrouvez les termes généraux de la séquence de Tribonacci en algèbre linéaire et Python
A propos des principales tâches de traitement d'image (vision par ordinateur) et de l'architecture utilisée