[Reproduziert] Die grundlegende Funktionsweise von OpenCV + Python-Images (10)

Im letzten Tutorial haben wir die Funktion der Verwendung des Mausstifts eingeführt. In diesem Tutorial werden wir über die grundlegenden Operationen der OpenCV-Bildverarbeitung sprechen.

Was wir in diesem Tutorial vorstellen müssen, ist:

· Zeigen Sie die Pixelwerte des Bildes an und ändern Sie sie.
· Zeigen Sie die Bildeigenschaften an.
· Zeigen Sie den interessierenden Bereich (ROI) an.
· Teilen und führen Sie das Bild zusammen

Alle Vorgänge in diesem Lernprogramm beziehen sich im Wesentlichen auf Numpy und nicht auf OpenCV. Um OpenCV zum Schreiben von besser optimiertem Code zu verwenden, ist eine Fülle von Numpy-Kenntnissen erforderlich.

Pixelwerte anzeigen und ändern

Wenn wir den Pixelwert eines bestimmten Pixels in einem Bild anzeigen möchten, müssen wir zuerst seine Koordinaten lokalisieren und kalibrieren. Schauen wir uns zunächst ein Farbbild an (immer noch unsere Katze, dieses Tutorial ist unser Protagonist):
Fügen Sie hier eine Bildbeschreibung ein
Jetzt möchte ich den Pixelwert einer bestimmten Koordinate anzeigen, wir geben den Code in pycharm ein:

	view plaincopy to clipboardprint?
import cv2  
import numpy as np  

img = cv2.imread("cat.jpg")  
#获取像素值  
px = img[200,200]  
print(px)  

Der Code besteht darin, den Pixelwert an den Bildkoordinaten (200, 200) anzuzeigen. Sehen wir uns das Ergebnis an:
Fügen Sie hier eine Bildbeschreibung ein

Im vorherigen Tutorial haben wir darüber gesprochen, dass OpenCV Bilder nicht von RGB-Kanälen, sondern von BGR-Kanälen liest. Dann entspricht die Programmausgabe [178, 189, 186] den BGR-Pixeln. Wir können Folgendes überprüfen:

	view plaincopy to clipboardprint?
import cv2  
import numpy as np  

img = cv2.imread("cat.jpg") 
 
#获取像素值  
px = img[200,200]  
B = img[200,200,0]  
G = img[200,200,1]  
R = img[200,200,2]  
print(px,B,G,R)  

Fügen Sie hier eine Bildbeschreibung ein
Nun nehmen wir an, dass wenn das Bild nicht in Farbe, sondern in Schwarzweiß-Graustufenbild ist, wie es ausgegeben wird? Experimentieren Sie zuerst:
Fügen Sie hier eine Bildbeschreibung ein
Wir verwenden den Code gerade noch, um zu experimentieren (vorausgesetzt, das Bild wurde grau skaliert, was später erläutert wird). Der Effekt:
Fügen Sie hier eine Bildbeschreibung ein
Sie können sehen, dass die Pixel von BGR gleich sind. Wir kommen zu dem Schluss: Für Graustufen In einem Bild ist der Ausgabepixelwert im Wesentlichen sein Helligkeitsintensitätswert, der Wertebereich liegt zwischen 0 und 255, wenn er 0 ist, ist alles schwarz, andernfalls ist er weiß.

Als nächstes ändern wir den Pixelwert und weisen dem Array den Pixelwert der angegebenen Koordinate zu:

	view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
img = cv2.imread("cat1.jpg")  
#获取像素值  
px = img[200,200]  
print(px)  
img[200,200] = [225,225,225]  
print(img[200,200])  

Ausgabe anzeigen:
Fügen Sie hier eine Bildbeschreibung ein

Wie Sie sehen können, folgt auf den anfänglichen Pixelwert der geänderte Pixelwert.

Im Allgemeinen wählt ein Array normalerweise einen bestimmten Bereich aus, z. B. die ersten Zeilen oder die letzten Spalten. Für den Zugriff auf ein bestimmtes Pixel haben die Numpy-Array-Methoden array.item () und array.itemset () eine bessere Wirkung. Aber es gibt einen Skalar zurück. Wenn wir also auf alle B-, G- und R-Werte zugreifen möchten, müssen wir array.item () separat aufrufen. Schauen wir uns den Code an (wobei wir immer noch die Koordinaten 200, 200 als Beispiel nehmen):

	view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
img = cv2.imread("cat.jpg")  
#获取像素值  
px = img[200,200]  
print(px)  
print(img.item(200,200,0))  

Wir verwenden item, um den B-Wert des Pixels auszugeben, der der Wert des blauen Pixels ist:
Fügen Sie hier eine Bildbeschreibung ein

Das Experiment zeigt, dass der Effekt der gleiche wie zuvor ist.

Für die Zuweisung der angegebenen Koordinaten können wir die Itemset-Funktion verwenden, um auf ein bestimmtes Pixel genau zu sein. Zum Beispiel ändere ich jetzt nur den Wert des blauen Pixels:

	view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
img = cv2.imread("cat.jpg")  
#获取像素值  
px = img[200,200]  
print(px)  
print(img.item(200,200,0))  
img.itemset((200,200,0),100)  
print(img.item(200,200,0))  

Fügen Sie hier eine Bildbeschreibung ein

Es ist ersichtlich, dass die Zuordnung des angegebenen Farbkanals vollständig möglich ist.

Bildeigenschaften anzeigen

Jetzt werden wir die verschiedenen Attribute des Bildes untersuchen. Die Bildattribute umfassen die Anzahl der Zeilen, Spalten und Kanäle, die Art der Bilddaten, die Anzahl der Pixel und so weiter.

Für ein Bild verwenden wir die Form, um die Anzahl der Zeilen, Spalten und die Anzahl der Farbkanäle zurückzugeben:

	view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
img = cv2.imread("cat.jpg")  
print(img.shape)  

Fügen Sie hier eine Bildbeschreibung ein
Der dritte Wert der Ausgabe repräsentiert die Elementnummer der drei Kanäle des BGR des Bildes, nämlich 3. Jetzt experimentieren wir mit Graustufenbildern:

	view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
img = cv2.imread("cat.jpg")  
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  
print(img.shape)  

Das Graustufenbild wird in einem späteren Lernprogramm erläutert. Hier wird es als Experiment verwendet:
Fügen Sie hier eine Bildbeschreibung ein
Wenn das Bild Graustufen ist, enthält das zurückgegebene Tupel nur die Anzahl der Zeilen und Spalten. Hiermit wird überprüft, ob das geladene Bild vorhanden ist Graustufen sind auch eine gute Methode für Farben.

Die Gesamtzahl der Pixel im aktuellen Bild kann nach Größe zurückgegeben werden:

	view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
img = cv2.imread("cat.jpg")  
print(img.size)  

Fügen Sie hier eine Bildbeschreibung ein
Der Datentyp des Bildes kann über dtype erhalten werden:

	view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
img = cv2.imread("cat.jpg")  
print(img.dtype)  

image.png

Das Standardformat der Imread-Funktion zum Lesen des Bildes ist uint8, daher werden alle zurückgegebenen in diesem Format angezeigt. Wenn wir in Zukunft das Deep-Learning-Framework lernen, werden wir feststellen, dass die Datennormalisierung (Vorverarbeitungsphase) bei Verwendung des Bilddatenformats von uint8 für das Modelltraining zu einem Genauigkeitsverlust und schließlich zu einer Verringerung der Segmentierungsgenauigkeit führt. Natürlich ist dies etwas später, wir werden es jetzt nicht erwähnen.

Wenn wir das Format des Bildes ändern möchten, müssen wir die Astype-Funktion verwenden und das Bild jetzt in das float32-Format ändern (Bilder in diesem Format werden häufig im Deep Learning-Modelltraining verwendet):

	view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
img = cv2.imread("cat.jpg").astype(np.float32)  
print(img.dtype)  

Fügen Sie hier eine Bildbeschreibung ein

dtype ist beim Debuggen sehr wichtig, da eine große Anzahl von Fehlern im OpenCV-Python-Code durch ungültige Datentypen verursacht wird und diese Probleme beim zukünftigen Lernen häufig auftreten werden.

Bild-ROI

Die Auswahl eines bestimmten Bereichs im Bild wird als ROI bezeichnet. Dies ist eine Operation an den xy-Koordinaten des Bildes. Schauen wir uns ein Beispiel an:

	view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
img = cv2.imread("cat.jpg")  
husky = img[1:240,60:270]  
cv2.imshow("img",husky)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

Fügen Sie hier eine Bildbeschreibung ein

Die Essenz entspricht dem Abfangen eines bestimmten Teils des Bildes. Lassen Sie uns nun einige interessante Operationen ausführen, um den abgefangenen Teil auf andere Teile des Bildes zu übertragen. Die Essenz entspricht der oben erwähnten Pixelmodifikation:

view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
img = cv2.imread("cat.jpg")  
husky = img[1:240,60:270]  
img[61:300,270:480] = husky  
cv2.imshow("img",img)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

image.png

Bildkanäle teilen und zusammenführen

Manchmal müssen wir die B-, G- und R-Kanalbilder separat bearbeiten. In diesem Fall muss das BGR-Bild in einzelne Kanäle unterteilt werden. Müssen Split-Funktion und Merge-Funktion verwendet werden, sind ihre Funktionen Trennung bzw. Zusammenführung:

b, g, r = cv2.split (img) # Split-Bildkanal

img = cv2.merge ((b, g, r))

Diese Operation kann die drei BGR-Kanäle trennen, so dass ein bestimmter Kanal betrieben werden kann. Zum Beispiel setzen wir jetzt alle R-Pixel auf 0:

	view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
img = cv2.imread("cat.jpg")  
b,g,r = cv2.split(img) #拆分图像通道  
img[:,:,2] = 0  
r = img[:,:,2]  
img = cv2.merge((b,g,r))  
cv2.imshow("img",img)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

r ist der R-Kanal, siehe den Effekt:

image.png
Nachdem wir den roten Kanal entfernt hatten, wurde unsere Katze ein bisschen grün. Natürlich können Sie auch mit anderen Kanälen experimentieren.

Bildrandfüllung

Wenn Sie einen Rahmen um das Bild erstellen möchten (z. B. einen Fotorahmen), können Sie die Funktion cv2.copyMakeBorder () verwenden. Es hat mehr Anwendungen in Faltungsoperationen (sehr wichtig), Null-Polsterung usw. Diese Funktion akzeptiert die folgenden Parameter:

cv2.copyMakeBorder (src, oben, unten, links, rechts, borderType [, dst [, value]])

· Src-Eingabebild

· Oben, unten, links, rechts - die Breite des Rahmens in Pixel in der entsprechenden Richtung

· Wert: cv2.BORDER_CONSTANT, cv2.BORDER_REFLECT, cv2.BORDER_REFLECT_101 oder cv2.BORDER_DEFAULT, cv2.BORDER_REPLICATE, cv2.BORDER_WRAP
· Image.png
cv2.BORDER_defLECT_101 oder cv2.BORDER_def | gfedcba

cv.BORDER_REPLICATE - Das letzte Pixel wird während des gesamten Prozesses kopiert, z. B.: aaaaaa | abcdefgh | hhhhhhh

cv.BORDER_WRAP-Pixel-Swap in symmetrischer Richtung ist wie folgt: cdefgh | abcdefgh | abcdefg wie folgt.

Schauen wir uns den Code an:

	view plaincopy to clipboardprint?
import cv2  
from matplotlib import pyplot as plt  
  
BLUE = [255,0,0]  
  
img1 = cv2.imread('cat.jpg')  
  
replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)  
reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT)  
reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101)  
wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP)  
constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE)  
  
plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')  
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')  
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')  
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')  
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')  
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')  
  
plt.show()  

Experimenteller Effekt:
Fügen Sie hier eine Bildbeschreibung ein

Experimente mit allen fünf Parametern können offensichtliche Unterschiede erkennen. Natürlich verwenden wir zur Vereinfachung des Bildvergleichs und der Anzeige die Matplotlib-Bibliothek, aber dies gehört zum Wissen über Python, daher werde ich sie hier nicht vorstellen. Sie können den Code auch ändern und OpenCV verwenden, um andere Parameter auszugeben.

Zeigen Sie die Artikelzusammenfassungsseite https://blog.csdn.net/weixin_44237705/article/details/107864965 an

Weitere technische Informationen zu openvino können in der Gruppe ~ ausgetauscht werden
Fügen Sie hier eine Bildbeschreibung ein

Ich denke du magst

Origin blog.csdn.net/weixin_44237705/article/details/108049363
Empfohlen
Rangfolge