赞
踩
图像是由像素组成的,我们用(x,y)来表示一副图像中像素点所处的位置。假如一个像素点从x0,y0移动到x,y我们可以这样表示:
但我们目标的是构造一个变化矩阵T来对原图P0进行变化,即如下:
因此我们可以构造2*3的变换矩阵如下式:
使用函数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个像素点。
图像旋转同样需要变换矩阵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)

现象如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。