opencv-python图像几何变换(缩放、平移、旋转、仿射变换、透视变换)

opencv官方文档:https://docs.opencv.org/3.4.1/da/d6e/tutorial_py_geometric_transformations.html

opencv-python图像几何变换

  • 一、缩放
  • 二、平移
  • 三、旋转
  • 四、仿射变换
      • 1.opencv显示仿射变换前后的图像
      • 2.获取原图像上经仿射变换后的坐标
  • 五、透视变换
      • 1.opencv显示透视变换前后的图像
      • 2.获取原图像上经透视变换后的坐标

一、缩放

可以指定缩放系数,也可以手动指定缩放大小。使用不同的插值方法。优选的插值方法是cv2.INTER_AREA、cv2.INTER_CUBIC(慢)和cv2.INTER_LINEAR。默认情况下,使用的插值方法是cv2.INTER_LINEAR,用于所有调整大小的目的。

import cv2
import numpy as np

img = cv2.imread('messi5.jpg')
# 按比例缩放
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)

二、平移

tx, ty分别为横坐标偏移和纵坐标偏移

import cv2
import numpy as np

img = cv2.imread('messi5.jpg',0)
rows,cols = img.shape

M = 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-python图像几何变换(缩放、平移、旋转、仿射变换、透视变换)_第1张图片

三、旋转

在这里插入图片描述
在这里插入图片描述

import cv2

img = cv2.imread('messi5.jpg',0)
rows,cols = img.shape

# 绕中心点,无缩放逆时针旋转90度
M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
dst = cv2.warpAffine(img,M,(cols,rows))

opencv-python图像几何变换(缩放、平移、旋转、仿射变换、透视变换)_第2张图片
透视变换效果图
opencv-python图像几何变换(缩放、平移、旋转、仿射变换、透视变换)_第3张图片
opencv-python图像几何变换(缩放、平移、旋转、仿射变换、透视变换)_第4张图片

四、仿射变换

仿射变换是一种二维坐标到二维坐标之间的线性变换,它保持了二维图形的“平直性”(直线经过变换之后依然是直线)和“平行性”(二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变)。任意的仿射变换都能表示为乘以一个矩阵(线性变换),再加上一个向量 (平移) 的形式。
opencv-python图像几何变换(缩放、平移、旋转、仿射变换、透视变换)_第5张图片

1.opencv显示仿射变换前后的图像

import cv2
import numpy as np
import matplotlib.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(122),plt.imshow(dst),plt.title('Output')
plt.show()

opencv-python图像几何变换(缩放、平移、旋转、仿射变换、透视变换)_第6张图片

2.获取原图像上经仿射变换后的坐标

import cv2
import numpy as np

pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
M = cv2.getAffineTransform(pts1,pts2)

point = np.matrix(M)*np.matrix([50, 200, 1]).T # [[100.][250.]]
x = new_point[0]
y = new_point[0]
print(x, y) # [[100.]] [[250.]]

五、透视变换

透视变换是将图片投影到一个新的视平面,也称作投影映射。它是二维(x,y)到三维(X,Y,Z),再到另一个二维(x’,y’)空间的映射。相对于仿射变换,它提供了更大的灵活性,将一个四边形区域映射到另一个四边形区域(不一定是平行四边形)。它不止是线性变换.但也是通过矩阵乘法实现的,使用的是一个3x3的矩阵,矩阵的前两行与仿射矩阵相同(m11,m12,m13,m21,m22,m23),也实现了线性变换和平移,第三行用于实现透视变换;
opencv-python图像几何变换(缩放、平移、旋转、仿射变换、透视变换)_第7张图片

1.opencv显示透视变换前后的图像

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('sudoku.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(122),plt.imshow(dst),plt.title('Output')
plt.show()

opencv-python图像几何变换(缩放、平移、旋转、仿射变换、透视变换)_第8张图片

2.获取原图像上经透视变换后的坐标

import cv2
import numpy as np

pts1 = np.float32([[0, 0], [10, 0], [0, 5], [10, 5]])
pts2 = np.float32([[0, 0], [10, 1], [0, 5], [10, 4]])
M = cv2.getPerspectiveTransform(pts1, pts2)
 
tx, ty, tz = np.matrix(M)*np.matrix([10, 0, 1]).T
x = tx/tz
y = ty/tz
print(x, y) # [[10.]] [[1.]]

你可能感兴趣的:(OpenCV,python)