# OpenCV-Python Tutorials - 4.2. 图像的几何变换

OpenCV-Python教程 专栏收录该内容
30 篇文章 1 订阅

## OpenCV-Python Tutorials(4.0.0)

OpenCV-Python Tutorials官方英文教程
GitHub：中文翻译

## 目标

• 将不同的几何变换应用于图像，如平移，旋转，仿射变换
• 学习函数：cv.getPerspectiveTransform

## 转换

OpenCV提供了两个转换函数cv.warpAffinecv.warpPerspective，你可以使用它们进行各种转换。cv.warpAffine采用2x3变换矩阵作为参数输入，而cv.warpPerspective采用3x3变换矩阵作为参数输入。

## 缩放

import numpy as np
import cv2 as cv

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)


## 平移

M = [ 1 0 t x 0 1 t y ] M= \begin{bmatrix} 1&amp;0&amp;t_x\\ 0&amp;1&amp;t_y \end{bmatrix}

import numpy as np
import cv2 as cv

rows,cols = img.shape

M = np.float32([[1,0,100],[0,1,50]])
dst = cv.warpAffine(img,M,(cols,rows))

cv.imshow('img',dst)
cv.waitKey(0)
cv.destroyAllWindows()


## 旋转

M = [ c o s Θ − s i n Θ s i n Θ c o s Θ ] M=\begin{bmatrix} cos\Theta &amp;-sin\Theta\\ sin\Theta &amp; cos\Theta \end{bmatrix}

OpenCV提供了可调旋转中心的缩放旋转，这样你可以在你喜欢的任何位置进行旋转。修正的变换矩阵由下式给出：

[ α β ( 1 − α ) ⋅ c e n t e r . x − β ⋅ c e n t e r . y − β α β ⋅ c e n t e r . x ( 1 − α ) ⋅ c e n t e r . y ] \begin{bmatrix} \alpha &amp; \beta &amp; \left ( 1-\alpha \right )\cdot center.x-\beta \cdot center.y \\ -\beta &amp; \alpha &amp; \beta \cdot center.x\left ( 1-\alpha \right )\cdot center.y \end{bmatrix}

α = s c a l e ⋅ c o s Θ \alpha = scale\cdot cos\Theta

β = s c a l e ⋅ s i n Θ \beta = scale\cdot sin\Theta

img = cv.imread('messi5.jpg',0)
rows,cols = img.shape

M = cv.getRotationMatrix2D((cols/2,rows/2),90,1)
dst = cv.warpAffine(img,M,(cols,rows))


## 仿射变换

img = cv.imread('drawing.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 = 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()


## 透视变换

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')


• 0
点赞
• 0
评论
• 0
收藏
• 打赏
• 扫一扫，分享海报

04-23 303

03-23 903
04-12
06-24 179
09-13 6718
07-16

hpuhjl

¥2 ¥4 ¥6 ¥10 ¥20

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、C币套餐、付费专栏及课程。