Bildmaskierung in OpenCV
Wenn wir einen Teil des Bildes herausfiltern und diesen herausgefilterten Teil dann mit einem anderen Bild kombinieren möchten, kann dies durch Maskieren erfolgen. In OpenCV wird der bitweise AND
-Operator verwendet, um zwei verschiedene Bilder zu einem zu kombinieren, oder er kann einige Teile eines Bildes zu einem anderen kombinieren.
Bitweises UND
berechnet im Allgemeinen die bitweise logische Verknüpfung pro Element zweier Arrays/Skalar/Bilder. In diesem Artikel werden wir sehen, wie man mit dem bitweisen AND
-Operator der OpenCV-Bibliothek Maskierung auf ein Bild anwendet.
Führen Sie die Maskierung in OpenCV mit dem bitweisen AND
-Operator durch
Bitweise Operatoren werden in OpenCV verwendet, damit wir den Teil eines Bildes extrahieren oder herausfiltern können, das Bild darstellen und mit nicht rechteckigen ROIs (Region of Interest) arbeiten können. Um die bitweise AND
-Operation in OpenCV auszuführen, verwenden wir die bitwise_and()
-Methode.
Die Syntax für bitwise_and()
ist wie folgt.
cv.bitwise_and(img_array_1, img_array_2, destination_array, masking)
Die Methode bitwise_and()
nimmt vier Argumente entgegen:
img_array_1
: Daten von Bild 1 im Array-Format.img_array_2
: Daten von Bild 2 im Array-Format.destination_array
: Ausgabebild mit derselben Größe und demselben Typ wie das Eingabearray. Dies ist ein optionaler Parameter.Maskierung
: Dies ist die Maskierungsoperation, die auf dem resultierenden Bild durchgeführt wird. Dies ist ein optionaler Parameter.
Sehen wir uns anhand des folgenden Beispiels an, wie die Maskierung mit bitwise_and()
funktioniert.
Angenommen, wir haben zwei Bilder, ein Bild von einem Logo und ein anderes von einem Auto, und wir müssen das Logo oben links auf dem Bild des Autos hinzufügen. Um dies zu erreichen, schreiben wir den folgenden Code in Python mit OpenCV.
Zuerst müssen wir Bilder sowohl des logo
- als auch des Auto
-Bildes lesen und sie dann den Variablen img1
bzw. img2
zuweisen. Beim Maskieren verwenden wir ROI, um das Logo auf der oberen linken Seite des Autobilds anzuwenden oder anzuzeigen.
Dazu extrahieren wir die Daten row
, cols
und channels
aus img2
, unserem Logo. Da wir dieses Logo in der oberen linken Ecke des Autobilds platzieren möchten, wenden wir die rows
und cols
von img2
auf die img1
(0,0)-Koordinaten an, wie unten gezeigt.
Code-Auszug:
# import opencv
import cv2 as cv
# Loading images
img1 = cv.imread("car.jpg")
img2 = cv.imread("logo.png")
# We want to put the logo on the top-left corner, so we create ROI
rows, cols, channels = img2.shape
roi = img1[0:rows, 0:cols]
# Now create a mask of the logo and create its inverse mask, also
img2gray = cv.cvtColor(img2, cv.COLOR_BGR2GRAY)
ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY)
mask_inv = cv.bitwise_not(mask)
# Now black out the area of the logo in ROI
img1_bg = cv.bitwise_and(roi, roi, mask=mask_inv)
# Take only the region of the logo from the logo image.
img2_fg = cv.bitwise_and(img2, img2, mask=mask)
# Put logo in ROI and modify the main image
dst = cv.add(img1_bg, img2_fg)
img1[0:rows, 0:cols] = dst
cv.imshow("mask", mask)
cv.imshow("inv_mask", mask_inv)
cv.imshow("img1_bg", img1_bg)
cv.imshow("img2_fg", img2_fg)
cv.imshow("Final image", img1)
cv.waitKey(0)
cv.destroyAllWindows()
Danach müssen wir die Maske und die inverse Maske des Logos erstellen. Dazu haben wir zunächst die Hintergrundfarbe des Logos auf grau geändert und daraus die Maske und das inverse Maskenbild als mask
und mask_inv
gemacht.
Um die Hintergrundfarbe des Bildes zu ändern, verwenden wir die Methode cvtColor()
, und zum Erstellen einer Maske verwenden wir die Methode threshold()
. Schließlich verwenden wir bitwise_not()
, um das Bild umzukehren.
Wir können auch die Funktion imshow()
auf die Bilder mask
und mask_inv
anwenden, um zu untersuchen, was während der Maskierung geändert wurde.
Jetzt schwärzen wir den Bereich des Logos in ROI und machen bitwise_and()
, um den Hintergrund des Logos zu erhalten, d.h. img2
. In ähnlicher Weise nehmen wir nur das Logo aus dem Logobild und führen bitwise_and()
aus, um den Vordergrund des Autobilds zu erhalten, dh img1
.
Hier können wir auch die Funktion imshow()
auf den Bildern img1
(Autobild) und img2
(Logobild) verwenden, um zu überprüfen, welche Dinge geändert wurden.
Jetzt fügen wir sowohl img1
als auch img2
hinzu, sodass wir das Logo mit dem Hintergrund eines Autos in ROI erhalten. Dieses Ausgabebild legen wir dann in dst
.
Ausgang:
Wir fügen später das dst
in das gesamte Autobild ein und erhalten die endgültige Ausgabe mit imshow()
. Auf diese Weise verwenden wir den ROI, um einen bestimmten Teil des Bildes zu erhalten, und fügen ihn einem anderen Bild hinzu, um das endgültige Bild zu erhalten.
Sahil is a full-stack developer who loves to build software. He likes to share his knowledge by writing technical articles and helping clients by working with them as freelance software engineer and technical writer on Upwork.
LinkedIn