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.
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.
macOS Mojave 10.14.4 Python 3.6.7 OpenCV 3.4.1
Lorsque vous le téléchargez, vous remarquerez que "les images à comparer sont collées ensemble" + "il y a une marge mystérieuse".
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é.
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.
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
Pour référence, c'est le résultat lorsqu'il est exécuté en soustrayant les tableaux.
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.
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
Vous pouvez maintenant voir ce qui est différent.
Veuillez m'en dire deux de plus ...
C'était juste un outil auxiliaire.