涉及函數cv2.getPerspectiveTransform,cv2.warpAffine和cv2.warpPersperctive
1.擴展縮放
只是改變圖像的尺寸大小,cv2.resize()可以實現這個功能。在縮放時推薦cv2.INTER_AREA,在拓展時推薦cv2.INTER_CUBIC(慢)和cv2.INTER_LINEAR。默認情況下所有改變圖像尺寸大小的操作使用的是插值法都是cv2.INTER_LINEAR。
~~~
import cv2
img = cv2.imread('45.jpg')
#下面的None本應該是輸出圖像的尺寸,但是因為后面我們設置了縮放因子,所以,這里為None
res = cv2.resize(img,None,fx=2,fy=2,interpolation=cv2.INTER_CUBIC)
#or
#這里直接設置輸出圖像的尺寸,所以不用設置縮放因子
height , width =img.shape[:2]
res = cv2.resize(img,(2*width,2*height),interpolation=cv2.INTER_CUBIC)
while(1):
cv2.imshow('res',res)
cv2.imshow('img',img)
if cv2.waitKey(1)&0xFF == 27:
break
cv2.destroyAllWindows()
~~~
2.平移
如果想要沿(x,y)方向移動,移動的距離為(tx,ty)可以以下面方式構建移動矩陣。

可以使用Numpy數組構建矩陣,數據類型是np.float32,然后傳給函數cv2.warpAffine()
函數cv2.warpAffine() 的第三個參數的是輸出圖像的大小,它的格式
應該是圖像的(寬,高)。應該記住的是圖像的寬對應的是列數,高對應的是行數。
3.旋轉
對一個圖像旋轉角度θ,需要使用下面的旋轉矩陣。

但OpenCVC允許在任意地方進行旋轉,所以矩陣應該為

其中α = scale · cos θ
為構建旋轉矩陣,OpenCV提供了一個函數cv2.getRotationMatrix2D。
~~~
import cv2
img = cv2.imread('45.jpg',0)
rows,cols=img.shape
#這里的第一個參數為旋轉中心,第二個為旋轉角度,第三個為旋轉后的縮放因子
#可以通過設置旋轉中心,縮放因子以及窗口大小來防止旋轉后超出邊界的問題。
M=cv2.getRotationMatrix2D((cols/2,rows/2),45,0.6)
#第三個參數是輸出圖像的尺寸中心
dst=cv2.warpAffine(img,M,(2*cols,2*rows))
while(1):
cv2.imshow('img',dst)
if cv2.waitKey(1)==27:
break
cv2.destroyAllWindows()
~~~
4.仿射變換
在仿射變換中,原圖中所有平行線在結果圖像中同樣平行。為創建這個矩陣,需要從原圖像中找到三個點以及他們在輸出圖像中的位置,然后cv2.getAffineTransForm()會創建一個2X3的矩陣。最后這個矩陣會被傳給函數cv2.warpAffine()
~~~
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread(''draw.png')
rows,cols,ch = img.shape
pts1 = np.float32([50,50],[200,50],[50,200])
pts2 = np.float32([10,100],[200,50],[100,250])
#行,列,通道數
M = cv2.getAffineTransform(pts1,pts2)
dst = cv2.warpAffine(img,M,(cols,rows))
plt.subplot(121,plt.imshow(img),plt.title('Input'))
plt.subplot(121,plt.imshow(img),plt.title('output'))
plt.show()
~~~
5.透視變換
對于視角變換,我們需要一個3x3變換矩陣。在變換前后直線還是直線。需要在原圖上找到4個點,以及他們在輸出圖上對應的位置,這四個點中任意三個都不能共線,可以有函數cv2.getPerspectiveTransform()構建,然后這個矩陣傳給函數cv2.warpPerspective()
~~~
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('sudokusmall.png')
rows,cols,ch=img.shape
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
M=cv2.getPerspectiveTransform(pts1,pts2)
dst=cv2.warpPerspective(img,M,(300,300))
plt.subplot(121,plt.imshow(img),plt.title('Input'))
plt.subplot(121,plt.imshow(img),plt.title('Output'))
plt.show()
~~~