OpenCV+Imutils實現(xiàn)圖像的旋轉(zhuǎn)操作
前言

本文,將描述使用 OpenCV 和 Imutils 圍繞任意點旋轉(zhuǎn)指定角度的圖像所需的步驟。
使用 OpenCV 旋轉(zhuǎn)圖像
使用 OpenCV 旋轉(zhuǎn)圖像:
1.使用 OpenCV 的 imread 函數(shù)加載所需的圖像。
腳本:加載并顯示原始圖像
# 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)導(dǎo)入了 OpenCV 庫并使用 imread 函數(shù)從工作目錄加載了埃菲爾鐵塔的圖像,然后使用 imshow 函數(shù)顯示圖像。
請注意,如果圖像不在工作目錄中,則提供給 imread 函數(shù)的參數(shù)值應(yīng)包含圖像的路徑。
輸出:

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屬性的前兩個值分別返回圖像的高度和寬度。整數(shù)除法用于獲取中心位置的值,因為旋轉(zhuǎn)圖像的函數(shù)只接受整數(shù)值。中心位置值對于圍繞中心旋轉(zhuǎn)圖像很有用。
3.定義一個旋轉(zhuǎn)矩陣以圍繞所需的點和旋轉(zhuǎn)角度旋轉(zhuǎn)圖像。
腳本:定義一個旋轉(zhuǎn)矩陣以將圖像圍繞中心旋轉(zhuǎn) 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函數(shù)(顧名思義)定義了一個二維矩陣,用于根據(jù)傳遞的參數(shù)值旋轉(zhuǎn)圖像。
該函數(shù)采用旋轉(zhuǎn)點參數(shù)(在此示例中,圖像的中心由坐標(centerX , centerY)表示)、以度為單位的旋轉(zhuǎn)角度(在本例中為45度)和浮點值(在本例中為1.0 )指定旋轉(zhuǎn)圖像相對于原始圖像的比例。
我們示例中的1.0比例值將旋轉(zhuǎn)后的圖像縮放為與原始圖像相同的尺寸。較高的比例值會擴大圖像,而較低的值會縮小圖像。
4.根據(jù)旋轉(zhuǎn)矩陣對圖像進行旋轉(zhuǎn),并顯示旋轉(zhuǎn)后的圖像。
腳本:將圖像圍繞中心旋轉(zhuǎn) 45?。
# rotate image
rotated = cv2.warpAffine(image, M, (width, height))
# display image
cv2.imshow("Rotated by 45 Degrees", rotated)
cv2.waitKey(0)旋轉(zhuǎn)矩陣 (M) 被傳遞給cv2.warpAffine函數(shù),該函數(shù)根據(jù)旋轉(zhuǎn)矩陣中指定的值對圖像應(yīng)用旋轉(zhuǎn)。該函數(shù)還將圖像寬度和高度的元組作為參數(shù)。
輸出:

圖像圍繞中心旋轉(zhuǎn) 450。注意圖像是逆時針方向旋轉(zhuǎn)的嗎?我們還可以通過在旋轉(zhuǎn)矩陣中傳遞旋轉(zhuǎn)角度的負值來順時針旋轉(zhuǎn)圖像。
使用 OpenCV 順時針旋轉(zhuǎn)圖像
腳本:
# 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? 旋轉(zhuǎn))作為旋轉(zhuǎn)角度而不是 -90? 的情況。

請注意,圖像以逆時針方向旋轉(zhuǎn),還將圖像比例縮小了一半(通過傳遞 0.5 作為比例值)。
雖然之前已經(jīng)沿中心(centerX, centerY)旋轉(zhuǎn)了圖像,但可以使用前面提到的類似步驟圍繞圖像中的任意點旋轉(zhuǎn)圖像。
圍繞任意點旋轉(zhuǎn)圖像
腳本:將圖像圍繞點 (15, 10) 旋轉(zhuǎn) 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)輸出:

旋轉(zhuǎn)如何切斷圖像的某些部分?我將在本文后面展示如何避免這種情況。
使用 Imutils 旋轉(zhuǎn)圖像
就像移動圖像一樣,Imutils 包提供了使用簡單易用的旋轉(zhuǎn)輔助函數(shù)沿任意點和任意角度旋轉(zhuǎn)圖像的簡單步驟。
腳本:使用 Imutils 將圖像順時針旋轉(zhuǎn) 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)調(diào)用 imutils.rotate函數(shù),通過將圖像和旋轉(zhuǎn)角度作為參數(shù)傳遞,將圖像沿所需方向旋轉(zhuǎn)。
輸出:

就像在前面的圖像中一樣,旋轉(zhuǎn)會切斷圖像的某些部分,雖然這可能在某些用例中是有意的,但我們可以編寫代碼,確保圖像的所有部分仍然在視圖中。
腳本:將圖像旋轉(zhuǎn) 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 輔助函數(shù)而不是旋轉(zhuǎn)函數(shù)來確保圖像的所有部分都在旋轉(zhuǎn)后的圖像中。
總結(jié)
本文展示了使用OpenCV和imutil 包圍繞中心或任何其他任意點以順時針或逆時針方向旋轉(zhuǎn)圖像所需的步驟。還展示了如何旋轉(zhuǎn)圖像以保留完整視圖,而不裁剪任何部分。
到此這篇關(guān)于OpenCV+Imutils實現(xiàn)圖像的旋轉(zhuǎn)操作的文章就介紹到這了,更多相關(guān)OpenCV Imutils圖像旋轉(zhuǎn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中time.sleep(0.001)是否真的只等待1毫秒
這篇文章主要介紹了Python中time.sleep(0.001)是否真的只等待1毫秒,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06
Django中更新多個對象數(shù)據(jù)與刪除對象的方法
這篇文章主要介紹了Django中更新多個對象數(shù)據(jù)與刪除對象的方法,Django是Python重多各色框架中人氣最高的一個,需要的朋友可以參考下2015-07-07
Python的Flask框架與數(shù)據(jù)庫連接的教程
這篇文章主要介紹了Python的Flask框架與數(shù)據(jù)庫連接的教程,是Flask框架學(xué)習(xí)當中的基本知識,需要的朋友可以參考下2015-04-04

