python学opencv|读取图像(三十)使用cv2.getAffineTransform()函数倾斜拉伸图像

【1】引言

前序已经学习了如何平移和旋转缩放图像,相关文章链接为:

python学opencv|读取图像(二十七)使用cv2.warpAffine()函数平移图像-CSDN博客

python学opencv|读取图像(二十八)使用cv2.getRotationMatrix2D()函数旋转缩放图像-CSDN博客

在此基础上,我们尝试倾斜拉伸图

【2】核心代码

前序学习进程中,已经知晓平移图像的核心代码是设置M矩阵,使其按照两行三列的形式,通过改变第三列的值来移动图像:

此时的M矩阵有两个可选变量x和y:

M=\[1,0,x,

0,1,y],

当x>0,图像向右移动x大小的位置;当y>0,图像向右下移动y大小的位置;当x和y取负值时图像分别向左和向上运动。

当我们想旋转图像时,需要调用一个cv2.getRotationMatrix2D()函数来实现旋转,通过定义旋转中心,旋转角度和缩放倍数实现旋转和缩放目标。

Mat cv::getRotationMatrix2D ( Point2f center, #旋转中心,需要提前定义好

double angle, #旋转角度

double scale ) #缩放倍数

而当我们想倾斜拉伸图像时,是根据图像的坐标点来操作的:

输入图像有四个顶角;

取三个顶角的点坐标即可知晓图像大小;

给出新的三个坐标点,替换之前取到的三个坐标点,即可倾斜拉伸图像。

具体调用的函数为:cv2.getAffineTransform(p1,p2)。

点击下述链接,直达函数官网教程:

OpenCV: Geometric Image Transformations

在这里会看到对函数的详细介绍,非常简单,函数里练得输入是两个集合,每个集合由三个坐标点组成。

【3】代码测试

首先是引入模块和完成初始图像的读取:

python 复制代码
import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块

# 读取图片
src = cv.imread('srcm.png')

然后先读取原图想的三个点:

python 复制代码
#设置点
rows=len(src) #读取图像行数
cols=len(src[0]) #读取图像列数
p1=np.zeros((3,2),np.float32) #32位浮点型全0矩阵
p1[0]=[0,0] #第一点
p1[1]=[cols-1,0] #第二点
p1[2]=[0,rows-1] #第三点

再设置新的三个点:

python 复制代码
p2=np.zeros((3,2),np.float32) #32位浮点型全0矩阵
p2[0]=[100,0] #新的第一点
p2[1]=[cols-1,0] #新的第二点
p2[2]=[0,rows-1] #新的第三点

之后通过调用cv2.getAffineTransform(p1,p2)函数,用p2的三个点坐标替换p1的三个点坐标,由此实现图像的倾斜拉伸:

python 复制代码
cv.getAffineTransform(p1,p2)

最后回到cv2.warpAffine()函数实现图像的输出、显示和保存:

python 复制代码
dst=cv.warpAffine(src,M,(cols,rows)) #输出图像
cv.imshow('srcm-qxls', dst)  # 在屏幕展示绘制圆形的效果
cv.imwrite('srcm-qxls.png', dst)  # 保存图像
cv.waitKey()  # 图像不会自动关闭
cv.destroyAllWindows()  # 释放所有窗口

使用的初始图像为:srcm.png

++图1 srcm.png++

代码运行后的输出图像为:

++图2 srcm-qxls.png++

【4】细节说明

这里给出的两组点,其实p11=p21,p12=p22;发生变化的是p10到p20也就是把左上角的顶点往右移动100个像素位置,此时图像会自动保持侧面的边线平行,让右下角的点左移100个像素点。这就是图2所示的模样。

复制代码
p1=np.zeros((3,2),np.float32) #32位浮点型全0矩阵
p1[0]=[0,0] #第一点
p1[1]=[cols-1,0] #第二点
p1[2]=[0,rows-1] #第三点

p2=np.zeros((3,2),np.float32) #32位浮点型全0矩阵
p2[0]=[100,0] #新的第一点
p2[1]=[cols-1,0] #新的第二点
p2[2]=[0,rows-1] #新的第三点

【5】总结

掌握了python+opencv实现图像倾斜拉伸的技巧。

相关推荐
MemoriKu9 小时前
Flutter 相册 APP 视频模态稳定化实战:从视频抽帧、Embedding 元数据到 Android 真机启动修复
android·开发语言·前端·flutter·架构·音视频·embedding
蜂蜜黄油呀土豆9 小时前
Agent 循环:观察、思考、行动(ReAct 入门)
python·ai·大模型·react·js
SilentSamsara9 小时前
特征工程系统方法论:编码、分箱、交互特征与特征选择
开发语言·人工智能·python·机器学习·青少年编程·信息可视化·pandas
财经资讯数据_灵砚智能9 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年6月8日
大数据·人工智能·python·ai·信息可视化·自然语言处理·灵砚智能
morning_judger9 小时前
Agent开发系列(十)-知识库建设(架构总览)
开发语言·人工智能
ch.ju9 小时前
Java程序设计(第3版)第四章——继承的特点
java·开发语言
geovindu9 小时前
python:Coroutines Pattern
开发语言·python·设计模式·协程模式
A.说学逗唱的Coke9 小时前
【运维专题】playbooks保姆级使用指南
运维·开发语言·python
牛油果子哥q9 小时前
【C++运算符重载】C++运算符重载终极精讲:单目/双目/关系/赋值运算符重载、成员与全局重载、重载禁区、底层原理与企业级工程规范
开发语言·c++
AI视觉网奇9 小时前
stl转glb glb缩放
开发语言·3d