幾何變換
幾何變換可以看成圖像中物體(或像素)空間位置改變,或者說是像素的移動。
幾何運算需要空間變換和灰度級差值兩個步驟的算法,像素通過變換映射到新的座標位置,新的位置可能是在幾個像素之間,即不一定爲整數座標。這時就需要灰度級差值將映射的新座標匹配到輸出像素之間。最簡單的插值方法是最近鄰插值,就是令輸出像素的灰度值等於映射最近的位置像素,該方法可能會產生鋸齒。這種方法也叫零階插值,相應比較複雜的還有一階和高階插值。
插值算法感覺只要瞭解就可以了,圖像處理中比較需要理解的還是空間變換。
空間變換
空間變換對應矩陣的仿射變換。一個座標通過函數變換的新的座標位置:
所以在程序中我們可以使用一個2*3的數組結構來存儲變換矩陣:
以最簡單的平移變換爲例,平移(b1,b2)座標可以表示爲:
因此,平移變換的變換矩陣及逆矩陣記爲:
縮放變換:將圖像橫座標放大(或縮小)sx倍,縱座標放大(或縮小)sy倍,變換矩陣及逆矩陣爲:
選擇變換:圖像繞原點逆時針旋轉a角,其變換矩陣及逆矩陣(順時針選擇)爲:
以上部分摘自:https://blog.csdn.net/xiaowei_cqu/article/details/7616044
主要是介紹了下M的含義,爲之下的內容做準備.
import cv2
from math import *
import numpy as np
img = cv2.imread("3-2.jpg")
height,width=img.shape[:2]
degree=45
#旋轉後的尺寸
heightNew=int(width*fabs(sin(radians(degree)))+height*fabs(cos(radians(degree)))) # 這個公式參考之前內容
widthNew=int(height*fabs(sin(radians(degree)))+width*fabs(cos(radians(degree))))
matRotation=cv2.getRotationMatrix2D((width/2,height/2),degree,1)
matRotation[0,2] +=(widthNew-width)/2 # 因爲旋轉之後,座標系原點是新圖像的左上角,所以需要根據原圖做轉化
matRotation[1,2] +=(heightNew-height)/2
imgRotation=cv2.warpAffine(img,matRotation,(widthNew,heightNew),borderValue=(255,255,255))
cv2.imshow("img",img)
cv2.imshow("imgRotation",imgRotation)
cv2.waitKey(0)