OpenCV实现图像平移、旋转

本文详细介绍了在PythonOpenCV中如何使用cv2.warpAffine和cv2.getRotationMatrix2D进行图像的平移和旋转操作,包括变换矩阵的构造方法和关键参数的解释。通过实例展示了向右下平移和围绕中心点逆时针旋转45度的过程。
摘要由CSDN通过智能技术生成

        旋转平移都要用到cv2.warpAffine(src,M,dsize,flags,mode,value),区别就是构造变换矩阵M的方式不同。平移比较简单可以手动构造。

        旋转我们用到cv2.getROtationMatrix2D(center,angle,scale)构造变换矩阵M.

1.图像平移

        图像是由像素组成的,我们用(x,y)来表示一副图像中像素点所处的位置。假如一个像素点从x0,y0移动到x,y我们可以这样表示:

        \begin{bmatrix} x \\ y \end{bmatrix}=\begin{bmatrix} 1 \quad 0 \\ 0 \quad 1 \end{bmatrix}\begin{bmatrix} x_{0} \\ y _{0} \end{bmatrix}+\begin{bmatrix} \Delta x \\ \Delta y \end{bmatrix}

        但我们目标的是构造一个变化矩阵T来对原图P0进行变化,即如下:

P=T.P_{0}

        因此我们可以构造2*3的变换矩阵如下式:

P=T\cdot P_{0}=\begin{bmatrix} 1 \quad 0 \quad \Delta x \\ 0 \quad 1 \quad \Delta y \end{bmatrix}\begin{bmatrix} x \\ y \\ 1 \end{bmatrix}=\begin{bmatrix} x_{0} +\Delta x \\ y_{0}+\Delta y \end{bmatrix}=\begin{bmatrix} x \\ y \end{bmatrix}

        使用函数cv2.warpAffine(src,M,dsize,flags,mode,value)来进行矩阵变换操作,其中src即我们平移的图像,M为变换矩阵,dsize为输出图像尺寸,flag与resize中的插值算法一致  ,mode边界外推法标志 ,value:填充边界的值。 我们一般只用到前三个参数。

        以向右和向下各平移50个像素为例:

import cv2
import numpy as np

img=cv2.imread(r"C:\Users\86166\Desktop\wallhaven.png")

#图片有点大 先对其 缩放 方便展示
img=cv2.resize(img,None,fx=0.3,fy=0.3)
h,w,ch=img.shape

#平移矩阵  
M=np.float32([[1,0,50],
              [0,1,50]])

new=cv2.warpAffine(img,M,(w,h)) 

cv2.imshow('img',img)
cv2.imshow('new',new)
cv2.waitKey(0)

现象如下,可见图像向 右和向下分别移动了50个像素点。

2.图像旋转

        图像旋转同样需要变换矩阵M,我们可以使用cv2.getROtationMatrix2D(center,angle,scale)函数来得到变换矩阵M.- center:旋转中心点  angle:旋转角度   scale :缩放因子

        这里不对图像旋转的矩阵M进行过多赘述,其原理同 矩阵旋转一样,大家可以查阅线性代数矩阵变换相关知识。

        我们以绕图像中心点旋转45度为例,并且  缩放0.5倍:

import cv2
import numpy as np

img=cv2.imread(r"C:\Users\86166\Desktop\wallhaven.png")

#图片有点大 先对其 缩放 方便展示
img=cv2.resize(img,None,fx=0.3,fy=0.3)
h,w,ch=img.shape

#旋转矩阵   
M=cv2.getRotationMatrix2D((w/2,h/2),45,0.5) #旋转默认为逆时针   


new=cv2.warpAffine(img,M,(w,h)) 

cv2.imshow('img',img)
cv2.imshow('new',new)
cv2.waitKey(0)

现象如下:

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值