Finden Sie Bildähnlichkeit mit Python + OpenCV

Hallo zusammen. @best_not_best. Meine aktuelle Aufgabe besteht darin, die Jobempfehlungsfunktion der Rekrutierungswebsite zu implementieren und die Website mithilfe von Google Analytics und Adobe Analytics zu analysieren. (Der Rest ist nur das Posten von Tierbildern im hauseigenen Slack.)

In Letzter Adventskalender wurde die Beurteilung der Bildähnlichkeit mithilfe von Deep Learning durchgeführt. Die Genauigkeit war gut, aber das Sammeln von Trainingsdaten ist immer noch ein Engpass ... Dieses Mal möchte ich einfach die beiden Bilder vergleichen, um die Ähnlichkeit der Bilder festzustellen.

Dinge die zu tun sind

Vergleichen Sie die Ähnlichkeiten der folgenden Bilder. Das Bild wird vom Google-Lehrer aufgenommen. Für eine bessere Genauigkeit habe ich ein nach vorne gerichtetes Bild gewählt.

Vergleichsbild

Dateiname Bild Erläuterung
05.png 05 Shiba Hund (süß)

Vergleich

Dateiname Bild Erläuterung
01.png 01 Daxfund (süß)
02.png 02 Corgi (süß)
03.png 03 Golden Retriever (süß)
04.png 04 Shiba Hund (süß)
06.png 06 Labrador Retriever (süß)

Wenn die Ähnlichkeit zwischen 05.png und 04.png, die dieselbe Hunderasse sind, hoch ist, ist dies ein Erfolg.

Umgebung

Verzeichnisaufbau

hist_matching.py
feature_detection.py
images
 ├─ 01.png
 ├─ 02.png
 ├─ 03.png
 ├─ 04.png
 ├─ 05.png
 └─ 06.png

Validierung 1: Vergleichen Sie das Histogramm

Grob gesagt handelt es sich um eine Methode zum Vergleichen nach Farbton. Siehe unten für Details.

Die Graustufenkonvertierung wird nicht durchgeführt, da der Vergleich auf dem Farbton basiert. Außerdem wird die Bildgröße zum Vergleich einheitlich in 200 x 200 Pixel konvertiert.

hist_matching.py


#!/usr/bin/env python
# -*- coding: UTF-8 -*-

"""hist matching."""

import cv2
import os

TARGET_FILE = '05.png'
IMG_DIR = os.path.abspath(os.path.dirname(__file__)) + '/images/'
IMG_SIZE = (200, 200)

target_img_path = IMG_DIR + TARGET_FILE
target_img = cv2.imread(target_img_path)
target_img = cv2.resize(target_img, IMG_SIZE)
target_hist = cv2.calcHist([target_img], [0], None, [256], [0, 256])

print('TARGET_FILE: %s' % (TARGET_FILE))

files = os.listdir(IMG_DIR)
for file in files:
    if file == '.DS_Store' or file == TARGET_FILE:
        continue

    comparing_img_path = IMG_DIR + file
    comparing_img = cv2.imread(comparing_img_path)
    comparing_img = cv2.resize(comparing_img, IMG_SIZE)
    comparing_hist = cv2.calcHist([comparing_img], [0], None, [256], [0, 256])

    ret = cv2.compareHist(target_hist, comparing_hist, 0)
    print(file, ret)

Verbraucht es Speicher? Segmentierungsfehler: 11 oder Python (18114,0x7fff7a45b000) malloc: *** Fehler für Objekt 0x102000e00: falsche Prüfsumme für freigegebenes Objekt - Objekt wurde wahrscheinlich nach dem Freigeben geändert. Es wird selten angezeigt. Ich konnte keine Lösung finden (sorry), aber bei einer großen Anzahl von Bildern scheint es besser, die Anzahl der Vergleichsbilder zu reduzieren und die Verarbeitung mehrmals durchzuführen.

Ausführungsergebnis


TARGET_FILE: 05.png
01.png 0.3064316801821619
02.png -0.09702013809004943
03.png 0.5273343981076624
04.png 0.5453261576844468
06.png 0.1256772923432995

Für genau das gleiche Bild beträgt die Ähnlichkeit 1. Sie können sehen, dass die Ähnlichkeit zwischen 05.png und 04.png hoch ist. Es war überraschend, dass der Ähnlichkeitsgrad mit 01.png hoch war.

Überprüfung 2: Feature-Point-Matching

2 Extrahieren Sie die Merkmalspunkte des Bildes und vergleichen Sie ihre Abstände. Ich bezog mich auf Folgendes.

Eine Graustufenumwandlung wird durchgeführt, um die Extraktionsgenauigkeit zu verbessern. Wie im vorherigen Abschnitt wird die Bildgröße zum Vergleich einheitlich in 200 x 200 Pixel konvertiert.

feature_detection.py


#!/usr/bin/env python
# -*- coding: UTF-8 -*-

"""feature detection."""

import cv2
import os

TARGET_FILE = '05.png'
IMG_DIR = os.path.abspath(os.path.dirname(__file__)) + '/images/'
IMG_SIZE = (200, 200)

target_img_path = IMG_DIR + TARGET_FILE
target_img = cv2.imread(target_img_path, cv2.IMREAD_GRAYSCALE)
target_img = cv2.resize(target_img, IMG_SIZE)

bf = cv2.BFMatcher(cv2.NORM_HAMMING)
# detector = cv2.ORB_create()
detector = cv2.AKAZE_create()
(target_kp, target_des) = detector.detectAndCompute(target_img, None)

print('TARGET_FILE: %s' % (TARGET_FILE))

files = os.listdir(IMG_DIR)
for file in files:
    if file == '.DS_Store' or file == TARGET_FILE:
        continue

    comparing_img_path = IMG_DIR + file
    try:
        comparing_img = cv2.imread(comparing_img_path, cv2.IMREAD_GRAYSCALE)
        comparing_img = cv2.resize(comparing_img, IMG_SIZE)
        (comparing_kp, comparing_des) = detector.detectAndCompute(comparing_img, None)
        matches = bf.match(target_des, comparing_des)
        dist = [m.distance for m in matches]
        ret = sum(dist) / len(dist)
    except cv2.error:
        ret = 100000

    print(file, ret)

In seltenen Fällen benutze ich "try Except", um "cv2.error" auszuspucken. Ich habe die Extraktionsmethode mit AKAZE und ORB ausprobiert.

Ausführungsergebnis (AKAZE)


TARGET_FILE: 05.png
01.png 143.925
02.png 134.05
03.png 140.775
04.png 127.8
06.png 148.725

Ausführungsergebnis (ORB)


TARGET_FILE: 05.png
01.png 67.59139784946237
02.png 58.60931899641577
03.png 59.354838709677416
04.png 53.59498207885304
06.png 63.55913978494624

Da der Abstand berechnet wird, ist der Wert für genau dasselbe Bild 0, und je kleiner der Wert ist, desto höher ist die Ähnlichkeit. Bei beiden implementierten Methoden ist die Ähnlichkeit zwischen 05.png und 04.png wie im vorherigen Abschnitt hoch.

Zusammenfassung

Recommended Posts

Finden Sie Bildähnlichkeit mit Python + OpenCV
Bildbearbeitung mit Python OpenCV
[Python] Verwenden von OpenCV mit Python (Bildfilterung)
[Python] Verwenden von OpenCV mit Python (Bildtransformation)
Bildverarbeitung mit Python & OpenCV [Tonkurve]
Bildaufnahme von der Kamera mit Python + OpenCV
Leichte Bildverarbeitung mit Python x OpenCV
Ich habe versucht, mit Python + OpenCV eine Bildähnlichkeitsfunktion zu erstellen
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
So beschneiden Sie ein Bild mit Python + OpenCV
[Kleine Geschichte] Testen Sie die Bilderzeugung mit Python / OpenCV
Bildverarbeitung mit Python (Teil 2)
"Apple-Verarbeitung" mit OpenCV3 + Python3
Kameraerfassung mit Python + OpenCV
[Python] Verwenden von OpenCV mit Python (Basic)
Sortieren von Bilddateien mit Python (2)
Sortieren von Bilddateien mit Python (3)
Bildverarbeitung mit Python (Teil 1)
Tweet mit Bild in Python
Bilddateien mit Python sortieren
Bildverarbeitung mit Python (3)
Gesichtserkennung mit Python + OpenCV
Holen Sie sich Bildfunktionen mit OpenCV
Verwenden von OpenCV mit Python @Mac
Bilderkennung mit Keras + OpenCV
[Python] Bildverarbeitung mit Scicit-Image
[OpenCV / Python] Ich habe versucht, Bilder mit OpenCV zu analysieren
JPEG-Bilderzeugung durch Angabe der Qualität mit Python + OpenCV
Erstellen verschiedener Photoshop-Videos mit Python + OpenCV ② Erstellen Sie Photoshop-Standbilder
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
Schneiden Sie ein Bild mit Python aus
Grundlagen der Echtzeit-Bildverarbeitung mit opencv
Neuronales Netzwerk mit OpenCV 3 und Python 3
[Python] Verwenden von OpenCV mit Python (Kantenerkennung)
Finden Sie die Bearbeitungsentfernung (Levenshtein-Entfernung) mit Python
Die Bildverarbeitung mit Python 100 klopft an die Binärisierung Nr. 3
Einfache Python + OpenCV-Programmierung mit Canopy
Fügen Sie mit Python / OpenCV PNG mit Alphakanal als transparentes Bild ein
Versuchen Sie die Gesichtserkennung mit Python + OpenCV
Schneiden Sie das Gesicht mit Python + OpenCV aus
Gesichtserkennung mit Kamera mit opencv3 + python2.7
Laden Sie das GIF-Bild mit Python + OpenCV
Versuchen Sie, das Bild mit opencv2 zu verwischen
Verwenden Sie OpenCV mit Python 3 in Window
100 Bildverarbeitung mit Python Knock # 2 Graustufen
Zeichnen Sie eine Illustration mit Python + OpenCV
Einführung in die Bildanalyse opencv python
Verfolgen Sie Baseballbälle mit Python + OpenCV
Graphbasierte Segmentierung mit Python + OpenCV
Sende Bild mit Python und speichere mit PHP
[Python] Mit OpenCV können Sie problemlos Bilddateien mit Seriennummern lesen
Zeichnen Sie einen Pfeil (Vektor) mit opencv / python
Grundlegendes Studium von OpenCV mit Python
Erzeugung von Verlaufsbildern mit Python [1] | np.linspace
Automatische Bildinterpolation mit OpenCV und Python (Fast Marching Method, Navier-Stokes)
Bildverarbeitung mit Python 100 Knock # 10 Medianfilter
Gesichtserkennung mit Python + OpenCV (invariante Rotation)
HTML-Mail mit Bild zum Senden mit Python
Erstellen Sie mit Python + PIL ein Dummy-Image.
Speichern Sie Videos Frame für Frame mit Python OpenCV