函数原型:cv2.resize(src, dst, Size, fx, fy, interpolation)
参数说明:1. src 输入图片 2. dst 输出图片 3.size 输出图片的大小 4. fx、fy:沿水平轴、垂直轴的缩放因子(宽度、高度) 5.插入方式,默认为INTER_LINEAR.
插入方式interpolation有以下几种:
INTER_NEAREST |
最近邻插值 |
INTER_LINEAR |
双线性插值(默认设置) |
INTER_AREA |
使用像素区域关系进行重采样。 |
INTER_CUBIC |
4x4像素邻域的双三次插值 |
INTER_LANCZOS4 |
8x8像素邻域的Lanczos插值 |
代码如下:
def resize_demo(image):
print("Origin size:", image.shape)
# 第一种方法:通过fx,fy缩放因子
res = cv.resize(image, None, fx=1, fy=3, interpolation=cv.INTER_CUBIC) # fx宽 fy高
print("After resize 1 size:", res.shape)
# 第二种方法:直接设置输出图像的尺寸,所以不用设置缩放因子
height,width = image.shape[:2]
res=cv.resize(image,(2*width,2*height),interpolation=cv.INTER_CUBIC)
print("After resize 2 size:", res.shape)
while(1):
cv.imshow('res',res)
cv.imshow('img',image)
if cv.waitKey(1) & 0xFF == 27:
break
注:cv2.resize():要缩小图像,一般推荐使用CV_INETR_AREA(区域插值)来插值;若要放大图像,推荐使用CV_INTER_LINEAR(线性插值).
图像的平移也分为两步:首先定义好图像的平移矩阵,分别指定x方向(宽)和y方向上(高)的平移量tx和ty,平移矩阵(2 X 3)的形式如下:
代码如下:
def move_demo(image):
rows, cols = image.shape[:2]
M = np.float32([[1, 0, 100], [0, 1, 50]]) # M为平移矩阵,100为宽移动的距离,50为高
dst = cv.warpAffine(image, M, (cols, rows)) # 仿射变换函数 (cols, rows):平移后图像的大小
cv.imshow('image', dst)
这个函数可以在任何位置进行旋转变换,它的旋转矩阵为:
这个函数有三个参数:旋转中心,旋转角度,旋转后图像的缩放比例。
然后再使用函数cv2.warpAffine()利用得到的M对原始图像进行变换即可。
代码如下:
def rotation_demo(img):
rows, cols = img.shape[:2]
# 将图像相对于中心旋转90度,而不进行任何缩放。旋转中心,角度,缩放比率
M = cv.getRotationMatrix2D((cols / 2, rows / 2), 90, 1)
dst = cv.warpAffine(img, M, (cols, rows))
cv.imshow('original', img)
cv.imshow('result', dst)
cv.waitKey(0)
cv.destroyAllWindows()
仿射变换,又称仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。仿射变换需要一个M矩阵,但是由于仿射变换比较复杂,一般直接找很难找到这个矩阵,opencv提供了根据变换前后三个点的对应关系来自动求解M的函数,这个函数就是:cv2.getAffineTransform(),参数如下:
然后再使用函数cv2.warpAffine()利用得到的M对原始图像进行变换即可。
代码如下:
def affine_demo(img):
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()
透视变换(Perspective Transformation)是将成像投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping)。
5.1 cv2.getPerspectiveTransform(src, dst)
参数说明:
src:源图像中待测矩形的四点坐标
sdt:目标图像中矩形的四点坐标
返回值:由源图像中矩形到目标图像矩形变换的矩阵 ,得到变换矩阵。
5.2 cv2.warpPerspective(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)
参数说明:
src:输入图像
M:变换矩阵
dsize:目标图像shape
flags:插值方式,interpolation方法INTER_LINEAR或INTER_NEAREST
borderMode:边界补偿方式,BORDER_CONSTANT or BORDER_REPLICATE
borderValue:边界补偿大小,常值,默认为0
作用:进行透视变换。
代码如下:
def perspective_demo(img):
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()