OpenCV几何变换

简介: OpenCV几何变换

       OpenCV 提供了两个变换函数, cv2.warpAffiffiffine cv2.warpPerspective , 使用这两个函数你可以实现所有类型的变换。cv2.warpAffiffiffine 接收的参数是 2 × 3 的变换矩阵,而 cv2.warpPerspective 接收的参数是 3 × 3 的变换矩阵。

1、平移

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

       你可以使用 Numpy 数组构建这个矩阵(数据类型是 np.flfloat32),然 后把它传给函数 cv2.warpAffiffiffine()。看看下面这个例子吧,它被移动了 (100,50)个像素。

import cv2
import numpy as np
 
img = cv2.imread('aier.jpg')
rows,cols = img.shape[:2]
 
# 定义平移矩阵,需要是numpy的float32类型
# x轴平移100,y轴平移50, 2*3矩阵
M = np.float32([[1, 0, 100], [0, 1, 50]])
# 用仿射变换实现平移
img_s = cv2.warpAffine(img, M, (cols, rows), borderValue=(155, 150, 200))

2.旋转

       对一个图像旋转角度 θ , 需要使用到下面形式的旋转矩阵。

       但是 OpenCV 允许你在任意地方进行旋转,但是旋转矩阵的形式应该修改为


       为了构建这个旋转矩阵,OpenCV 提供了一个函数: cv2.getRotationMatrix2D 。 下面的例子是在不缩放的情况下将图像旋转 90 度。

import cv2
import numpy as np
img=cv2.imread('messi5.jpg',0)
rows,cols=img.shape
# 这里的第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子
# 可以通过设置旋转中心,缩放因子,以及窗口大小来防止旋转后超出边界的问题
M=cv2.getRotationMatrix2D((cols/2,rows/2),45,0.6) # 第三个参数是输出图像的尺寸中心
dst=cv2.warpAffine(img,M,(2*cols,2*rows))
cv2.imshow('img',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.仿射变换

       在仿射变换中,原图中所有的平行线在结果图像中同样平行。为了创建这个矩阵我们需要从原图像中找到三个点以及他们在输出图像中的位置。然后 cv2.getAffiffiffineTransform 会创建一个 2 x 3 的矩阵,最后这个矩阵会被传给函数 cv2.warpAffiffiffine 。 来看看下面的例子,以及我选择的点(被标记为绿色的点)。

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

4.透视变换

       对于视角变换,我们需要一个 3 x 3 变换矩阵。在变换前后直线还是直线。 要构建这个变换矩阵,你需要在输入图像上找 4 个点,

以及他们在输出图 像上对应的位置。这四个点中的任意三个都不能共线。这个变换矩阵可以由函数 cv2.getPerspectiveTransform() 构建。然后把这个矩阵传给函数 cv2.warpPerspective

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

20210622171938639.png

相关文章
|
3月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
6月前
|
计算机视觉
opencv之形态变换
opencv之形态变换
|
6月前
|
计算机视觉
OpencV图像几何形状绘制
OpencV图像几何形状绘制
|
6月前
|
算法 计算机视觉
【Qt&OpenCV 图像的形态学变换 morpholgyEx】
【Qt&OpenCV 图像的形态学变换 morpholgyEx】
41 0
|
缓存 API 计算机视觉
OpenCV-实现天空变换(图像分割)
OpenCV-实现天空变换(图像分割)
241 0
|
7月前
|
存储 编解码 算法
【OpenCV】-霍夫变换
【OpenCV】-霍夫变换
|
7月前
|
计算机视觉 Python
轻松掌握opencv的8种图像变换
轻松掌握opencv的8种图像变换
|
7月前
|
计算机视觉
【OpenCV】-仿射变换
【OpenCV】-仿射变换
|
7月前
|
算法 计算机视觉
【OpenCV】仿射变换中cv2.estimateAffine2D 的原理
【OpenCV】仿射变换中cv2.estimateAffine2D 的原理
344 0
|
7月前
|
计算机视觉
OpenCV(二十七):图像距离变换
OpenCV(二十七):图像距离变换
74 0