OpenCV ist eine leistungsstarke und hochoptimierte Open-Source-Bibliothek, die unter der BSD 3-Klausel-Lizenz entwickelt und veröffentlicht wurde. Es ist plattformübergreifend verfügbar (Linux, macOS, ios, Windows und Android) und unterstützt mehrere Sprachen (C++, Java und Python). Es ist sehr vielseitig. Es ist eine der besten Methoden, um zwei Bilder zu vergleichen und Unterschiede mit Python hervorzuheben.

Es wurde für maschinelles Lernen, Bildverarbeitung, 3D-Rekonstruktion, Objekterkennung und vieles mehr entwickelt, spielt aber heutzutage eine große Rolle in Echtzeitanwendungen, die in dieser Zeit sehr wichtig sind, mit seinen Echtzeitoperationen kann man Bilder verarbeiten und Videos, Objekte identifizieren und sogar den Unterschied in der Handschrift oder zwei sehr ähnlichen Bildern erkennen. OpenCV-Anwendungen sind nur durch unsere Vorstellungskraft begrenzt.

In diesem Artikel werden wir das OpenCV-Paket verwenden und es verwenden, um zwei Bilder zu vergleichen und Unterschiede mit Python hervorzuheben.

Nehmen wir zum Beispiel diese beiden Webseiten-Screenshots:

1.png

2.png

Im ersten Bild haben wir 3 Artikel und im zweiten haben wir 6 Artikel. Wir werden den Unterschied zwischen diesen beiden Screenshots mit OpenCV hervorheben und finden. Jetzt gehen wir davon aus, dass wir zwei dieser Webseiten-Screenshots irgendwo in unserem Systemspeicher haben.

Es gibt 2 grundlegende Elemente, die wir beachten müssen:

  1. Beide Bilder müssen die gleiche Größe und die gleichen Kanäle haben.
  2. Jedes der Pixel muss den gleichen Wert haben.

Wir können dies in den folgenden sieben Schritten tun:

  • Laden Sie das Originalbild und das zweite
  • Überprüfen Sie die Größe der Bilder
  • Finden Sie den Unterschied zwischen zwei Bildern
  • Wandeln Sie sie in Graustufen um
  • Erhöhung der Größe der Unterschiede
  • Den Zähler für die Änderungen finden
  • Anzeigebox um die Änderungen

Verfahren

Zuerst laden wir die Bilder in das System oder die Software, die wir für diese Operation verwenden werden. Sie können verwenden, was Sie bevorzugen. Es gibt viele IDE im Web wie PyCharm, Microsoft Visual Studio Code, Eclipse, usw. Sie sind alle gut, Sie können jeden von ihnen verwenden. Sie können eine andere Programmiersprache verwenden, um dies durchzuführen, aber in diesem Tutorial werden wir Python verwenden. Es ist eine sehr freundliche Sprache für Anfänger.

Lassen Sie uns nun den Prozess starten:

Beginnen wir damit, zu prüfen, ob sie die gleiche Größe und die gleichen Kanäle haben. Wenn beide Bilder die gleiche Größe und Kanäle haben, müssen wir mit der Operation fortfahren. Wenn beide Bilder nicht die gleiche Größe und Kanäle haben, sind sie nicht gleich.

Wenn beide Bilder die gleichen Größen und Kanäle haben, können wir sie subtrahieren. Die Operation cv2.subtract(image1,image2) anstelle einer arithmetischen Operation und einfach jedes Pixel vom ersten Bild auf den Wert des entsprechenden Pixels im zweiten Bild subtrahieren.

Beginnen wir nun mit der Codierung:

Voraussetzungen

  • OpenCV Package
  • Python-Kenntnisse

Schritt – 1: Installieren des Pakets

Öffnen Sie nun das Terminal und installieren Sie die erforderlichen Pakete mit den folgenden Befehlen:

python3 -m pip install imutils
python3 -m pip install opencv-python

Schritt 2: Importieren der Abhängigkeiten

Öffnen Sie nun Ihren bevorzugten Code-Editor und fügen Sie den folgenden Code ein:

import cv2
import imutiimls 

Dann müssen wir die erforderlichen Bibliotheken einschließlich OpenCV sowie Utils importieren. Wir können imutils einfach mit dem Befehl „pip3 install imutils“ installieren.

#get the images you want to compare.
original = cv2.imread("1.png")
new = cv2.imread("2.png")
#resize the images to make them small in size. A bigger size image may take a significant time
#more computing power and time
original = imutils.resize(original, height = 600)
new = imutils.resize(new, height = 600)

Danach müssen wir die Bilder aus dem Systemspeicher lesen, wir müssen sicherstellen, dass sich beide Bilder im selben Ordner wie der Code befinden, den wir schreiben, andernfalls müssen Sie den Speicherortpfad der Bilder angeben. Sobald die Bilder vollständig geladen sind, müssen wir die Größe der Bilder auf eine überschaubarere Größe ändern (in diesem Fall hoch = 960 Pixel). Jetzt können wir auch mit den Originalbildern selbst arbeiten, obwohl Bilder manchmal sehr groß sind, kann die Verarbeitung der Bilder daher erheblich länger dauern.

 #create a copy of original image so that we can store the
 #difference of 2 images in the same on
 diff = original.copy()
 cv2.absdiff(original, new, diff)
 

Schritt 3: Konvertieren Sie das Bild in Graustufen

Jetzt müssen wir die Funktion absdiff verwenden, die hilft, den absoluten Unterschied zwischen den Pixeln der beiden Bildfelder zu finden. Mit Hilfe dieser Funktion können wir die exakte Differenz pro Element zwischen zwei Arrays berechnen. Die Differenz wird im dritten Argument zurückgegeben.


 #converting the difference into grayscale images
 gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)
  
 #increasing the size of differences after that we can capture them all
 for i in range(0, 3):
     dilated = cv2.dilate(gray.copy(), None, iterations= i+ 1)
 

In diesem Abschnitt des Codes konvertieren wir die Bilder zuerst in Graustufen, um verschiedene Arten von Operationen auf die Bilder wirklich einfach zu machen und anzuwenden, und wenden dann morphologische Operationen an (Morphologische Operationen sind eine breite Palette von Bildverarbeitungsoperationen, die digitale Bilder verarbeiten können). Bilder basierend auf ihren Formen und Größen.) auf den Bildern, um die Pixel miteinander zu verschmelzen, da wir nicht wirklich an den genauen Unterschieden interessiert sind, aber wirklich an den Unterschieden in Bildern interessiert sind.

 
 #threshold the gray image to binary it. Anything pixel that has
 #value higher than 3 we are converting to white
 #(remember 0 is black and 255 is exact white)
 #the image is called binarised as any value lower than 3 will be 0 and
 # all of the values equal to and higher than 3 will be 255
 (T, thresh) = cv2.threshold(dilated, 3, 255, cv2.THRESH_BINARY)
  
 # now we have to find contours in the binarized image
 cnts = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
 cnts = imutils.grab_contours(cnts)
 

Online fünf schwellwert wir das erweiterte Graustufenbild, um es zu binarisieren. Jedes Pixel, das einen höheren Wert als 3 hat, konvertieren wir in Weiß (wir müssen uns daran erinnern, dass der Pixelwert 0 schwarz und 255 exakt weiß ist) und das Bild wird als binarisiert bezeichnet, da jeder Wert unter 3 0 ist und alle Werte ähnlich wie und höher als 3 werden in 255 umgewandelt. Danach können wir die OpenCV-Funktion verwenden, um Konturen eines binarisierten Bildes zu finden.


 for c in cnts:
     # nicely fiting a bounding box to the contour
     (x, y, w, h) = cv2.boundingRect(c)
     cv2.rectangle(new, (x, y), (x + w, y + h), (0, 255, 0), 2)
  
 #remove comments from below 2 lines if you want to
 #for viewing the image press any key to continue
 #simply write the identified changes to the disk
 cv2.imwrite("changes.png", new)
 

Ausgabe

In der ersten Syntax durchlaufen wir alle Konturen, die wir im Bild gefunden haben, und können versuchen, die rechteckigen grünen Begrenzungsrahmen für dieselben Bilder zu finden. In der dritten Zeile der Syntax müssen wir grüne Rechtecke auf den grünen Begrenzungsrahmen erstellen und schließlich können wir das Bild in der letzten Zeile der Syntax auf der Festplatte speichern. Diese grünen Rechteckkästchen helfen Ihnen, zwei Bilder zu vergleichen und Unterschiede mit Python hervorzuheben. Einfach richtig?

Letzte Worte

So können Sie also mit Python zwei Bilder vergleichen und Unterschiede hervorheben. Lassen Sie es uns wissen, wenn Sie Fragen/Anmerkungen dazu haben. Der Vergleich ist nur der erste Schritt in die Welt der Bildbearbeitung, mit OpenCV kann man noch viel mehr erreichen.

Hier sind einige nützliche Tutorials, die Sie lesen können: