[PYTHON] Ich habe versucht, ein Programm zu erstellen, um die Fehlersuche von Saiseriya zu lösen (Hinweis)

Hallo. Dies ist der erste Beitrag. Ich habe ungefähr 20 Minuten gewartet, als ich neulich nach Saiseriya ging. Ein paar Leute haben nach Saiseriyas Fehlern gesucht und konnten sie nicht finden ... (zu viel ...) Also dachte ich, dass es durch Bildverarbeitung gelöst werden könnte, also habe ich es versucht. Es war auch eine gute Studie für OpenCV.

Was du machen willst

Von Saiseriya offiziell veröffentlichte Bilddaten unter Verwendung der OpenCV-Bibliothek (https://www.saizeriya.co.jp/entertainment/) Ich möchte die Suche nach Fehlern verarbeiten und automatisieren! !! !! Was Sie tatsächlich tun, ist

Es ist wie es ist. Ich habe den Code an [GitHub] weitergegeben (https://github.com/kurikinton105/SaizeriyaDifference).

Ausführungsumgebung

macOS Mojave 10.14.4 Python 3.6.7 OpenCV 3.4.1

Verarbeiten Sie das Bild

Wenn Sie es herunterladen, werden Sie feststellen, dass "die zu vergleichenden Bilder zusammenkleben" + "es gibt einen mysteriösen Rand". diff2.png

Zunächst möchte ich die Ränder löschen. Der Fluss des Löschens von Leerzeichen ist

[https://qiita.com/trami/items/e25eb70a59a51ae4f7ba# Entfernen von Rändern](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 Wir verweisen auf den Artikel% E9% 99% A4% E3% 82% 92% E8% A1% 8C% E3% 81% 86% E3% 81% AE% E3% 81% 8B).

Die Graustufenfunktion in OpenCV

gray.py


gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #Graustufen

Die Binärisierungsfunktion

binary.py


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

Die Funktion zum Zuschneiden von Bildern

cut_img.py


img = img[y1:y2,x1:x2] #(x1,y1)Von(x2,y2)Ausgeschnitten

Es ist wie es ist. Wenn Sie diese kombinieren, lautet der bisherige Code

saizeriya.py


import cv2
import numpy as np

img = cv2.imread('diff.png') #Bilder laden
height, width, d = img.shape #Höhe Breite Tiefe
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #Graustufen
r, binary = cv2.threshold(gray, 0, 255,cv2.THRESH_OTSU)  #Binar bei Schwelle 200
contours = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[0]

#Konturen extrahieren, Ränder entfernen
x1 = [] #Minimalwert der x-Koordinate
y1 = [] #Minimalwert der y-Koordinate
x2 = [] #Maximalwert der x-Koordinate
y2 = [] #Maximalwert der y-Koordinate
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] #Schneiden Sie den Rand ab

Das Ausführungsergebnis ist wie folgt. Sie können sehen, dass es gut geschnitten ist. スクリーンショット 2020-03-29 19.03.18.png

Dann schneiden Sie das Bild in zwei Hälften.

saizeriya.py


height, width,d= img.shape #Höhe Breite Tiefe(Die Größe des Ausschnitts)
midle = int(width/2)

img1 = img[0:height,0:midle-3]
img2 = img[0:height,midle-8:width-11] #Eigentlich ist die Breite etwas anders... 

Was hier lächerlich war, war, dass die scharfen Kanten der beiden Bilder tatsächlich leicht unterschiedlich waren. Die Einstellung endete damit, dass das zu schneidende Teil manuell angepasst wurde.

Bildunterschiede berechnen

Berechnen Sie als nächstes die Differenz zwischen den Bildern. Der Unterschied zwischen den Bildern kann durch Subtrahieren der Numpy-Arrays berechnet werden. Wenn Sie ihn jedoch tatsächlich ausführen, ist der Unterschied schwer zu verstehen (ein geringfügiger Unterschied in der Farbe und eine geringfügige Abweichung in der Position werden als Unterschied angezeigt). Diesmal also OpenCV Ich habe die ** absdiff ** Funktion von verwendet.

Die Funktion ** absdiff ** kann den absoluten Wert der Differenz zwischen zwei Bildern ermitteln.

saizeriya.py


#Unterschied zeigen
result = np.copy(img1) #Array zum Speichern des resultierenden Bildes
add = np.copy(img1) #Array zum Speichern des resultierenden Bildes
#result = img1-img2 #Berechnung der Differenz
result = cv2.absdiff(img1, img2) #Berechnung der Differenz(absdiff)

Ausführungsergebnis image.png

Als Referenz ist es das Ergebnis, wenn es durch Subtrahieren der Arrays ausgeführt wird. image.png

Zeigen Sie Differenzinformationen zum Originalbild an

Daher weiß ich nicht, wo der Unterschied liegt, deshalb möchte ich ihn mit dem Originalbild kombinieren. Kombiniert das ursprüngliche graue Bild + Differenzbild (Farbe).

Die zu verwendende Funktion ist die Funktion ** add **. Verwenden Sie auch die Funktion ** cvtCOLOR **, um das ursprüngliche Farbbild zu konvertieren.

Farb-3D-Array → Graues 2D-Array → Graues 3D-Array

Prozess mit.

saizeriya.py


img3 = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY) #Graustufen
img3 = cv2.cvtColor(img3,cv2.COLOR_GRAY2BGR) #Machen Sie ein Farbbild mit Graustufen
print(img3.shape)
print(result.shape)
add = cv2.add(img3,result) #Bilder kombinieren

#Bildschirm
cv2.imshow('all',img)
cv2.imshow('image',add)
cv2.imshow('result',result)
cv2.waitKey(0) #Warten Sie, bis eine Taste gedrückt wird
cv2.destroyAllWindows() #Zerstöre alle Fenster

Ausführungsergebnis image.png

Jetzt können Sie sehen, was anders ist.

Ich kann nur 8 finden! !! !! !!

Bitte sag mir noch zwei ...

Es war nur ein Hilfsmittel.

Ich habe im Dezember 9 Fehler gefunden

image.png

Recommended Posts

Ich habe versucht, ein Programm zu erstellen, um die Fehlersuche von Saiseriya zu lösen (Hinweis)
Ich habe ein Programm erstellt, das die Fehlersuche in Sekunden löst
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Ich habe einen Befehl zum Markieren des Tabellenclips gegeben
Ich habe ein Programm erstellt, um Wörter im Fenster nachzuschlagen (vorherige Entwicklung)
Schreiben Sie ein Programm, um den 4x4x4 Rubik Cube zu lösen! 1. Übersicht
Ich habe eine Funktion erstellt, um das Modell von DCGAN zu überprüfen
Schreiben Sie ein Programm, um den 4x4x4 Rubik Cube zu lösen! 2. Algorithmus
Schreiben Sie ein Programm, um den 4x4x4 Rubik Cube zu lösen! 3. Implementierung
Ich wollte das ABC164 A ~ D-Problem mit Python lösen
Ich habe den Befehl gegeben, einen farbenfrohen Kalender im Terminal anzuzeigen
Ich habe ein Programm erstellt, das den Tierkreis mit tkinter automatisch berechnet
Ich habe ein Pay-Management-Programm in Python erstellt!
Ich habe ein Skript erstellt, um Piktogramme anzuzeigen
Schreiben wir ein Programm zur Lösung des Rubik-Würfels (Teil 2: IDA * -Suche)
[Django] Erstellt ein Feld zur Eingabe von Daten mit 4-stelligen Zahlen
Ich habe einen Küchentimer erstellt, der in der Statusleiste angezeigt wird!
Ich habe ein Programm erstellt, um Sie per LINE zu benachrichtigen, wenn Schalter eintreffen
Ich habe ein Programm erstellt, um einzugeben, was ich gegessen habe, und um Kalorien und Zucker anzuzeigen
Ich habe eine Bibliothek konoha gemacht, die den Tokenizer auf ein schönes Gefühl umstellt
Ich habe eine Funktion erstellt, um die Bewegung eines zweidimensionalen Arrays (Python) zu sehen.
Ich habe ein Tool erstellt, um Hy nativ zu kompilieren
Ich habe ein Tool erstellt, um neue Artikel zu erhalten
Ich habe ein Caesar-Kryptografieprogramm in Python erstellt.
Ich habe ein Tool erstellt, um die Ausführungszeit von cron zu schätzen (+ PyPI-Debüt)
[LINE Messaging API] Ich möchte eine Nachricht vom Programm an alle LINE senden
Ich habe einen Appdo-Befehl erstellt, um Befehle im Kontext der App auszuführen
Ich habe ein Tool zum Generieren von Markdown aus der exportierten Scrapbox-JSON-Datei erstellt
Ich habe ein Tool zum automatischen Sichern der Metadaten der Salesforce-Organisation erstellt
Ich habe ein Skript erstellt, das das aktive Fenster mit win32gui von Python aufzeichnet
〇✕ Ich habe ein Spiel gemacht
Ich habe eine Bibliothek erstellt, um japanische Sätze schön zu brechen
Ich habe ein Programm erstellt, um Bilder mit Python und OpenCV in ASCII-Grafik umzuwandeln
[Python] Ich habe ein System erstellt, um "das Rezept, das ich wirklich will" von der Rezeptseite einzuführen!
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe ein Skript erstellt, um ein Snippet in README.md einzufügen
Ich habe ein Python-Modul erstellt, um Kommentare zu übersetzen
Ich habe einen Code erstellt, um illustration2vec in ein Keras-Modell zu konvertieren
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe eine Python-Bibliothek erstellt, die einen rollierenden Rang hat
Ich habe einen Befehl gegeben, auf den Start von Django zu warten, bis die Datenbank bereit ist
Ich habe in Python ein Programm erstellt, das die 1-Minuten-Daten von FX auf eine beliebige Zeit (1 Stunde usw.) ändert.
Ich bin immer ungeduldig, wenn ich ein Café bestelle, also habe ich eine React-App erstellt, um es zu lösen
Ich habe ein Tool erstellt, um die Antwortlinks von OpenAI Gym auf einmal zu erhalten
Ich habe eine Klasse erstellt, um das Analyseergebnis von MeCab in ndarray mit Python zu erhalten
Ich habe eine Funktion zum Trimmen des Bildes von Python openCV erstellt. Verwenden Sie sie daher bitte.
Ich habe ein Tool erstellt, um automatisch ein einfaches ER-Diagramm aus der Anweisung CREATE TABLE zu generieren
Ich wollte den Panasonic Programming Contest 2020 mit Python lösen
Ich habe versucht, eine Rangliste zu erstellen, indem ich das Mitgliederteam der Organisation abgekratzt habe
Ich habe ein Paket erstellt, um Zeitreihen mit Python zu filtern
Ich habe schnell ein Programm geschrieben, um DI mit Python zu lernen
Ich habe eine Schachtel gemacht, um mich auszuruhen, bevor Pepper müde wird
Schreiben Sie ein Python-Programm, um die Bearbeitungsentfernung [Python] [Levenshtein-Entfernung] zu ermitteln.
Ich habe einen Befehl zum Generieren eines Kommentars für eine Tabelle in Django eingegeben
Ich habe ein Tool erstellt, um eine Wortwolke aus Wikipedia zu erstellen