[OpenCV-Python] 9 grundlegende Operationen von Bildern

OpenCV-Python: Kernoperationen

9 Grundfunktionen von Bildern

Ziele
  • Pixelwerte abrufen und ändern
  • Bildattribute (Informationen) abrufen
  • Bild-ROI ()
  • Aufteilen und Zusammenführen
von Bildkanälen Fast alle dieser Vorgänge haben eine engere Beziehung zu Numpy als zu OpenCV, sodass Sie sich mit der Numpy-Hilfe vertraut machen können Wir schreiben leistungsfähigeren Code.
(Die Beispiele werden im Python-Terminal angezeigt, da die meisten nur eine Codezeile enthalten.)

9.1 Pixelwert abrufen und ändern

Zuerst müssen wir ein Bild einlesen:

import cv2
import numpy as np
img=cv2.imread('messi5.jpg')

Sie können den Pixelwert basierend auf den Zeilen- und Spaltenkoordinaten des Pixels abrufen. Für BGR-Bilder ist der Rückgabewert der Wert von B, G, R. Bei Graustufenbildern wird der Graustufenwert (Helligkeit? Intensität) zurückgegeben.

import cv2
import numpy as np
img=cv2.imread('messi5.jpg')
px=img[100,100]
print(px)
blue=img[100,100,0]
print(blue)

Sie können den Pixelwert auf ähnliche Weise ändern.

import cv2
import numpy as np
img=cv2.imread('messi5.jpg')
img[100,100]=[255,255,255]
print(img[100,100])
# [255 255 255]

Warnung: Numpy ist ein optimiertes Softwarepaket für schnelle Matrixoperationen. Daher empfehlen wir nicht, die Pixelwerte einzeln abzurufen und einzeln zu ändern. Dies ist sehr langsam. Verwenden Sie keine Schleifen, wenn Sie Matrixoperationen ausführen können.
Hinweis: Mit der oben genannten Methode wird ein Bereich der Matrix ausgewählt, z. B. die ersten 5 Zeilen und die letzten 3 Spalten. Um den Wert jedes Pixels zu erhalten, ist es möglicherweise besser, Numpys array.item () und array.itemset () zu verwenden. Der Rückgabewert ist jedoch ein Skalar. Wenn Sie alle
Werte von B, G, R erhalten möchten , müssen Sie array.item () verwenden, um sie zu teilen.

Ein besserer Weg, um Pixelwerte zu erhalten und zu ändern.

import cv2
import numpy as np
img=cv2.imread('messi5.jpg')
print(img.item(10,10,2))
img.itemset((10,10,2),100)
print(img.item(10,10,2))

# 59

# 100

9.2 Bildattribute abrufen

Die Attribute des Bildes umfassen: Zeile, Spalte, Kanal, Bilddatentyp, Anzahl der Pixel usw. img.shape kann die Form des Bildes erhalten. Sein Rückgabewert ist ein Tupel, das die Anzahl der Zeilen, Spalten und Kanäle enthält.

import cv2
import numpy as np
img=cv2.imread('messi5.jpg')
print(img.shape)

#(342, 548, 3)

Hinweis: Wenn es sich bei dem Bild um ein Graustufenbild handelt, gibt der Rückgabewert nur die Anzahl der Zeilen und Spalten an. Wenn Sie diesen Rückgabewert überprüfen, können Sie feststellen, ob es sich bei dem geladenen Bild um ein Graustufenbild oder ein Farbbild handelt.
img.size kann die Anzahl der Pixel des Bildes zurückgeben:

import cv2
import numpy as np
img=cv2.imread('messi5.jpg')
print(img.size, img.dtype) # 返回的是图像的数据类型.

# 562248 uint8

# uint8*

Hinweis: img.dtype ist beim Debuggen sehr wichtig. Weil es in OpenCV-Python-Code häufig Inkonsistenzen bei Datentypen gibt.

9.3 Bild-ROI

Manchmal müssen Sie einen bestimmten Bereich eines Bildes bearbeiten. Wenn wir beispielsweise die Position der Augen in einem Bild erkennen möchten, sollten wir zuerst das Gesicht im Bild und dann die Augen im Gesichtsbereich finden, anstatt direkt in einem Bild zu suchen. Dies verbessert die Genauigkeit und Leistung des Programms.
Der ROI wird auch mithilfe der Numpy-Indizierung erzielt. Jetzt wählen wir den Teil des Balls aus und kopieren ihn in andere Bereiche des Bildes.

import cv2
import numpy as np
img=cv2.imread('messi5.jpg')
ball=img[280:340,330:390]
img[273:333,100:160]=ball
img=cv2.imshow('test', img)
cv2.waitKey(0)

Schauen Sie sich die Ergebnisse an:

img

9.4 Bildkanäle teilen und zusammenführen

Manchmal müssen wir die drei BGR-Kanäle getrennt betreiben. Dies ist, was Sie brauchen, um die BGR in einen einzigen Kanal aufzuteilen. Manchmal müssen Sie die Bilder unabhängiger Kanäle zu einem BGR-Bild zusammenführen. Du kannst das:

import cv2
import numpy as np
img=cv2.imread('/home/duan/workspace/opencv/images/roi.jpg')
b,g,r=cv2.split(img)
img=cv2.merge(b,g,r)

oder:

import cv2
import numpy as np
img=cv2.imread('/home/duan/workspace/opencv/images/roi.jpg')
b=img[:,:,0]

Wenn Sie den Rotkanalwert aller Pixel auf 0 setzen möchten, müssen Sie nicht teilen und dann Werte zuweisen. Sie können die Numpy-Indizierung direkt verwenden, was schneller sein wird.

import cv2
import numpy as np
img=cv2.imread('/home/duan/workspace/opencv/images/roi.jpg')
img[:,:,2]=0

Warnung: cv2.split () ist eine zeitaufwändige Operation. Verwenden Sie es nur, wenn Sie es wirklich brauchen, und versuchen Sie es zu verwenden, wenn Sie die Numpy-Indizierung verwenden können.

9.5 Vergrößern (Füllen) des Bildes

Wenn Sie wie bei einem Fotorahmen einen Rahmen um das Bild erstellen möchten, können Sie die Funktion cv2.copyMakeBorder () verwenden. Dies wird häufig bei Faltungsoperationen oder beim Auffüllen mit Nullen verwendet. Diese Funktion enthält die folgenden Parameter:
  • src-Eingabebild
  • oben, unten, links, rechts die Anzahl der Pixel, die dem Rand entsprechen.
  • borderType, um diesen Randtyp hinzuzufügen, lautet wie folgt:
    -cv2.BORDER_CONSTANT, um einen Rahmen mit konstantem Wert und einer Farbe hinzuzufügen, und der nächste Parameter (Wert) ist erforderlich.
    - Cv2.BORDER_REFLECT Das Spiegelbild des Begrenzungselements. Beispiel: fedcba | abcde-fgh | hgfedcb
    - cv2.BORDER_REFLECT_101 oder cv2.BORDER_DEFAULT ist das gleiche wie oben, jedoch geringfügig geändert. Beispiel: gfedcb | abcdefgh | gfedcba
    - cv2.BORDER_REPLICATE wiederholt das letzte Element. Zum Beispiel: aaaaaa | abcdefgh | hhhhhhh
    - cv2.BORDER_WRAP Ich weiß nicht, was ich sagen
  soll

Um diese Typen besser zu verstehen, lesen Sie bitte das Demo-Programm unten.

import cv2
import numpy as np
from matplotlib import pyplot as plt
BLUE=[255,0,0]
img1=cv2.imread('opencv_logo.png')
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()

Die Ergebnisse sind wie folgt (da Matplotlib zum Zeichnen verwendet wird, werden die Positionen von R und B ausgetauscht. In OpenCV wird es von BGR und in Matplotlib von RGB angeordnet):

img
Für weitere Informationen beachten Sie bitte das offizielle Konto:
img

Ich denke du magst

Origin blog.csdn.net/yegeli/article/details/113405701
Empfohlen
Rangfolge