官网参见
https://docs.opencv.org/3.4.1/da/d6e/tutorial_py_geometric_transformations.html
关于变换
opencv提供2个变换函数 cv.warpAffine和cv.warpPerspective,这个2个函数可以实现所有变换。cv.warpAffine的输入是2x3变换矩阵,cv.warpPerspective的输入是3x3变换矩阵。
1.缩放
缩放就是改变图像尺寸。opencv中用cv.resize()实现缩放功能。你可以手工设定图像尺寸,也可以设定缩放比例。有几种不同插值方式(interpolation)可以使用,缩小可以使用 cv.INTER_AREA,放大可以使用cv.INTER_CUBIC(慢)和cv.INTER_LINEAR 。默认插值方式(interpolation)是cv.INTER_LINEAR,它适合所有改变尺寸目的。
resize函数定义如下
dst = cv.resize( src, dsize[, dst[, fx[, fy[, interpolation]]]] )
-
dsize:输出图像的size; 如果设为0,或(0, 0), 计算方式为:
????? = ????(?????(?????.????), ?????(?????.????))
dsize和(fx, fy)必须有一组不为0. 如果都为0,无法确定被resize后的图像大小 -
fx 水平轴缩放因子; 等于0时,计算方式为:
(??????)?????.?????/???.???? -
fy 竖直轴缩放因子; 等于0时,计算方式为:
(??????)?????.??????/???.???? -
interpolation 差值方法, 方法见InterpolationFlags。例如:INTER_CUBIC
例1,缩放图像
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('test.jpg')
#第一种,设置了缩放比例fx和fy,输出图像的尺寸不需要(none)
res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)
#第二种,直接设置输出图像的尺寸,所以不用设置缩放因子
#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种方法可以实现缩放,第一种是利用缩放比例,第二种是指定图像尺寸。
2.平移
平移是物体位置的移动。假设你要按(x,y)方向移动,移动距离为(tx,ty),那么创建变化矩阵如下:
M= [ 1 0 t x 0 1 t y ] \begin{bmatrix} 1 & 0 &t~x~ \\ 0 &1&t~y~ \\ \end{bmatrix} [10