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 seinimg.shapeermittelt werden.
  • Farbkanäle (Kanäle): normalerweise RGB (drei Kanäle) oder Graustufen (ein einzelner Kanal).
  • Datentyp (Datentyp): häufig sinduint8(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ückgegebenNone。

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

cap = cv2.VideoCapture('video.mp4')
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()
Andere Erweiterungen