今天要介紹影像的縮放、旋轉。這些操作都會用到一個基礎公式,叫做仿射轉換公式(Affine Transformation)。
其中,T稱為仿射轉換矩陣。根據T的不同就會進行不同的影像操作。
影像縮放(Image Scaling)是最基礎簡單的影像處理技術,縮放比例可以是整數或浮點數。定義如下:
其中和稱為縮放比,通常兩者是相同的,以避免數位影像變形。
OpenCV提供影像縮放涵式:
cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
各別參數說明如下:
以下程式為將一張圖片根據使用者輸入的縮放比例放大:
import numpy as np
import cv2
img1 = cv2.imread("D:\Desktop\IThome\lena.bmp", -1)
nr,nc = img1.shape[:2]
scale = eval(input("Please enter scale:"))
nr2 = int(nr * scale)
nc2 = int(nc * scale)
img2 = cv2.resize(img1, (nr2,nc2), interpolation = cv2.INTER_NEAREST)
img3 = cv2.resize(img1, (nr2,nc2), interpolation = cv2.INTER_LINEAR)
cv2.imshow("Original", img1)
cv2.imshow("After", img2)
cv2.imshow("Second", img3)
cv2.waitKey()
cv2.destroyAllWindows()
在這個範例中,根據使用者輸入的scale參數,對原始圖片進行resize,且分別使用不同的內插法,結果如下:
最左邊為原圖,中間為使用最鄰近內插放大兩倍,右邊為使用雙線性內插放大兩倍。
可以發現右邊的效果最好。而最鄰近內插的效果較差,馬賽克區塊較多。因此在數位影像的幾何轉換,雙線性內插法較為實用。
影像旋轉是非常典型的轉換方法,定義如下:
![https://ithelp.ithome.com.tw/upload/images/20220912/20152370XuLsdmU2B9.png](https://ithelp.ithome.com.tw/upload/images/20220912/20152370XuLsdmU2B9.png)
由於這個公式的旋轉中心為原點(0,0),然而數位影像的原點在左上角,因此在實際過程中會將旋轉中心移至影像中心,且影像在旋轉後,部分區域可能會超出原本範圍。
程式碼如下:
import numpy as np
import cv2
img1 = cv2.imread("D:\Desktop\IThome\lena.bmp", -1)
nr2,nc2 = img1.shape[:2]
rotation_matrix = cv2.getRotationMatrix2D((nc2 / 2, nr2 / 2), 30, 1)
img2 = cv2.warpAffine(img1, rotation_matrix,(nc2, nr2))
cv2.imshow("Original", img1)
cv2.imshow("After", img2)
cv2.waitKey()
cv2.destroyAllWindows()
首先先定義影像中心為旋轉中心,以角度30度逆時針旋轉,接著呼叫OpenCV的仿射轉換涵式,即可取得旋轉後的數位影像,結果如下圖:
詳細程式碼可到我的Github找到喔!
那麼今天到這告一段落,謝謝大家!