Python下opencv图像的几何变换

本文介绍了计算机图形学中图像几何变换的基本概念与实现方法,包括平移、缩放、旋转、仿射及透视变换等,详细解释了如何使用OpenCV进行各种变换。
  • 二维与三维图像的几何变换在计算机图形学上有重要的应用,包括现在的许多图像界面的切换、二维与三维游戏画面控制等等都涉及到图像几何变换,就比如说在三维游戏中,控制角色三维移动的时候,画面是要跟着移动的,那么怎么移动,怎么让上一时刻的画面移动到这一时刻,这都是根据了你的移动量,然后找到三维坐标之间的对应关系,用这一时刻的坐标替换到上一时刻的坐标像素值实现图像的切换。
  • 图像的几何变换主要包括:平移、扩大与缩小、旋转、仿射、透视等等。图像变换是建立在矩阵运算基础上的,通过矩阵运算可以很快的找到对应关系。理解变换的原理需要理解变换的构造方法以及矩阵的运算方法,曾经写过matlab下的简单图像变换原理,里面有最基础的构造原理可以看看: 
    matlab之原始处理图像几何变换

(一)图像的平移

下面介绍的图像操作假设你已经知道了为什么需要用矩阵构造才能实现了(上面那个博客有介绍为什么)。那么关于偏移很简单,图像的平移,沿着x方向tx距离,y方向ty距离,那么需要构造移动矩阵: 

M=[1001txty]

通过numpy来产生这个矩阵,并将其赋值给仿射函数cv2.warpAffine(). 
仿射函数cv2.warpAffine()接受三个参数,需要变换的原始图像,移动矩阵M 以及变换的图像大小(这个大小如果不和原始图像大小相同,那么函数会自 动通过插值来调整像素间的关系)。 
一个例子如下:

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

img = cv2.imread('flower.jpg')
H = np.float32([[1,0,100],[0,1,50]])
rows,cols = img.shape[:2]
res = cv2.warpAffine(img,H,(rows,cols)) #需要图像、变换矩阵、变换后的大小
plt.subplot(121)
plt.imshow(img)
plt.subplot(122)
plt.imshow(res)

这里写图片描述

(二)图像的扩大与缩小

图像的扩大与缩小有专门的一个函数,cv2.resize(),那么关于伸缩需要确定的就是缩放比例,可以是x与y方向相同倍数,也可以单独设置x与y的缩放比例。另外一个就是在缩放以后图像必然就会变化,这就又涉及到一个插值问题。那么这个函数中,缩放有几种不同的插值(interpolation)方法,在缩小时推荐cv2.INTER_ARER,扩大是推荐cv2.INTER_CUBIC和cv2.INTER_LINEAR。默认都是cv2.INTER_LINEAR,比如:

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('flower.jpg')
# 插值:interpolation
# None本应该是放图像大小的位置的,后面设置了缩放比例,
#所有就不要了
res1 = cv2.resize(img,None,fx=2,fy=2,interpolation=cv2.INTER_CUBIC)
#直接规定缩放大小,这个时候就不需要缩放因子
height,width = img.shape[:2]
res2 = cv2.resize(img,(2*width,2*height),interpolation=cv2.INTER_CUBIC)
plt.subplot(131)
plt.imshow(img)
plt.subplot(132)
plt.imshow(res1)
plt.subplot(133)
plt.imshow(res2)

这里写图片描述
通过坐标轴可以看到图像扩大了一倍,并且两种方法相同。

(三)图像的旋转

图像的旋转矩阵一般为: 

M=[cos(θ)sin(θ)sin(θ)cos(θ)]

但是单纯的这个矩阵是在原点处进行变换的,为了能够在任意位置进行旋转变换,opencv采用了另一种方式: 
M=[αββα(1α)centerxβcenteryβcenterx+(1α)centery]

为了构造这个矩阵,opencv提供了一个函数: 
cv2.getRotationMatrix2D(),这个函数需要三个参数,旋转中心,旋转角度,旋转后图像的缩放比例,比如下例:

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('flower.jpg')
rows,cols = img.shape[:2]
#第一个参数旋转中心,第二个参数旋转角度,第三个参数:缩放比例
M = cv2.getRotationMatrix2D((cols/2,rows/2),45,1)
#第三个参数:变换后的图像大小
res = cv2.warpAffine(img,M,(rows,cols))

plt.subplot(121)
plt.imshow(img)
plt.subplot(122)
plt.imshow(res)

这里写图片描述

(四)图像的仿射

图像的旋转加上拉升就是图像仿射变换,仿射变化也是需要一个M矩阵就可以,但是由于仿射变换比较复杂,一般直接找很难找到这个矩阵,opencv提供了根据变换前后三个点的对应关系来自动求解M。这个函数是 
M=cv2.getAffineTransform(pos1,pos2),其中两个位置就是变换前后的对应位置关系。输 出的就是仿射矩阵M。然后在使用函数cv2.warpAffine()。形象化的图如下(引用参考的) 
这里写图片描述 
一个例子比如:

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

img = cv2.imread('flower.jpg')
rows,cols = img.shape[:2]
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
M = cv2.getAffineTransform(pts1,pts2)
#第三个参数:变换后的图像大小
res = cv2.warpAffine(img,M,(rows,cols))
plt.subplot(121)
plt.imshow(img)
plt.subplot(122)
plt.imshow(res)

这里写图片描述

(五)图像的透射

透视需要的是一个3*3的矩阵,同理opencv在构造这个矩阵的时候还是采用一种点对应的关系来通过函数自己寻找的,因为我们自己很难计算出来。这个函数是M = cv2.getPerspectiveTransform(pts1,pts2),其中pts需要变换前后的4个点对应位置。得到M后在通过函数cv2.warpPerspective(img,M,(200,200))进行。形象化的图如下(引用参考的) 
这里写图片描述 
一个例子如下:

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

img = cv2.imread('flower.jpg')
rows,cols = img.shape[:2]
pts1 = np.float32([[56,65],[238,52],[28,237],[239,240]])
pts2 = np.float32([[0,0],[200,0],[0,200],[200,200]])
M = cv2.getPerspectiveTransform(pts1,pts2)
res = cv2.warpPerspective(img,M,(200,200))
plt.subplot(121)
plt.imshow(img)
plt.subplot(122)
plt.imshow(res)

这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

### Python OpenCV 图像几何变换教程 在图像处理中,几何变换是改变图像空间属性的一种重要操作。通过几何变换,可以调整图像的位置、大小、方向或形状。PythonOpenCV 库提供了丰富的功能来实现这些几何变换[^2]。 以下是一些常见的几何变换方法及其代码示例: --- #### 1. 平移 平移操作可以通过定义一个平移矩阵来实现。该矩阵指定图像在 x y 方向上的偏移量。 ```python import cv2 import numpy as np # 加载图像 img = cv2.imread('image.jpg') rows, cols = img.shape[:2] # 定义平移矩阵 M = np.float32([[1, 0, 100], [0, 1, 50]]) # x 方向移动 100 像素,y 方向移动 50 像素 # 应用平移 dst = cv2.warpAffine(img, M, (cols, rows)) cv2.imshow('Original', img) cv2.imshow('Translated', dst) cv2.waitKey(0) cv2.destroyAllWindows() ``` --- #### 2. 缩放 缩放操作可以使用 `cv2.resize()` 函数实现。通过指定缩放比例或目标尺寸来调整图像大小。 ```python # 缩放操作 resized_img = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_LINEAR) # 缩小为原来的一半 cv2.imshow('Resized', resized_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` --- #### 3. 旋转 旋转操作需要定义一个旋转矩阵,包含旋转角度缩放因子。 ```python # 定义旋转中心、角度缩放因子 center = (cols // 2, rows // 2) angle = 45 # 逆时针旋转 45 度 scale = 1.0 # 获取旋转矩阵 M = cv2.getRotationMatrix2D(center, angle, scale) # 应用旋转 rotated_img = cv2.warpAffine(img, M, (cols, rows)) cv2.imshow('Rotated', rotated_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` --- #### 4. 仿射变换 仿射变换通过指定输入图像中的三个点及其在输出图像中的对应位置来实现。 ```python # 定义输入输出的三点坐标 pts1 = np.float32([[50, 50], [200, 50], [50, 200]]) pts2 = np.float32([[10, 100], [200, 50], [100, 250]]) # 获取仿射变换矩阵 M = cv2.getAffineTransform(pts1, pts2) # 应用仿射变换 affine_img = cv2.warpAffine(img, M, (cols, rows)) cv2.imshow('Affine', affine_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` --- #### 5. 透视变换 透视变换需要指定输入图像中的四个点及其在输出图像中的对应位置。 ```python # 定义输入输出的四点坐标 pts1 = np.float32([[60, 80], [368, 65], [28, 387], [389, 390]]) pts2 = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]]) # 获取透视变换矩阵 M = cv2.getPerspectiveTransform(pts1, pts2) # 应用透视变换 perspective_img = cv2.warpPerspective(img, M, (300, 300)) cv2.imshow('Perspective', perspective_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` --- #### 安装 OpenCV 如果尚未安装 OpenCV,可以使用以下命令进行安装[^3]: ```bash pip install opencv-contrib-python ``` 或者使用清华镜像源加速安装: ```bash pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python ``` --- ### 总结 上述代码展示了如何使用 OpenCVPython实现图像几何变换。包括平移、缩放、旋转、仿射变换透视变换等常见操作。每种变换都需要定义相应的变换矩阵,并调用对应的 OpenCV 函数[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值