Pour un projet universitaire, je dois reconnaître les caractères d'une plaque d'immatriculation. Je dois le faire en utilisant python 3. Je ne suis pas autorisé à utiliser les fonctions OCR ou à utiliser des fonctions qui utilisent le deep learning ou les réseaux neuronaux. J'ai atteint le point où je suis capable de segmenter les caractères d'une plaque d'immatriculation et de les transformer en un format uniforme. Quelques exemples de caractères segmentés sont ici. Caractères segmentés

Le format des caractères segmentés est très dépendant de l'entrée. Cependant, je peux facilement convertir cela en dimensions uniformes en utilisant opencv. De plus, j'ai un ensemble de caractères et de nombres modèles que je peux utiliser pour prédire de quel caractère / nombre il s'agit.

Same Size Numbers

Same Size Letters

J'ai donc besoin d'une métrique pour exprimer la similitude entre le caractère segmenté et l'image de référence. De cette manière, je peux dire que l'image de référence avec le score de similarité le plus élevé correspond au caractère segmenté. J'ai essayé les méthodes suivantes pour calculer la similitude.

Pour ces opérations, je me suis assuré que les caractères de référence et les caractères segmentés ont les mêmes dimensions.

  • Un opérateur XOR bit à bit
  • Inverser les caractères de référence et les comparer pixel par pixel. Si un pixel correspond, augmentez le score de similarité, si un pixel ne correspond pas, décrémentez le score de similarité.
  • hash à la fois le caractère segmenté et le caractère de référence en utilisant 'imagehash'. Par conséquent, comparez les hachages et voyez lesquels sont les plus similaires.

Aucune de ces méthodes ne parvient à me donner une prédiction précise pour tous les personnages. La plupart des personnages sont généralement correctement prédits. Cependant, le programme confond les caractères comme 8-B, D-0, 7-Z, P-R de manière cohérente.

Quelqu'un a-t-il une idée de la façon de prédire les caractères segmentés? C'est à dire. définir un meilleur score de similarité.

Edit: Malheureusement, cv2.matchTemplate et cv2.matchShapes ne sont pas autorisés pour cette affectation ...

0
codefreak287 28 févr. 2021 à 23:55

1 réponse

Meilleure réponse

La procédure générale de comparaison de deux images consiste en l'extraction des caractéristiques des deux images et leur comparaison ultérieure. Ce que vous faites réellement dans les deux premières méthodes consiste à considérer la valeur de chaque pixel comme une caractéristique. La mesure de similarité est donc un calcul de distance sur un espace de très grande dimension. Ces méthodes sont cependant sujettes au bruit et cela nécessite de très gros ensembles de données afin de ne pas obtenir des résultats acceptables.

Pour cette raison, on essaie généralement de réduire la dimensionnalité de l'espace. Je ne connais pas la troisième méthode, mais elle semble aller dans ce sens.

Un moyen de réduire la dimensionnalité de l'espace consiste à définir des fonctionnalités personnalisées significatives pour le problème auquel vous êtes confronté.

Une possibilité pour le problème de classification des caractères pourrait être de définir des caractéristiques qui mesurent la réponse de l'image d'entrée sur des sous-formes stratégiques des caractères (une ligne horizontale supérieure, une ligne inférieure, un cercle dans la partie supérieure de l'image, une ligne diagonale, etc.). Vous pouvez définir un ensemble minimal de formes qui, combinées entre elles, peuvent générer chaque caractère. Ensuite, vous devez récupérer une caractéristique pour chaque forme, en mesurant la réponse ( c'est-à-dire , en intégrant le signal de l'image d'entrée à l'intérieur de la forme) de l'image d'origine sur cette forme particulière. Enfin, vous devez déterminer la classe à laquelle appartient l'image en prenant le point de référence le plus proche dans cet espace, plus petit, des entités.

0
simonet 1 mars 2021 à 17:03