OpenCV Grundlagen der Bildverarbeitung
OpenCV bietet umfangreiche Funktionen für Bildverarbeitung und Computer Vision, einschließlich Bildeinlesen, Anzeige, Farbraumkonvertierung, Filterung, Kantenerkennung, Konturerkennung und mehr.
In diesem Kapitel stellen wir die grundlegenden Konzepte und gängigen Funktionen von OpenCV vor.
Bilddarstellung und -verarbeitung
OpenCV verwendetNumPy-Arrays, um Bilddaten darzustellen. Jedes Bild ist ein mehrdimensionales Array, wobei jedes Element einem Pixel im Bild entspricht. Die Größe und der Farbmodus des Bildes können auch durch die Form des Arrays dargestellt werden.
Grundlegende Eigenschaften eines Bildes:
- Bildgröße (Breite, Höhe): kann sein
img.shapeermittelt werden. - Farbkanäle (Kanäle): normalerweise RGB (drei Kanäle) oder Graustufen (ein einzelner Kanal).
- Datentyp (Datentyp): häufig sind
uint8(0-255-Bereich), kann auchfloat32oder andere.
Ein Bild lesen:
import cv2
img = cv2.imread('image.jpg')
cv2.imread()Liest die Bilddatei und gibt ein NumPy-Array zurück.Wenn der Bildpfad falsch ist oder die Datei nicht existiert, wird zurückgegeben
None。
Ein Bild anzeigen:
# 显示图像
cv2.imshow("Display Window", image)
# 等待按键输入
cv2.waitKey(0)
# 关闭所有窗口
cv2.destroyAllWindows()cv2.imshow()wird zum Anzeigen des Bildes verwendet,cv2.waitKey(0)wartet auf ein Tastenereignis,cv2.destroyAllWindows()schließt alle Fenster.
Ein Bild speichern:
# 保存图像
cv2.imwrite("output_image.jpg", image)
cv2.imwrite()Speichert das Bild unter dem angegebenen Pfad.
Grundlegende Bildoperationen
1. Zugriff auf und Ändern von Pixelwerten
# 获取像素值 (BGR 格式) pixel_value = image[100, 100] # 获取 (100, 100) 处的像素值 # 修改像素值 image[100, 100] = [255, 255, 255] # 将 (100, 100) 处的像素设置为白色
2. Bild-ROI (Region of Interest)
# 获取 ROI roi = image[50:150, 50:150] # 获取 (50,50) 到 (150,150) 的区域 # 修改 ROI image[50:150, 50:150] = [0, 255, 0] # 将 ROI 区域设置为绿色
3. Aufteilen und Zusammenführen von Bildkanälen
# 分离通道 b, g, r = cv2.split(image) # 合并通道 merged_image = cv2.merge([b, g, r])
4. Skalierung, Rotation, Translation und Spiegelung von Bildern
# 缩放 resized_image = cv2.resize(image, (new_width, new_height)) # 旋转 rotation_matrix = cv2.getRotationMatrix2D((center_x, center_y), angle, scale) rotated_image = cv2.warpAffine(image, rotation_matrix, (width, height)) # 平移 translation_matrix = np.float32([[1, 0, tx], [0, 1, ty]]) # tx, ty 为平移距离 translated_image = cv2.warpAffine(image, translation_matrix, (width, height)) # 翻转 flipped_image = cv2.flip(image, flip_code) # flip_code: 0 (垂直翻转), 1 (水平翻转), -1 (双向翻转)
Arithmetische Bildoperationen
1. Bildaddition
result = cv2.add(image1, image2)
2. Bildsubtraktion
result = cv2.subtract(image1, image2)
3. Bildüberblendung
result = cv2.addWeighted(image1, alpha, image2, beta, gamma)
alphaundbetasind die Gewichte,gammaist ein Skalarwert.
Bildschwellenwertbildung
1. Einfache Schwellenwertbildung
ret, thresholded_image = cv2.threshold(image, thresh, maxval, cv2.THRESH_BINARY)
threshist der Schwellenwert,maxvalist der Maximalwert.
2. Adaptive Schwellenwertbildung
thresholded_image = cv2.adaptiveThreshold(image, maxval, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, block_size, C)
3. Otsu-Binarisierung
ret, thresholded_image = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
Bildglättung
1. Mittelwertfilterung
blurred_image = cv2.blur(image, (kernel_size, kernel_size))
2. Gauß-Filterung
blurred_image = cv2.GaussianBlur(image, (kernel_size, kernel_size), sigmaX)
3. Medianfilterung
blurred_image = cv2.medianBlur(image, kernel_size)
4. Bilaterale Filterung
blurred_image = cv2.bilateralFilter(image, d, sigmaColor, sigmaSpace)
Bildfarbräume und Konvertierung
OpenCV unterstützt die Konvertierung zwischen mehreren Farbräumen, wie z. B. von RGB zu Graustufen, HSV usw.
Die Farbraumkonvertierung ist bei vielen Bildverarbeitungsaufgaben sehr wichtig.
Konvertierung von RGB zu Graustufen:
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Konvertierung von BGR zu HSV:
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
Konvertierung von RGB zu YUV:
yuv_img = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
Die Farbraumkonvertierung ist ein grundlegender Vorgang in der Bildverarbeitung und wird für verschiedene Algorithmen und visuelle Effekte verwendet.
Größenänderung und Zuschneiden von Bildern
OpenCV bietet mehrere Möglichkeiten, Bilder zu skalieren und Bildbereiche zuzuschneiden.
Größenänderung eines Bildes:
resized_img = cv2.resize(img, (width, height))
Zuschneiden eines Bildes:
cropped_img = img[y1:y2, x1:x2]
Ein bestimmter Bereich des Bildes kann mithilfe von Slicing-Operationen zugeschnitten werden.
Bildglättung und Rauschunterdrückung (Weichzeichnen)
Bildglättung kann Rauschen reduzieren. Zu den gängigen Weichzeichnungsalgorithmen gehören Gaußscher Weichzeichner, Mittelwert-Weichzeichner usw.
Gaußscher Weichzeichner:
blurred_img = cv2.GaussianBlur(img, (5, 5), 0)
Mittelwert-Weichzeichner:
blurred_img = cv2.blur(img, (5, 5))
Median-Weichzeichner:
blurred_img = cv2.medianBlur(img, 5)
Bildkantenerkennung
Kantenerkennung ist eine gängige Technik der Bildverarbeitung, mit der Kanten in einem Bild erkannt werden. Die am häufigsten verwendete Methode ist die Canny-Kantenerkennung.
Canny-Kantenerkennung:
edges = cv2.Canny(img, 100, 200)
Der Canny-Algorithmus findet Kanten durch Berechnung von Gradienten auf dem Bild und gibt ein binäres Bild zurück, in dem Kanten weiß und andere Bereiche schwarz sind.
Sobel-Operator:
sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=5) sobel_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=5)
Laplace-Operator:
laplacian = cv2.Laplacian(image, cv2.CV_64F)
Morphologische Operationen
Morphologische Operationen werden häufig in der Verarbeitung binärer Bilder verwendet. Häufige Operationen umfassen Erosion, Dilatation, Öffnen, Schließen usw.
Erosion:Verkleinert die weißen Bereiche im Bild.
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) eroded_img = cv2.erode(img, kernel, iterations=1)
Dilatation:Erweitert die weißen Bereiche im Bild.
dilated_img = cv2.dilate(img, kernel, iterations=1)
Öffnungs- und Schließungsoperationen:
- Öffnen (Erosion gefolgt von Dilatation): wird verwendet, um kleine Objekte zu entfernen.
- Schließen (Dilatation gefolgt von Erosion): wird verwendet, um kleine Löcher im Bild zu füllen.
opening_img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) closing_img = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
Bildkonturerkennung
OpenCV bietet leistungsstarke Funktionen zur Konturerkennung, die in Anwendungen wie Objekterkennung und Bildsegmentierung eingesetzt werden können.
Konturen erkennen:
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) _, threshold_img = cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY) contours, _ = cv2.findContours(threshold_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
Konturen zeichnen:
cv2.drawContours(img, contours, -1, (0, 255, 0), 3)
Videoverarbeitung
OpenCV unterstützt auch die Videoverarbeitung. Es kann Videodateien lesen, Videostreams erfassen und Echtzeitverarbeitung durchführen.
Ein Video lesen:
Beispiele
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# Jeden Frame verarbeiten
cv2.imshow('Video', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()