[PYTHON] J'ai essayé de faire un programme pour résoudre (indice) la recherche d'erreur de Saiseriya

Bonjour. Ceci est le premier message. Attendre environ 20 minutes quand je suis allé à Saiseriya l'autre jour Quelques personnes ont cherché les erreurs de Saiseriya et n'ont pas pu la trouver ... (trop ...) Donc, j'ai pensé que cela pouvait être résolu par le traitement d'image, alors j'ai essayé. C'était aussi une bonne étude pour OpenCV.

Chose que tu veux faire

Données d'image officiellement publiées par Saiseriya à l'aide de la bibliothèque OpenCV (https://www.saizeriya.co.jp/entertainment/) Je souhaite traiter et automatiser la recherche d'erreurs! !! !! Ce que vous faites réellement, c'est

C'est comme ça. J'ai donné le code à GitHub.

Environnement d'exécution

macOS Mojave 10.14.4 Python 3.6.7 OpenCV 3.4.1

Traiter l'image

Lorsque vous le téléchargez, vous remarquerez que "les images à comparer sont collées ensemble" + "il y a une marge mystérieuse". diff2.png

Tout d'abord, je voudrais supprimer les marges. Le flux de suppression des blancs est --Faire une image en échelle de gris ―― Binariser

[https://qiita.com/trami/items/e25eb70a59a51ae4f7ba# Comment supprimer les marges](https://qiita.com/trami/items/e25eb70a59a51ae4f7ba#%E3%81%A9%E3%81 % AE% E3% 82% 88% E3% 81% 86% E3% 81% AB% E3% 81% 97% E3% 81% A6% E4% BD% 99% E7% 99% BD% E5% 89% 8A Nous renvoyons à l'article% E9% 99% A4% E3% 82% 92% E8% A1% 8C% E3% 81% 86% E3% 81% AE% E3% 81% 8B).

La fonction de niveaux de gris dans OpenCV

gray.py


gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #Échelle de gris

La fonction de binarisation

binary.py


r, binary = cv2.threshold(gray, 0, 255,cv2.THRESH_OTSU)  #Binarisation

La fonction de recadrage d'image

cut_img.py


img = img[y1:y2,x1:x2] #(x1,y1)De(x2,y2)Coupé

C'est comme ça. Si vous les combinez, le code jusqu'à présent sera

saizeriya.py


import cv2
import numpy as np

img = cv2.imread('diff.png') #Chargement des images
height, width, d = img.shape #Hauteur largeur profondeur
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #Échelle de gris
r, binary = cv2.threshold(gray, 0, 255,cv2.THRESH_OTSU)  #Binar au seuil 200
contours = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[0]

#Extraire les contours, supprimer les marges
x1 = [] #Valeur minimale de la coordonnée x
y1 = [] #Valeur minimale de la coordonnée y
x2 = [] #Valeur maximale de la coordonnée x
y2 = [] #Valeur maximale de la coordonnée y
for i in range(1, len(contours)):
    ret = cv2.boundingRect(contours[i])
    x1.append(ret[0])
    y1.append(ret[1])
    x2.append(ret[0] + ret[2])
    y2.append(ret[1] + ret[3])
x1_min = min(x1)
y1_min = min(y1)
x2_max = max(x2)
y2_max = max(y2)
img = img[0:600, x1_min:x2_max] #Coupez la marge

Le résultat de l'exécution est le suivant. Vous pouvez voir qu'il est bien coupé. スクリーンショット 2020-03-29 19.03.18.png

Puis coupez l'image en deux.

saizeriya.py


height, width,d= img.shape #Hauteur largeur profondeur(La taille de la découpe)
midle = int(width/2)

img1 = img[0:height,0:midle-3]
img2 = img[0:height,midle-8:width-11] #En fait, la largeur est un peu différente... 

Ce qui était ridicule ici, c'est que les bords nets des deux images étaient en fait légèrement différents. L'ajustement a fini par ajuster la pièce à couper manuellement.

Calculer les différences d'image

Ensuite, calculez la différence entre les images. La différence entre les images peut être calculée en soustrayant les tableaux numpy, mais lorsque vous l'exécutez réellement, la différence est difficile à comprendre (une légère différence de couleur et une légère déviation d'emplacement seront affichées comme une différence), donc cette fois OpenCV J'ai utilisé la fonction ** absdiff ** de.

La fonction ** absdiff ** peut trouver la valeur absolue de la différence entre deux images.

saizeriya.py


#Montrer la différence
result = np.copy(img1) #Tableau pour stocker l'image résultante
add = np.copy(img1) #Tableau pour stocker l'image résultante
#result = img1-img2 #Calcul de la différence
result = cv2.absdiff(img1, img2) #Calcul de la différence(absdiff)

Résultat d'exécution image.png

Pour référence, c'est le résultat lorsqu'il est exécuté en soustrayant les tableaux. image.png

Afficher les informations de différence sur l'image d'origine

Avec cela, je ne sais pas où se trouve la différence, je voudrais donc la combiner avec l'image d'origine. Combine l'image grise d'origine + l'image de différence (couleur).

La fonction à utiliser est la fonction ** add **. Utilisez également la fonction ** cvtCOLOR ** pour convertir l'image couleur d'origine.

Tableau 3D couleur → Tableau 2D gris → Tableau 3D gris

Traitez avec.

saizeriya.py


img3 = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY) #Échelle de gris
img3 = cv2.cvtColor(img3,cv2.COLOR_GRAY2BGR) #Créer une image couleur avec une échelle de gris
print(img3.shape)
print(result.shape)
add = cv2.add(img3,result) #Combiner des images

#Affichage de l'image
cv2.imshow('all',img)
cv2.imshow('image',add)
cv2.imshow('result',result)
cv2.waitKey(0) #Attendez jusqu'à ce qu'une touche soit enfoncée
cv2.destroyAllWindows() #Détruire toutes les fenêtres

Résultat d'exécution image.png

Vous pouvez maintenant voir ce qui est différent.

Je ne trouve que 8! !! !! !!

Veuillez m'en dire deux de plus ...

C'était juste un outil auxiliaire.

J'ai trouvé 9 erreurs en décembre

image.png

Recommended Posts

J'ai essayé de faire un programme pour résoudre (indice) la recherche d'erreur de Saiseriya
J'ai créé un programme qui résout la recherche d'erreur en quelques secondes
J'ai fait un programme pour vérifier la taille d'un fichier avec Python
J'ai fait une commande pour marquer le clip de la table
J'ai créé un programme pour rechercher des mots sur la fenêtre (développement précédent)
Écrivez un programme pour résoudre le Rubik Cube 4x4x4! 1. Vue d'ensemble
J'ai fait une fonction pour vérifier le modèle de DCGAN
Écrivez un programme pour résoudre le Rubik Cube 4x4x4! 2. Algorithme
Écrivez un programme pour résoudre le Rubik Cube 4x4x4! 3. Mise en œuvre
Je voulais résoudre le problème ABC164 A ~ D avec Python
J'ai fait une commande pour afficher un calendrier coloré dans le terminal
J'ai fait un programme qui calcule automatiquement le zodiaque avec tkinter
J'ai fait un programme de gestion de la paie en Python!
J'ai fait un script pour afficher des pictogrammes
Écrivons un programme pour résoudre le Rubik Cube (Partie 2: IDA * Search)
[Django] a créé un champ pour saisir des dates avec des nombres à 4 chiffres
J'ai fait une minuterie de cuisine à afficher sur la barre d'état!
J'ai créé un programme pour vous avertir par LINE lorsque les commutateurs arrivent
J'ai créé un programme pour saisir ce que j'ai mangé et afficher les calories et les sucres
J'ai créé un konoha de bibliothèque qui fait passer le tokenizer à une belle sensation
J'ai créé une fonction pour voir le mouvement d'un tableau à deux dimensions (Python)
J'ai créé un outil pour compiler nativement Hy
J'ai créé un outil pour obtenir de nouveaux articles
J'ai créé un programme cryptographique César en Python.
J'ai fait un outil pour estimer le temps d'exécution de cron (+ débuts de PyPI)
[LINE Messaging API] Je souhaite envoyer un message du programme à tout le monde LINE
J'ai créé une commande appdo pour exécuter des commandes dans le contexte de l'application
J'ai créé un outil pour générer du Markdown à partir du fichier JSON Scrapbox exporté
J'ai créé un outil pour sauvegarder automatiquement les métadonnées de l'organisation Salesforce
J'ai fait un script pour enregistrer la fenêtre active en utilisant win32gui de Python
〇✕ J'ai fait un jeu
J'ai fait une bibliothèque pour bien séparer les phrases japonaises
J'ai créé un programme pour convertir des images en art ASCII avec Python et OpenCV
[Python] J'ai créé un système pour introduire "la recette que je veux vraiment" depuis le site de recettes!
J'ai essayé de résoudre Soma Cube avec python
J'ai fait un script pour mettre un extrait dans README.md
J'ai créé un module Python pour traduire les commentaires
J'ai créé un code pour convertir illustration2vec en modèle Keras
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai créé une bibliothèque python qui fait rouler le rang
J'ai fait une commande pour attendre que Django démarre jusqu'à ce que la base de données soit prête
J'ai créé un programme en Python qui change les données de 1 minute de FX en une heure arbitraire (1 heure, etc.)
Je suis toujours impatient lorsque je commande un café, j'ai donc créé une application React pour le résoudre
J'ai créé un outil pour obtenir les liens de réponse d'OpenAI Gym en même temps
J'ai créé une classe pour obtenir le résultat de l'analyse par MeCab dans ndarray avec python
J'ai créé une fonction pour découper l'image de python openCV, alors veuillez l'utiliser.
J'ai créé un outil pour générer automatiquement un simple diagramme ER à partir de l'instruction CREATE TABLE
Je voulais résoudre le concours de programmation Panasonic 2020 avec Python
J'ai essayé de faire un classement en grattant l'équipe des membres de l'organisation
J'ai créé un package pour filtrer les séries chronologiques avec python
J'ai écrit rapidement un programme pour étudier la DI avec Python ①
J'ai fait une boîte pour me reposer avant que Pepper ne se fatigue
Ecrire un programme python pour trouver la distance d'édition [python] [distance Levenshtein]
J'ai fait une commande pour générer un commentaire pour une table dans Django
J'ai créé un outil pour créer un nuage de mots à partir de wikipedia