OpenCV+Imutils實現圖像的旋轉操作

前言 

本文,將描述使用 OpenCV 和 Imutils 圍繞任意點旋轉指定角度的圖像所需的步驟。

使用 OpenCV 旋轉圖像

使用 OpenCV 旋轉圖像:

1.使用 OpenCV 的 imread 函數加載所需的圖像。

腳本:加載並顯示原始圖像

# import required library
import cv2
 
# load image from disk
image = cv2.imread('eiffel_tower.jpg')
 
# display image
cv2.imshow('Original image', image)
cv2.waitKey(0)

導入瞭 OpenCV 庫並使用 imread 函數從工作目錄加載瞭埃菲爾鐵塔的圖像,然後使用 imshow 函數顯示圖像。

請註意,如果圖像不在工作目錄中,則提供給 imread 函數的參數值應包含圖像的路徑。

輸出:

2.獲取圖像的空間維度(高度、寬度、中心坐標)。

腳本:獲取圖像的高度、寬度和中心坐標。

# get the dimensions of the image and calculate the center of the
# image
height, width = image.shape[:2]
centerX, centerY = (width // 2, height // 2)

image.shape屬性的前兩個值分別返回圖像的高度和寬度。整數除法用於獲取中心位置的值,因為旋轉圖像的函數隻接受整數值。中心位置值對於圍繞中心旋轉圖像很有用。

3.定義一個旋轉矩陣以圍繞所需的點和旋轉角度旋轉圖像。

腳本:定義一個旋轉矩陣以將圖像圍繞中心旋轉 45⁰。

# # rotate our image by 45 degrees around the center of the image
 
# get rotation matrix
M = cv2.getRotationMatrix2D((centerX, centerY), 45, 1.0)

cv2.getRotationMatrix2D函數(顧名思義)定義瞭一個二維矩陣,用於根據傳遞的參數值旋轉圖像。

該函數采用旋轉點參數(在此示例中,圖像的中心由坐標(centerX , centerY)表示)、以度為單位的旋轉角度(在本例中為45度)和浮點值(在本例中為1.0 )指定旋轉圖像相對於原始圖像的比例。

我們示例中的1.0比例值將旋轉後的圖像縮放為與原始圖像相同的尺寸。較高的比例值會擴大圖像,而較低的值會縮小圖像。

4.根據旋轉矩陣對圖像進行旋轉,並顯示旋轉後的圖像。

腳本:將圖像圍繞中心旋轉 45⁰。

# rotate image
rotated = cv2.warpAffine(image, M, (width, height))
 
# display image
cv2.imshow("Rotated by 45 Degrees", rotated)
cv2.waitKey(0)

旋轉矩陣 (M) 被傳遞給cv2.warpAffine函數,該函數根據旋轉矩陣中指定的值對圖像應用旋轉。該函數還將圖像寬度和高度的元組作為參數。

輸出:

圖像圍繞中心旋轉 450。註意圖像是逆時針方向旋轉的嗎?我們還可以通過在旋轉矩陣中傳遞旋轉角度的負值來順時針旋轉圖像。

使用 OpenCV 順時針旋轉圖像

腳本:

# rotate the image by 90 degrees in clockwise direction
M = cv2.getRotationMatrix2D((centerX, centerY), -90, 0.5)
rotated = cv2.warpAffine(image, M, (width, height))
cv2.imshow("Rotated by -90 Degrees", rotated)
cv2.waitKey(0)

輸出:

讓我們比較一下如果我們通過 90⁰(逆時針 90⁰ 旋轉)作為旋轉角度而不是 -90⁰ 的情況。

請註意,圖像以逆時針方向旋轉,還將圖像比例縮小瞭一半(通過傳遞 0.5 作為比例值)。

雖然之前已經沿中心(centerX, centerY)旋轉瞭圖像,但可以使用前面提到的類似步驟圍繞圖像中的任意點旋轉圖像。

圍繞任意點旋轉圖像

腳本:將圖像圍繞點 (15, 10) 旋轉 30 度。

# rotate our image around an arbitrary point
M = cv2.getRotationMatrix2D((15, 10), 30, 1.0)
rotated = cv2.warpAffine(image, M, (width, height))
cv2.imshow("Rotated around an  Arbitrary Point", rotated)
cv2.waitKey(0)

輸出:

旋轉如何切斷圖像的某些部分?我將在本文後面展示如何避免這種情況。

使用 Imutils 旋轉圖像

就像移動圖像一樣,Imutils 包提供瞭使用簡單易用的旋轉輔助函數沿任意點和任意角度旋轉圖像的簡單步驟。

腳本:使用 Imutils 將圖像順時針旋轉 30⁰。

# rotate our image around an arbitrary point
M = cv2.getRotationMatrix2D((15, 10), 30, 1.0)
rotated = cv2.warpAffine(image, M, (width, height))
cv2.imshow("Rotated around an  Arbitrary Point", rotated)
cv2.waitKey(0)

調用 imutils.rotate函數,通過將圖像和旋轉角度作為參數傳遞,將圖像沿所需方向旋轉。

輸出:

就像在前面的圖像中一樣,旋轉會切斷圖像的某些部分,雖然這可能在某些用例中是有意的,但我們可以編寫代碼,確保圖像的所有部分仍然在視圖中。

腳本:將圖像旋轉 30⁰,同時確保整個圖像都在視圖中。

# rotate the image by 30 degrees, ensuring the
# entire rotated image still views in the viewing area
rotated = imutils.rotate_bound(image, -30)
cv2.imshow("Rotated Without Cropping", rotated)
cv2.waitKey(0)

輸出:

這次使用 cv2.rotate_bound 輔助函數而不是旋轉函數來確保圖像的所有部分都在旋轉後的圖像中。

總結

本文展示瞭使用OpenCV和imutil 包圍繞中心或任何其他任意點以順時針或逆時針方向旋轉圖像所需的步驟。還展示瞭如何旋轉圖像以保留完整視圖,而不裁剪任何部分。

到此這篇關於OpenCV+Imutils實現圖像的旋轉操作的文章就介紹到這瞭,更多相關OpenCV Imutils圖像旋轉內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: