OpenCV Bild drehen

Ammar Ali 12 April 2022
  1. Verwenden Sie die rotate()-Funktion von OpenCV, um ein Bild in Python zu drehen
  2. Verwenden Sie die warpAffine()-Funktion von OpenCV, um ein Bild in Python zu drehen
OpenCV Bild drehen

In diesem Tutorial wird das Drehen eines Bildes mit den Funktionen rotate() und warpAffine() von OpenCV in Python besprochen.

Verwenden Sie die rotate()-Funktion von OpenCV, um ein Bild in Python zu drehen

Wir können die rotate()-Funktion von OpenCV verwenden, um ein Bild zu drehen. Das erste Argument der Funktion rotate() ist das Bild, das wir drehen möchten. Das zweite Argument gibt an, um wie viel sich das Bild drehen wird und in welche Richtung.

Es gibt nur drei Möglichkeiten, ein Bild mit der Funktion rotate() zu drehen. Wir können das zweite Argument auf cv2.ROTATE_90_CLOKWISE setzen, um das Bild um 90 Grad im Uhrzeigersinn zu drehen.

Mit cv2.ROTATE_180 können wir das Bild um 180 Grad drehen oder spiegeln. Wir können cv2.ROTATE_90_COUNTERCLOCKWISE verwenden, um das Bild um 90 Grad gegen den Uhrzeigersinn oder um 270 Grad im Uhrzeigersinn zu drehen. Dies sind die einzigen drei Winkel, um ein Bild mit der Funktion rotate() zu drehen.

Lassen Sie uns zum Beispiel ein Bild mit der Funktion imread() lesen, es um 90 Grad im Uhrzeigersinn drehen und es dann mit der Funktion imshow() zusammen mit dem Originalbild anzeigen. Siehe Code unten.

import cv2
import numpy as np

image = cv2.imread("cat.jpg")
image_norm = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE)

cv2.imshow("original Image", image)
cv2.imshow("Rotated Image", image_norm)
cv2.waitKey(0)
cv2.destroyAllWindows()

Ausgabe:

Bilder drehen

Mit rotate() können wir ein Bild nur in drei Angular drehen, aber wenn wir ein Bild in jedem Winkel drehen wollen, können wir die unten beschriebene Funktion warpAffine() verwenden.

Verwenden Sie die warpAffine()-Funktion von OpenCV, um ein Bild in Python zu drehen

Wir können die Funktion warpAffine() von OpenCV verwenden, um ein Bild in einem beliebigen Winkel zu drehen. Die Funktion warpAffine() transformiert eine Matrix für eine andere Matrix.

Um ein Bild zu drehen, müssen wir seine Rotationsmatrix mit der Funktion getRotationMatrix2D() von OpenCV finden.

Das erste Argument von getRotationMatrix2D() ist der Mittelpunkt des Bildes, entlang dem wir es drehen wollen. Das zweite Argument ist der Rotationswinkel und das dritte Argument ist der Maßstab des Bildes.

Wenn der Maßstab kleiner als eins ist, wird das Bild kleiner als das Originalbild, oder mit anderen Worten, es wird herausgezoomt. Das Bild wird skaliert oder vergrößert, wenn die Skalierung eine positive Zahl ist. Wenn die Skalierung 1 ist, wird das Bild nicht skaliert.

Das erste Argument der Funktion warpAffine() ist das Bild, das wir drehen möchten. Das zweite Argument ist die Rotationsmatrix und das dritte Argument ist die Größe des Ausgabebildes.

Lassen Sie uns beispielsweise das obige Bild um 45 Grad um seinen Mittelpunkt drehen. Siehe Code unten.

import cv2
import numpy as np

image = cv2.imread("cat.jpg")

(h, w) = image.shape[:2]
center = (w / 2, h / 2)
angle = 30
scale = 1

M = cv2.getRotationMatrix2D(center, angle, scale)
rotated = cv2.warpAffine(image, M, (w, h))

cv2.imshow("original Image", image)
cv2.imshow("Rotated Image", rotated)
cv2.waitKey(0)
cv2.destroyAllWindows()

Ausgabe:

Drehen Sie Bilder mit warpAffine

Im obigen Code haben wir die Shape-Methode verwendet, um die Länge und Breite des angegebenen Bildes zu ermitteln, und dann haben wir die Mitte des Bildes berechnet, indem wir die Hälfte der Länge und Breite genommen haben. Wir können den Mittelpunkt, den Winkel und den Skalierungswert ändern, um das gewünschte Ergebnis zu erhalten.

Wir können auch den Randmodus des Ausgabebildes mit dem Argument borderMode einstellen. Standardmäßig ist der Randmodus auf cv2.BORDER_CONSTANT eingestellt, und wie Sie sehen können, gibt es an den Ecken des Ausgabebildes keinen Rand.

Wir können den Randmodus auf cv2.BORDER_TRANSPARENT setzen. Das Ausgabebild hat die gleichen Ränder wie das Originalbild, oder die Ecken bleiben gleich.

Wir können den Rahmenmodus auf cv2.BORDER_REPLICATE setzen. Der Rand oder die Ecken des Ausgabebildes werden mit den benachbarten Pixeln gezeichnet.

Klicken Sie auf diesen Link, um weitere Einzelheiten über die Rahmenmodi zu erfahren.

Autor: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

Verwandter Artikel - Python OpenCV

Verwandter Artikel - OpenCV Image