Bildähnlichkeit | Implementieren Sie Bildähnlichkeit in Python

Inhalt

Dieser Beitrag wurde im Rahmen der Data Science Blogathon.

Einführung

Haben Sie schon einmal davon geträumt, Ihre eigene Bildähnlichkeits-App zu erstellen?, aber du hast Angst, dass du nicht genug über Deep Learning weißt, Convolutional Neural Network und mehr? Mach dir keine Sorgen. Das folgende Tutorial wird Ihnen den Einstieg erleichtern und Ihnen helfen, Ihre eigene Bildähnlichkeits-App mit grundlegender Mathematik zu programmieren.

Bevor Sie mit Mathematik und Code fortfahren, Ich würde dir eine einfache Frage stellen. Gegeben zwei Referenzbilder und ein Testbild, Zu welchem ​​gehört unser Testbild deiner Meinung nach zu zweien?

Referenzbild 1

Bildähnlichkeit Referenzbild 1

Referenzbild 2

Bildähnlichkeit Referenzbild 2

Testbild

Bildähnlichkeitstest Bild

Wenn Sie der Meinung sind, dass unser Testbild unserem ersten Referenzbild ähnelt, Ist richtig. Wenn du etwas anderes glaubst, Lass es uns zusammen mit der Kraft von Mathematik und Programmierung herausfinden.

“Die Zukunft der Suche wird sich auf Bilder statt auf Schlüsselwörter konzentrieren”. – Ben Silbermann, CEO von Pinterest.

Vektorbild

Jedes Bild wird in unserem Computer in Form von Zahlen gespeichert und ein Vektor solcher Zahlen, der unser Bild vollständig beschreiben kann, wird als Bildvektor bezeichnet.

Euklidische Entfernung:

Der euklidische Abstand repräsentiert den Abstand zwischen zwei beliebigen Punkten in einem n-dimensionalen Raum. Da wir unsere Bilder als Bildvektoren darstellen, sie sind nichts anderes als ein Punkt in einem Raum von n Dimensionen und wir werden den euklidischen Abstand verwenden, um den Abstand zwischen ihnen zu finden.

Euklidische Distanzformel

Histogramm:

Ein Histogramm ist eine grafische Darstellung von Zahlenwerten. Wir verwenden den Bildvektor für die drei Bilder und finden dann den euklidischen Abstand zwischen ihnen. Basierend auf den zurückgegebenen Werten, das Bild mit kleinerem Abstand ist ähnlicher als das andere.

Histogramm-Grafik - MATLAB

Um die Ähnlichkeit zwischen den beiden Bildern zu finden, Wir werden den folgenden Ansatz verwenden:

  1. Lesen Sie die Bilddateien als Array.
  2. Da die Bilddateien farbig sind, Es gibt 3 Kanäle für RGB-Werte. Wir werden sie so abflachen, dass jedes Bild eine einzelne 1-D-Matrix ist.
  3. Sobald wir unsere Bilddateien als Array haben, wir werden für jedes Bild ein Histogramm generieren, wobei für jeden Index 0-255 zählen wir das Auftreten dieses Pixelwerts im Bild.
  4. Sobald wir unsere Histogramme haben, wir verwenden die L2-Regel oder den euklidischen Abstand, um die Differenz zwischen den beiden Histogrammen zu finden.
  5. Basierend auf dem Abstand zwischen dem Histogramm unseres Testbildes und den Referenzbildern, Wir können das Bild finden, dem unser Testbild am ähnlichsten ist..

Codieren für Bildähnlichkeit in Python

Importieren Sie die Abhängigkeiten, die wir verwenden werden

from PIL import Image
from collections import Counter
import numpy as np

Wir verwenden NumPy, um das Bild als NumPy-Array zu speichern., Bild, um das Bild in numerischen Werten zu lesen, und Zähler, um zu zählen, wie oft jeder Pixelwert auftritt (0-255) in den Bildern.

Lesen Sie das Bild

reference_image_1 = Bild.open('Referenz_Bild1.jpg')
reference_image_arr = np.asarray(reference_image_1)
drucken(np.form(reference_image_arr))
>>> (250, 320, 3)

Wir können sehen, dass unser Bild korrekt als 3D-Matrix gelesen wurde. Im nächsten Schritt, wir müssen diese 3D-Matrix in eine eindimensionale Matrix abflachen.

flat_array_1 = array1.flatten()
drucken(np.form(flat_array_1))
>>> (245760, )

Wir werden die gleichen Schritte für die anderen beiden Bilder machen. Ich überspringe es hier, damit du es weiter testen kannst.

Generieren des Zählhistogrammvektors:

RH1 = Zähler(flat_array_1)

Die nächste Codezeile gibt ein Wörterbuch zurück, in dem der Schlüssel dem Pixelwert entspricht und der Schlüsselwert der Häufigkeit entspricht, mit der ein Pixel im Bild vorhanden ist.

Eine Einschränkung des euklidischen Abstands besteht darin, dass alle Vektoren normalisiert werden müssen, Mit anderen Worten, beide Vektoren müssen die gleichen Dimensionen haben. Um sicherzustellen, dass unser Histogrammvektor normalisiert ist, wir verwenden eine Schleife für of 0-255 und wir generieren unser Histogramm mit dem Schlüsselwert, wenn der Schlüssel im Bild vorhanden ist; umgekehrter Fall, wir fügen hinzu 0.

H1 = []
für mich in Reichweite(256):
    wenn ich in RH1.keys():
        H1.anhängen(D1[ich])
    anders:
        H1.anhängen(0)

Das obige Code-Snippet generiert einen Vektor der Größe (256,) wobei jeder Index dem Pixelwert und der Wert der Pixelzahl in diesem Bild entspricht.

Wir folgen den gleichen Schritten für die anderen beiden Bilder und erhalten ihre entsprechenden Count-Histogram-Vektoren. In diesem Punkt, Wir haben unsere endgültigen Vektoren sowohl für die Referenzbilder als auch für das Testbild und alles, was wir tun werden, ist, die Entfernungen zu berechnen und vorherzusagen.

Euklidische Abstandsfunktion:

def L2Norm(H1,H2):
    distance =0
    for i in range(len(H1)):
        Abstand += np.square(H1[ich]-H2[ich])
    Rückgabe np.sqrt(Distanz)

Die obige Funktion nimmt zwei Histogramme und gibt den euklidischen Abstand zwischen ihnen zurück.

Auswertung:

Da wir alles haben, was wir brauchen, um die Ähnlichkeiten im Bild zu finden, Finden wir den Abstand zwischen dem Testbild und unserem ersten Referenzbild heraus.

dist_test_ref_1 = L2Norm(H1,test_H)
drucken("Der Abstand zwischen Reference_Image_1 und Test Image beträgt : {}".Format(dist_test_ref_1))
>>> Der Abstand zwischen Reference_Image_1 und Test Image beträgt : 9882.175468994668

Finden wir nun den Abstand zwischen dem Testbild und unserem zweiten Referenzbild heraus.

dist_test_ref_2 = L2Norm(H2,test_H)
drucken("Der Abstand zwischen Reference_Image_2 und Test Image beträgt : {}".Format(dist_test_ref_2))
>>> Der Abstand zwischen Reference_Image_2 und Test Image beträgt : 137929.0223122023

Fazit

Basierend auf früheren Ergebnissen, Wir können sehen, dass der Abstand zwischen unserem Testbild und unserem ersten Referenzbild viel kleiner ist als der Abstand zwischen unserem Test und unserem zweiten Referenzbild, Dies ist sinnvoll, da sowohl das Testbild als auch unser erstes Referenzbild Piegon-Bilder sind, während unser zweites Referenzbild einen Pfau zeigt.

Im nächsten Tutorial, Wir haben gelernt, wie man grundlegende Mathematik und wenig Programmieren verwendet, um unseren eigenen Bildähnlichkeitsprädiktor mit ziemlich anständigen Ergebnissen zu erstellen.

Den vollständigen Code finden Sie zusammen mit den Bildern. hier.

Über den Autor

Mein Name ist Prateek Agrawal und ich bin Student im dritten Jahr am Indian Institute of Design and Manufacturing of Information Technology Kancheepuram, Mein B.Tech und M.Tech Dual Degree in Informatik verfolgen. Ich hatte schon immer ein Händchen für Machine Learning und Data Science und praktiziere es seit etwa einem Jahr und habe einige Siege auf dem Buckel..

Das glaube ich persönlich Leidenschaft ist alles was du brauchst. Ich erinnere mich, dass ich Angst bekam, wenn Leute über CNNS sprechen, RNN und Deep Learning, weil ich keinen einzigen Teil verstehen konnte, aber ich habe nicht aufgegeben. Ich hatte die Leidenschaft und habe angefangen, kleine Schritte in Richtung Lernen zu machen und hier poste ich meinen ersten Blog. Ich wünsche dir viel Spaß beim Lesen und fühlst dich ein bisschen selbstbewusst. Vertrau mir dabei, ja, ich kann, du kannst.

Bitte, Schreiben Sie mir bei Fragen oder einfach nur um Hallo zu sagen.

LinkedIn: https://www.linkedin.com/in/prateekagrawal1405/
Github: https://github.com/prateekagrawaliiit

Credits
  • Wikipedia
  • Vidhya-Analytik
  • Halb
  • Google Bilder

Die in diesem Beitrag gezeigten Medien sind nicht Eigentum von DataPeaker und werden nach Ermessen des Autors verwendet.

Abonniere unseren Newsletter

Wir senden Ihnen keine SPAM-Mail. Wir hassen es genauso wie du.