python学opencv|读取图像(二十七)使用cv2.warpAffine()函数平移图像
【1】引言
前序已经对图像操作进行了广泛的学习,包括读取、放大缩小,改变BGR通道值等,相关链接包括且不限于:
python学opencv|读取图像-CSDN博客
python学opencv|读取图像(三)放大和缩小图像_python(1)使用opencv读取并显示图像;(2)使用opencv对图像进行缩放;(3)使用o-CSDN博客
python学opencv|读取图像(十四)BGR图像和HSV图像通道拆分-CSDN博客
在此基础上,我们开始学习如何平移图像。
【2】官网教程
要想图像实现平移,需要调用cv2.warpAffine()函数。点击下述链接,直达该函数的官网说明:
OpenCV: Geometric Image Transformations
在官网,我们会看到:
图1
这里的几个参数意义为:
void cv::warpAffine ( InputArray src, #原始输入图像
OutputArray dst, #输出图像
InputArray M, #一个2X3矩阵
Size dsize, #输出图像大小
int flags = INTER_LINEAR, #图像转换插值方式,是可选参数,保持默认即可,不是此次重点
int borderMode = BORDER_CONSTANT, #边界类型,是可选参数,保持默认即可,不是此次重点
const Scalar & borderValue = Scalar() ) #边界值,是可选参数,保持默认即可,不是此次重点
【3】平移原理
要想实现图像平移,需要对M矩阵进行操作。
此时的M矩阵有两个可选变量x和y:
M=[[1,0,x],[0,1,y]],当x>0,图像向右移动x大小的位置;当y>0,图像向右下移动y大小的位置;当x和y取负值时图像分别向左和向上运动。
【4】代码测试
使用的的原始图像src.png为:
图2
先引入模块,把图片读取进来:
import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块
# 读取图片
src = cv.imread('src.png')
rows=len(src) #读取图像行数
cols=len(src[0]) #读取图像列数
然后制定约束平移方向和大小的M矩阵:
M=np.float32([[1,0,50],
[0,1,200]]) #M矩阵,x=50,y=200
然后把M矩阵代入cv2.warpAffine()函数,输出图像:
dst=cv.warpAffine(src,M,(cols,rows)) #输出图像
cv.imshow('src-pingyi', dst) # 在屏幕展示绘制圆形的效果
cv.imwrite('src-pingyi.png', dst) # 保存图像
cv.waitKey() # 图像不会自动关闭
cv.destroyAllWindows() # 释放所有窗口
此时获得的图像为:
图3
由图3可见,图像在x和y方向上进行了不同程度的平移。
【5】总结
掌握了python+opencv实现图像平移的操作技巧。