在这一章将要学习图像的移动、旋转,仿射变换等

扩展缩放

我们如果想要改变图像的大小,我们就需要对图像进行扩展缩放,opencv提供给我们控制扩展缩放的函数:

cv2.resize(src, dst, interpolation=CV_INTER_LINEAR)

参数解释:

  • src:进行扩展缩放的原图片
  • dst:可以在此处设置缩放因子,也可手动设置尺寸
  • interpolation:在缩放时我们推荐使用cv2.INTER_AREA, 在扩展时我们推荐使用cv2.INTER_CUBIC(慢) 和 cv2.INTER_LINEAR。 默认情况下所有改变图像尺寸大小的操作使用的插值方法都是cv2.INTER_LINEAR。
import numpy as np
import cv2
img=cv2.imread('D://zopencv//test1.png')
#因为我们此处设置了缩放因子,所以第二个参数为None
img1=cv2.resize(img,None,fx=2,fy=2,interpolation=cv2.INTER_LINEAR)
#直接手动设置尺寸
length=img.shape[0]
width=img.shape[1]
img2=cv2.resize(img,(2*width,2*length),interpolation=cv2.INTER_LINEAR)
img3=cv2.resize(img,None,fx=0.5,fy=0.5,interpolation=cv2.INTER_AREA)
while(1):
    cv2.imshow('image1', img1)
    cv2.imshow('image2', img2)
    cv2.imshow('image3',img3)
    if cv2.waitKey(1)&0xFF==27:
        break
cv2.destroyAllWindows()

平移

使用函数:

cv2.warpAffine()

平移就是将对象换一个位置。如果你要沿(x,y)方向移动,移动的距离 是(tx,ty),你可以以下面的方式构建移动矩阵:

opencv 将图像缩放到指定大小 opencv怎么改变图像大小_缩放


你可以使用 Numpy 数组构建这个矩阵(数据类型是 np.float32),然 后把它传给函数 cv2.warpAffine()。

import numpy as np
import cv2
img=cv2.imread('D://zopencv//test1.png',0)
length,width=img.shape[:2]
m=np.float32([[1,0,10],[0,1,5]])#构造矩阵
img1=cv2.warpAffine(img,m,(width,length))
#函数 cv2.warpAffine() 的第三个参数的是输出图像的大小,它的格式 应该是图像的(宽,高)。应该记住的是图像的宽对应的是列数,高对应的是行 数。
cv2.imshow('image',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

旋转

旋转也需要构建相应的旋转矩阵,但是opencv中简化了,用一个函数即可代替构建旋转矩阵的操作。

cv2.getRotationMatrix2D()

函数接受三个参数

  • 第一个参数为旋转中心
  • 第二个为旋转角度
  • 第三个为旋转后的缩放因子
M=cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
#第三个参数为输出图像的尺寸中心
dst=cv2.warpAffine(img,M,(cols,rows))

仿射变换

仿射变换中,原图中所有的平行线在结果图像中同样平行。为了创建这 个矩阵我们需要从原图像中找到三个点以及他们在输出图像中的位置。然后 cv2.getAffineTransform 会创建一个 2x3 的矩阵,最后这个矩阵会被传给 函数 cv2.warpAffine。 实际上就是从原图选出三个点,我认为最好选三个不在一条线上的点,因为这三个点可以确定一个平面。2*3矩阵第一行是你找的三个点的坐标,第二行是变幻后的三个点坐标。

import cv2 
import numpy as np 
from matplotlib import pyplot as plt
img=cv2.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=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()
代码来自OpenCV用户手册,段立辉译

opencv 将图像缩放到指定大小 opencv怎么改变图像大小_旋转矩阵_02

透视变幻

对于视角变换,我们需要一个 3x3 变换矩阵。在变换前后直线还是直线。 要构建这个变换矩阵,你需要在输入图像上找 4 个点,以及他们在输出图 像上对应的位置。这四个点中的任意三个都不能共线。这个变换矩阵可以有 函数 cv2.getPerspectiveTransform() 构建。然后把这个矩阵传给函数 cv2.warpPerspective。
与仿射变换的办法差不多,二者有相似之处,不过透视变换需要四个点的位置,也就是一个2*4矩阵。

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()
#代码来自opencv用户手册,段立辉译

opencv 将图像缩放到指定大小 opencv怎么改变图像大小_opencv 将图像缩放到指定大小_03