OpenCV 旋轉影象

Ammar Ali 2023年1月30日
  1. 在 Python 中使用 OpenCV 的 rotate() 函式旋轉影象
  2. 在 Python 中使用 OpenCV 的 warpAffine() 函式旋轉影象
OpenCV 旋轉影象

本教程將討論在 Python 中使用 OpenCV 的 rotate()warpAffine() 函式旋轉影象。

在 Python 中使用 OpenCV 的 rotate() 函式旋轉影象

我們可以使用 OpenCV 的 rotate() 函式來旋轉影象。rotate() 函式的第一個引數是我們要旋轉的影象。第二個引數指定影象將旋轉多少以及哪個方向。

使用 rotate() 函式旋轉影象只有三種方法。我們可以將第二個引數設定為 cv2.ROTATE_90_CLOKWISE 以將影象順時針旋轉 90 度。

我們可以使用 cv2.ROTATE_180 將影象旋轉 180 度或翻轉它。我們可以使用 cv2.ROTATE_90_COUNTERCLOCKWISE 將影象逆時針旋轉 90 度或順時針旋轉 270 度。這是使用 rotate() 函式旋轉影象的僅有的三個角度。

例如,讓我們使用 imread() 函式讀取影象,將其順時針旋轉 90 度,然後使用 imshow() 函式將其與原始影象一起顯示。請參閱下面的程式碼。

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()

輸出:

旋轉影象

使用 rotate(),我們只能在三個角度上旋轉影象,但如果我們想在每個角度上旋轉影象,我們可以使用 warpAffine() 函式,如下所述。

在 Python 中使用 OpenCV 的 warpAffine() 函式旋轉影象

我們可以使用 OpenCV 的 warpAffine() 函式以任意角度旋轉影象。warpAffine() 函式將一個矩陣轉換為另一個矩陣。

要旋轉影象,我們必須使用 OpenCV 的 getRotationMatrix2D() 函式找到其旋轉矩陣。

getRotationMatrix2D() 的第一個引數是我們想要旋轉的影象的中心。第二個引數是旋轉的角度,第三個引數是影象的比例。

如果比例小於 1,則影象的尺寸會比原始影象小,或者說,它會被縮小。如果比例為正數,影象將被縮放或放大。如果比例為 1,則影象不會被縮放。

warpAffine() 函式的第一個引數是我們想要旋轉的影象。第二個引數是旋轉矩陣,第三個引數是輸出影象的大小。

例如,讓我們將上面的影象圍繞其中心旋轉 45 度。請參閱下面的程式碼。

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()

輸出:

使用 warpAffine 旋轉影象

在上面的程式碼中,我們使用 shape 方法求給定影象的長寬,然後通過取一半的長寬來計算影象的中心。我們可以改變中心、角度和比例值來得到想要的結果。

我們還可以使用 borderMode 引數設定輸出影象的邊框模式。預設情況下,邊框模式設定為 cv2.BORDER_CONSTANT,如你所見,輸出影象的角落沒有邊框。

我們可以將邊框模式設定為 cv2.BORDER_TRANSPARENT。輸出影象將具有與原始影象相同的邊框,或者角將保持不變。

我們可以將邊框模式設定為 cv2.BORDER_REPLICATE。將使用附近的畫素繪製輸出影象的邊框或角。

單擊此連結瞭解有關邊框模式的更多詳細資訊。

作者: 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

相關文章 - Python OpenCV

相關文章 - OpenCV Image