縮放 
- import numpy as np
 
 - import cv2 as cv
 
 - img = cv.imread('test.jpg')
 
 - res = cv.resize(img, None, fx=2, fy=2, interpolation=cv.INTER_CUBIC)
 
 - # OR
 
 - height, width = img.shape[:2]
 
 - res = cv.resize(img, (2*width, 2*height), interpolation=cv.INTER_CUBIC)
 
  複製代碼 
 
cv.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) 
dsize:輸出圖片的大小,如果為None,dsize = Size(round(fx*src.cols), round(fy*src.rwos)) 
fx:沿x軸的比例因子,當其等於0時,fx = (double)dsize.width / src.cols 
fy:沿y軸的比例因子,當其等於0時,fy = (double)dsize.height / src.rows 
dsize和fx、fy不能同時為0;當dsize和fx、fy都定義時,以dsize為準 
interpolation:插值方式,預設為cv.INTER_LINEAR;詳見cv::InterpolationFlags 位移- import cv2 as cv
 
 - import numpy as np
 
  
- img = cv.imread('opencv.jpg', 0)
 
 - rows, cols = img.shape
 
 - M = np.float32([[1,0,100], [0,1,50]])
 
 - dst = cv.warpAffine(img, M, (cols+100, rows+50))
 
  
- cv.imshow('img', dst)
 
 - cv.waitKey(0)
 
 - cv.destroyAllWindows()
 
  複製代碼 
M:變換矩陣 
dsize:輸出圖片的大小,格式為(width,height),width=cols,height=rows 位移變換矩陣為: 
python OpenCV 圖片 幾何變形 
 
 
如果知道位移方向(x,y),就是(tx,ty),用np.float32(),建立矩陣,然後傳入cv.warpAffine()函式中。上例為x軸平移100,y軸平移50,(100,50)。 旋轉 
- img = cv.imread('test.jpg', 0)
 
 - rows, cols = img.shape
 
  
- M = cv.getRotationMatrix2D((cols/2, rows/2), 90, 1)
 
 - dst = cv.warpAffine(img, M, (cols, rows))
 
  複製代碼 
旋轉矩陣為: 
python OpenCV 圖片 幾何變形 
 
 
OpenCV也提供了縮放旋轉,通過調節旋轉點,你可以在任意你喜歡的位置旋轉,修改旋轉矩陣為下列矩陣: 
python OpenCV 圖片 幾何變形 
 
 
其中 
python OpenCV 圖片 幾何變形 
 
 
OpenCV提供了這個變換矩陣的方法: 
cv.getRotationMatrix2D(center, angle, scale) 
計算出一個二維旋轉的仿射矩陣 
center:旋轉中心座標 
angle:旋轉角度,正值意味著逆時針旋轉,座標原點為左上角 
scale:縮放比例  
 
仿射變換在仿射變換中,原始影象中的所有平行線在輸出影象中仍然是平行的。為了找到變換矩陣,我們需要從輸入影象中得到三個點,以及它們在輸出影象中的對應位置。然後cv.getAffineTransform將會建立一個2x3矩陣,它將被傳遞給cv.warpAffine。 
cv.getAffineTransform(src, dst) 
cv.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) 
下面的示例,並檢視我選擇的點(以綠色表示): - import cv2 as cv
 
 - import numpy as np
 
 - from matplotlib import pyplot as plt
 
  
- img = cv.imread('opencv.jpg')
 
 - rows, cols = img.shape[:2]
 
 - pts1 = np.float32([[50,50], [200,50], [50,200]])
 
 - pts2 = np.float32([[10,100], [200,50], [100,250]])
 
 - M = cv.getAffineTransform(pts1, pts2)
 
 - dst = cv.warpAffine(img, M, (cols, rows))
 
 - plt.subplot(121), plt.imshow(img), plt.title('Input')
 
 - plt.subplot(122), plt.imshow(dst), plt.title('Output')
 
 - plt.show()
 
  複製代碼 
python OpenCV 圖片 幾何變形 
 
  
 
視角轉換視角轉換,需要一個3x3的矩陣。即使在轉換之後,直線仍然是直的。建立這個矩陣,你需要在輸入圖中找四個點,和輸出圖中對應的四個點。在這4個點中,有3個不應該是共線的。然後通過 
cv.getPerspectiveTransform建立矩陣,然後提供給cv.warpPerspective 
cv.getPerspectiveTransform(src, dst) 
cv.warpPerspective(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) 
示例: - import cv2 as cv
 
 - import numpy as np
 
 - from matplotlib import pyplot as plt
 
  
- img = cv.imread('sudoku.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 = cv.getPerspectiveTransform(pts1, pts2)
 
 - dst = cv.warpPerspective(img, M, (300,300))
 
 - plt.subplot(121),plt.imshow(img),plt.title('Input')
 
 - plt.subplot(122),plt.imshow(dst),plt.title('Output')
 
 - plt.show()
 
  複製代碼 
python OpenCV 圖片 幾何變形 
 
  
 
文章出處 
 |