Opencv图像的几何变换

OpenCV提供了两种变换函数,cv2.warpAffine和cv2.warpPerspective,第一个是仿射变换函数,第二个是透视变换函数。第一个接收的参数是2x3的变换矩阵,第二个接收的是3x3变换矩阵。

扩展缩放

扩展缩放只是改变图像的尺寸大小。OpenCV提供的函数cv2.resize()可以实现这个功能,图像的尺寸可以自己手动设置,也可以自己指定缩放因子。
在缩放时,推荐使用cv2.INTER_AREA,在扩展时推荐使用cv2.INTER_CUBIC(慢)和cv2.INTER_LINEAR。默认情况下所用改变图像尺寸大小的操作使用的插值方法都是cv2.INTER_LINEAR.

resize = (“原图”,“输出图像大小”,“插值方法”)
cv2.resize(src, dst, interpolation=cv2.INTER_)

import cv2
img = cv2.imread("C:\\Users\\admin\\Desktop\\backgroud\\brids.jpg", 1)
# cv2.imshow("brids", img)
# cv2.waitKey(0)
# cv2.destroyAllWindows("brids")
resize_img = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_CUBIC)

cv2.imshow('res_brids', resize_img)
cv2.waitKey(0)
cv2.destroyAllWindows("res_brids")

None是不指定输出图像大小,只有缩放因子决定。fx,fy 是缩放因子。大于1放大,小于1缩小。

平移

平移即是将对象换一个位置。如果沿着(x, y)方向移动,移动的距离是(tx, ty),可以用下面的方式构建移动矩阵:
M = [[1 0 tx]
[0 1 ty]]
可以使用Numpy数组构建这个矩阵(数据类型是np.float32),然后把它传给函数cv2.warpAfine().

旋转

import cv2
img = cv2.imread("C:\\Users\\admin\\Desktop\\backgroud\\brids.jpg", 1)
# cv2.imshow("brids", img)
# cv2.waitKey(0)
# cv2.destroyAllWindows("brids")

h, w, _ = img.shape
旋转中心 旋转角度 缩放因子 
M = cv2.getRotationMatrix2D((h/2, w/2), 90, 1)
第三个参数是输出图像的尺寸中心
x_img = cv2.warpAffine(img, M, (2*h, 2*w))
cv2.imshow("x_birds", x_img)
cv2.waitKey(0)
cv2.destroyWindow()

在这里插入图片描述

仿射变换

仿射变换也可以说是“平面变换”或者“二维坐标变换”。
仿射变换是把一个二维坐标转换到另一个二维坐标的过程,转换过程坐标点的相对位置和属性不发生变换,是一个线性变换,该过程只发生旋转和平移。因此,一个平行四边形经过仿射变换后还是一个平行四边形。
仿射变换 = 旋转 + 平移
在这里插入图片描述
仿射变换的矩阵为:
在这里插入图片描述
其中,(x, y)是原图坐标,(x’, y’)是变换后的坐标,m11,m12,m21, m22为旋转量,m13,m23
为平移量。所以仿射变换矩阵实际为23的矩阵。
在OpenCV中实现仿射变换的函数为:
dst = warpAffine(src, M, (cols, rows)
src:输入图像
dst:输出图像
M:2
3的仿射变换矩阵
(cols, rows):输出图像的行数和列数,就是输出图像的大小
例:把一张图片顺时针旋转45°,向左平移200个像素点,向下平移30个像素点。
在这里插入图片描述

import cv2
import numpy as np
img = cv2.imread("C:\\Users\\admin\\Desktop\\backgroud\\brids.jpg", 1)
h, w, _ = img.shape
# 仿射变换矩阵
M = np.array([[np.cos(np.pi/4), -np.sin(np.pi/4), 200], [np.sin(np.pi/4), np.cos(np.pi/4), 30]])
dst = cv2.warpAffine(img, M, (2*h, 2*w))
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

透视变换

透视变换是把一个图像投影到一个新的视平面的过程,这个过程就是:把一个二维坐标系转换为三维坐标系,然后再把三维坐标系投影到新的二维坐标系。这个过程是一个非线性变换过程,一个平行四边形经过透视变换只能得到四边形,但是不平行。
在这里插入图片描述
透视变换的矩阵为:
在这里插入图片描述
其中,(x, y) 是原图坐标,(x’,y’)是变换后的坐标,m11,m12,m21,m22,m31,m32为旋转量,m13,m23,m33为平移量。因为透视变换是非线性的,所以不能齐次表示;透视变换矩阵为3x3.
在OpenCV中,实现透视变换的函数为:
dst = warpPerspective(src, H, (cols, rows))
src:输入图像
dst:输出图像
H:3X3透视变换矩阵
(cols, rows):输出图像的环境行数和列数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值