Bildverarbeitung Teil 5: Arithmetik, bitweise Operationen und Maskierung
In diesem 5. Teil der Bildverarbeitungsreihe diskutieren wir mehr über arithmetische und bitweise Operationen sowie das Maskieren von Bildern in Python.
Es wird empfohlen, die vorherigen Artikel zu lesen, bevor Sie Ihr Abenteuer im maskierten Lernen hier beginnen.
Die Umgebung einrichten
Die folgenden Codezeilen werden in allen unten angegebenen Anwendungen verwendet. Wir werden sie hier einfügen, damit Sie nicht durch einen riesigen Block von Code lesen müssen.
Hilft, Unordnung zu reduzieren :)
importing numpy to work with pixels
import numpy as np
importing argument parsers
import argparse
importing the OpenCV module
import cv2
initializing an argument parser object
ap = argparse.ArgumentParser()
adding the argument, providing the user an option
to input the path of the image
ap.add_argument("-i", "--image", required=True, help="Path to the image")
parsing the argument
args = vars(ap.parse_args())
reading the image location through args
and reading the image using cv2.imread
image = cv2.imread(args["image"])
Arithmetische Operationen auf Bildern mit Python
Arithmetische Operationen ermöglichen es uns, viele Aspekte eines Bildes zu verbessern.
Wir können mit Beleuchtung, Schatten sowie der Verstärkung der roten, blauen und grünen Farben arbeiten.
Viele Bildfilter in Anwendungen verwenden dieselbe Methode, um Fotos zu verändern und zu verschönern.
Also, lass uns mit dem ganzen Code anfangen!
Zuerst, um zu verstehen, ob die Grenze über 255 oder 0 gehen kann, können wir einen einfachen Test durchführen, der uns 255 und 0 liefert.
printing out details of image min, max and the wrap around
print("max of 255 :", str(cv2.add(np.uint8([200]), np.uint8([100]))))
print("min of 0 :", str(cv2.subtract(np.uint8([50]), np.uint8([100]))))
print("wrap around :", str(np.uint8([200]) + np.uint8([100])))
print("wrap around :", str(np.uint8([50]) - np.uint8([100])))
In diesem Beispiel erhöhen wir die Intensität aller Pixel im Bild um 100.
adding pixels of value 255 (white) to the image
M = np.ones(image.shape, dtype="uint8") * 100
added = cv2.add(image, M)
cv2.imshow("Added", added)
cv2.waitKey(0)
Dies geschieht, indem man mit dem NumPy Modul eine Matrix in der gleichen Größe wie unsere Bilder erstellt und sie mit unserem Bild addiert.
Falls wir ein Bild abdunkeln möchten, ziehen wir von den Pixelwerten des Bildes ab, wie unten gezeigt,
adding pixels of value 0 (black) to the image
M = np.ones(image.shape, dtype="uint8") * 50
subtracted = cv2.subtract(image, M)
cv2.imshow("Subtracted", subtracted)
cv2.waitKey(0)
Dies sollte Ihnen zwei verschiedene Varianten des ursprünglichen Bildes bieten, eine hellere und die andere dunklere.
Bitweise Operationen
Wir verwenden Bitweise-Operationen oft, wenn wir versuchen, Bilder zu maskieren.
Dieses Feature von OpenCV ermöglicht es uns, den Teil des Bildes herauszufiltern, der für uns relevant ist.
Einrichten
Um an bitweisen Operationen zu arbeiten, benötigen wir zuerst zwei Variablen oder Bilder, auf denen wir die Operationen durchführen können.
Lass uns also ein bitweises Quadrat und einen bitweisen Kreis erstellen, durch die wir die bitweisen Operationen verwenden können.
Beachten Sie, dass bitweise Operationen Bilder in Schwarzweiß erfordern.
creating a square of zeros using a variable
rectangle = np.zeros((300, 300), dtype="uint8")
cv2.rectangle(rectangle, (25, 25), (275, 275), 255, -1)
cv2.imshow("Rectangle : ", rectangle)
creating a circle of zeros using a variable
circle = np.zeros((300, 300), dtype="uint8")
cv2.circle(circle, (150, 150), 150, 255, -1)
cv2.imshow("Circle : ", circle)
Die Ausgabebilder, die Sie erhalten sollten, sollten so aussehen:
Kombinieren Sie mit der UND-Operation
Bitweise Addition bezieht sich auf die Addition von zwei verschiedenen Bildern und entscheidet, welches angezeigt werden soll, indem eine UND-Operation auf jedes Pixel der Bilder angewendet wird.
the bitwise_and function executes the AND operation
on both the images
bitwiseAnd = cv2.bitwise_and(rectangle, circle)
cv2.imshow("AND", bitwiseAnd)
cv2.waitKey(0)
Die bitweise Addition sowohl des Kreises als auch des Quadrats ergibt uns eine Ausgabe, die ungefähr so aussehen sollte:
Bei einer Wahl mit der ODER-Operation
Bitweises ODER bietet uns ein Produkt der beiden Bilder, bei dem eine ODER-Operation auf jedem Pixel der Bilder durchgeführt wird.
the bitwise_or function executes the OR operation
on both the images
bitwiseOr = cv2.bitwise_or(rectangle, circle)
cv2.imshow("OR", bitwiseOr)
cv2.waitKey(0)
Nach der Durchführung der Bitwise-OR-Operation sollten Sie etwas wie dies erhalten:
Exklusivität mit der XOR-Operation
Eine weitere Operation, die vom cv2-Modul bereitgestellt wird, ist die XOR-Operation, die wir über die Funktion bitwise_xor verwenden können.
the bitwise_xor function executes the XOR operation
on both the images
bitwiseXor = cv2.bitwise_xor(rectangle, circle)
cv2.imshow("XOR", bitwiseXor)
cv2.waitKey(0)
Negation mit dem NOT Operator
Zuletzt haben wir die Negationsoperation, die mit der Funktion bitwise_not durchgeführt wird.
Die NOT-Operation benötigt nur ein einzelnes Bild, da wir hier nichts hinzufügen oder subtrahieren.
Wir verwenden es hier jedoch weiterhin auf beiden Seiten, das ist auch eine Option.
the bitwise_not function executes the NOT operation
on both the images
bitwiseNot = cv2.bitwise_not(rectangle, circle)
cv2.imshow("NOT", bitwiseNot)
cv2.waitKey(0)
Der Kreis ist in diesem Fall im Quadrat und daher nicht sichtbar.
Maskierung von Bildern mit Python OpenCV
Maskierung wird in der Bildverarbeitung verwendet, um die Region von Interesse auszugeben, oder einfach den Teil des Bildes, der uns interessiert.
Wir neigen dazu, bitweise Operationen zum Maskieren zu verwenden, da wir die Teile des Bildes, die wir nicht benötigen, verwerfen können.
Lass uns also mit dem Maskieren anfangen!
Der Prozess des Maskierens von Bildern
Wir haben drei Schritte beim Maskieren.
- Ein schwarzes Canvas mit denselben Abmessungen wie das Bild erstellen und es als
maskbenennen. - Ändern der Werte der Maske, indem eine beliebige Figur im Bild gezeichnet und ihr eine weiße Farbe zugewiesen wird.
- Die bitweise ADD-Operation auf das Bild mit der Maske durchführen.
Folgen wir dem gleichen Prozess, lassen Sie uns ein paar Masken erstellen und diese auf unser Bild anwenden.
Zuerst lassen Sie uns mit einer rechteckigen Maske arbeiten.
creating a mask of that has the same dimensions of the image
where each pixel is valued at 0
mask = np.zeros(image.shape[:2], dtype="uint8")
creating a rectangle on the mask
where the pixels are valued at 255
cv2.rectangle(mask, (0, 90), (290, 450), 255, -1)
cv2.imshow("Mask", mask)
performing a bitwise_and with the image and the mask
masked = cv2.bitwise_and(image, image, mask=mask)
cv2.imshow("Mask applied to Image", masked)
cv2.waitKey(0)
Jetzt lass es uns mit einer Kreismaske ausprobieren.
creating a mask of that has the same dimensions of the image
where each pixel is valued at 0
mask = np.zeros(image.shape[:2], dtype="uint8")
creating a rectangle on the mask
where the pixels are valued at 255
cv2.circle(mask, (145, 200), 100, 255, -1)
cv2.imshow("Mask", mask)
performing a bitwise_and with the image and the mask
masked = cv2.bitwise_and(image, image, mask=mask)
cv2.imshow("Mask applied to Image", masked)
cv2.waitKey(0)
Wenn alles gut läuft, sollten wir Ausgaben erhalten, die etwa so aussehen:
Schlussfolgerung
Wir fangen endlich mit dem Kern der Bildverarbeitung an, und es ist wichtig, bitweise Operationen und Maskierung zu verstehen.
Es hilft uns, Teile des Bildes auszublenden oder nur Teile aufzunehmen, an denen wir interessiert sind, also ein ziemlich nützliches Konzept.
Wir kommen in einem anständigen Tempo voran, aber falls du vorspulen und zum Ende kommen möchtest, nur zu!
Hier sind Artikel, die Ihnen einen Einblick in OpenCV und Gesichtserkennung sowie eine Java-Implementierung von Android und CameraX OpenCV geben.
Referenzen
- Offizielle OpenCV-Website
- Einführung in den Einstieg mit OpenCV
- Mein GitHub-Repository für Bildverarbeitung
- Arithmetische Operationscode
- Bitweise Operationen Code
- Maskierungscode






