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

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

一、缩放

可以指定缩放系数,也可以手动指定缩放大小。使用不同的插值方法。优选的插值方法是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()

在这里插入图片描述

三、旋转

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

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

在这里插入图片描述
透视变换效果图
透视变换前
透视变换后

四、仿射变换

仿射变换是一种二维坐标到二维坐标之间的线性变换,它保持了二维图形的“平直性”(直线经过变换之后依然是直线)和“平行性”(二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变)。任意的仿射变换都能表示为乘以一个矩阵(线性变换),再加上一个向量 (平移) 的形式。
在这里插入图片描述

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

在这里插入图片描述

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),也实现了线性变换和平移,第三行用于实现透视变换;
在这里插入图片描述

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

在这里插入图片描述

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.]]
  • 3
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值