python opencv入门 几何变换(11)

来源:互联网 发布:关于喝酒的网络歌曲 编辑:程序博客网 时间:2024/06/08 14:40

内容来自OpenCV-Python Tutorials 自己翻译整理

目标
移动、旋转、仿射变换等等
cv2.getPerspectiveTransform函数

变换
opencv中有cv2.warpAffine函数和 cv2.warpPerspective函数。上述函数可以实现所有类型的变换cv2.warpAffin参数是2*3的变换矩阵,cv2.warpPerspective函数是3*3的变换矩阵

放缩
放缩仅仅改变图像尺寸。opencv提供的函数cv2.resize()可以实现此功能。图片的尺寸可以手动指定,或者指定缩放因子。可以不同的插值运算方法。在缩放时推荐的插值运算方法是 cv2.INTER_AREA,在扩展时推荐使用v2.INTER_CUBIC(慢)和cv2.INTER_LINEAR。默认情况下改变图像大小的操作使用插值方法是cv2.INTER_LINEAR,可以使用任意一种方法改变图像尺寸。

import cv2import numpy as npimg = cv2.imread('3.jpg')#None为图像尺寸时,fx和fy参数是缩放因子res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)cv2.imshow('q',res)#两倍放大height, width = img.shape[:2]res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)cv2.imshow('p',res)cv2.waitKey(0)

平移
平移就是移动对象位置。如果你知道移动方向(x,y),移动距离是(tx,ty),可以创建如下矩阵。
这里写图片描述
可以将矩阵放进numpy的数组当中,存为np.float32类型,并将其传入cv2.warpAffine() 函数当中。下面例子移动了(100,50)。

import cv2import numpy as npimg = cv2.imread('3.jpg',0)rows,cols = img.shapeM = np.float32([[1,0,100],[0,1,50]])dst = cv2.warpAffine(img,M,(cols,rows))cv2.imshow('img',dst)cv2.waitKey(0)cv2.destroyAllWindows()

第三个参数是输出图像的大小,(宽,高),分别对应列数和行数

旋转
旋转矩阵如下:
这里写图片描述
在opencv中可以在任意位置旋转,所以矩阵如下
这里写图片描述

opencv提供了cv2.getRotationMatrix2D函数来实现旋转矩阵
下图对图片旋转90度,没进行放缩(图片略)

import cv2import numpy as npimg = cv2.imread('6.jpg',0)rows,cols = img.shapeM=cv2.getRotationMatrix2D((cols/2,rows/2),90,1)dst = cv2.warpAffine(img,M,(cols,rows))cv2.imshow('p',dst)cv2.waitKey(0)

仿射变换
仿射变换中,图中的平行线变换后依然平行。创建仿射变换矩阵需要在图像中找三个点和这三个点在输出图像的位置。使用cv2.getAffineTransform函数创建仿射变换矩阵,矩阵2*3,矩阵会被传递给cv2.warpAffine函数

import cv2import numpy as npfrom matplotlib import pyplot as pltimg = cv2.imread('7.jpg')rows,cols,ch = img.shapepts1 = 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(122),plt.imshow(dst),plt.title('Output')plt.show()

这里写图片描述

透视变换
透视变换需要3*3的矩阵,透视变换后直线还是直线,建立透视矩阵需要在图像上找4个点和在输出图像上的对应位置,四个点任意三个不能共线cv2.getPerspectiveTransform() 构建矩阵,并将矩阵传递到函数cv2.warpPerspective

import cv2import numpy as npfrom matplotlib import pyplot as pltimg = cv2.imread('7.jpg')rows,cols,ch = img.shapepts1 = 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(122),plt.imshow(dst),plt.title('Output')plt.show()

这里写图片描述
产生近大远小的效果

原创粉丝点击