OpenCV-Python图像处理:仿射变换详解及案例

仿射变换--getAffineTransform和wrapAffine wrapAffine。 阅读详情
仿射变换博文传送门(带星号的为付费专栏文章):
  1. *图像仿射变换原理1:齐次坐标来龙去脉详解
  2. *图像仿射变换原理2:矩阵变换、线性变换和图像线性变换矩阵
  3. *图像仿射变换原理3:仿射变换类型及变换矩阵详解
  4. *图像仿射变换原理4:组合变换及对应变换矩阵
  5. *图像仿射变换原理5:组合变换矩阵的OpenCV-Python实现
  6. OpenCV-Python图像处理:仿射变换详解及案例
  7. OpenCV-Python仿射变换开发中遇到的坑
  8. openCV仿射变换:getAffineTransform的案例
  9. 为什么称图像旋转、错切、缩放变换是线性变换?
  10. 图像仿射变换:绕点旋转和指定直线依赖轴shear错切变换矩阵
  11. 图像仿射变换shear怎么翻译?剪切、错切、推移哪个译词好?
  12. 仿射变换原理和其OpenCV-Python实现知识汇总
OpenCV-Python图像处理:仿射变换

一、概述

图像几何变换又称为图像空间变换,是各种图像处理算法的基础。它是在不改变图像内容的情况下,对图像像素进行空间几何变换的处理方式。它将一幅图像中的坐标位置映射到另一幅图像中的新坐标位置,其实质是改变像素的空间位置,估算新空间位置上的像素值。

图像的几何变换包括透视变换和仿射变换,透视变换又称为投影变换、投射变换、投影映射,透视变换是将图片投影到一个新的视平面,它是二维(x,y)到三维(X,Y,Z)、再到另一个二维(x’,y’)空间的映射。

仿射变换又称为图像仿射映射,可以认为是透视变换的一种特殊情况,是透视变换的子集,仿射变换是从二维空间到自身的映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间,也就是图像仿射变换等于图像线性变换和平移的组合。

仿射变换包括平移(translation)、旋转(rotation)、缩放(scaling)、错切(shear )四种类型:

  1. 平移和旋转两者的组合不改变图像的大小和形状,只有图像的位置(平移变换)和朝向(旋转变换)发生改变,称之为欧式变换(Euclidean transformation)或刚体变换(rigid transformation),刚性变换是最一般的变换
  2. 缩放又分为等比例缩放(uniform scaling)和非等比例缩放(non-uniform scaling),如果缩放系数为负数,则会叠加翻转(reflection,又翻译为反射、镜像),因此翻转可以看成是特殊的缩放
  3. 欧式变换和等比例缩放保持了图像外观没有变形,因此二者的组合称为相似变换(similarity transformation)
  4. 错切是保持图形上各点的某一坐标值不变,而另一坐标值关于该保持不变坐标值进行线性变换。坐标不变的轴称为依赖轴,其余坐标轴称为方向轴。错切分为水平错切和垂直错切。

二、基本仿射变换矩阵

在《https://blog.youkuaiyun.com/LaoYuanPython/article/details/113788380 图像仿射变换原理3:仿射变换类型及变换矩阵详解》中介绍了包括平移(translation)、旋转(rotation)、缩放(scaling)、错切(shear )四种类型仿射变换的变换矩阵。

  • 平移变换基本仿射变换矩阵
    在这里插入图片描述

  • 旋转变换基本仿射变换矩阵(θ为顺时针旋转角度)
    在这里插入图片描述

  • 水平错切基本仿射变换矩阵(α为错切角)
    在这里插入图片描述

  • 垂直错切基本仿射变换矩阵(β为错切角)
    在这里插入图片描述

  • 缩放变换基本仿射变换矩阵(kx和ky分布为水平缩放因子和垂直缩放因子)
    在这里插入图片描述

  • 上面介绍的仿射矩阵实际上并不是标准称呼上的仿射矩阵,而是一种用于两个平面间进行透视变换的3*3单应性矩阵,只是单应矩阵对应仿射变换时,最后一行固定为(0,0,1),而真正的仿射矩阵是2*3的矩阵,比单应性矩阵少一行,OpenCV中warpAffine函数使用的矩阵就是2*3的矩阵。

三、仿射变换相关函数介绍

3.1、warpAffine函数

在OpenCV中,仿射变换可以通过函数warpAffine来支持,当然部分单独的函数也可以进行某个特定的变换,如缩放和旋转就有单独的变换函数。

3.1.1、调用语法

warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)

3.1.2、语法说明
  • src:输入图像矩阵
  • M:2*3的仿射变换矩阵,可以自己构建,也可以通过getAffineTransform、getRotationMatrix2D等函数获取
  • dsize:结果图像大小,为宽和高的二元组
  • dst:输出结果图像,可以省略,结果图像会作为函数处理结果输出
  • flags:可选参数,插值方法的组合(int 类型),默认值 INTER_LINEAR,具体取值及含义请参考《https://blog.youkuaiyun.com/LaoYuanPython/article/details/111771138 OpenCV-Python图像处理:插值方法及使用resize函数进行图像缩放》的介绍
  • borderMode:可选参数,边界像素模式(int 类型),默认值 BORDER_CONSTANT,具体取值及含义请参考《https://blog.youkuaiyun.com/LaoYuanPython/article/details/109441709 OpenCV-Python图像处理:腐蚀和膨胀原理及erode、dilate函数介绍》的介绍
  • borderValue:可选参数,边界填充值,当borderMode为cv2.BORDER_CONSTANT时使用,默认值为None。另外当borderMode取值为cv2.BORDER_TRANSPARENT时,目标图像中与源图像中的离群值相对应的像素不被函数修改(关于离群值老猿暂还未完全弄明白,暂且存疑)
  • 返回值:为仿射变换后的结果图像矩阵,最后的结果矩阵每个像素与原图像像素的对应关系为:
    在这里插入图片描述
    如果flags标记设置了WARP_INVERSE_MAP标记,首先使用invertAffineTransform对变换矩阵进行反转即求其逆矩阵,然后将其放入上面的公式中,而不是将M直接放入。例如如果变换矩阵是顺时针旋转30°,则设置WARP_INVERSE_MAP标记的情况下实际变换效果是逆时针旋转30°。这样做的目的是为了已知目标图像和变换方法的情况下,可以求出原图像。所以这个标记很重要
  • 返回值:仿射变换后的结果图像
3.2、getRotationMatrix2D

getRotationMatrix2D用于获取一个旋转二维图像的仿射变换矩阵。

3.2.1、调用语法

getRotationMatrix2D(center, angle, scale)

3.2.2、参数语法说明
  • center:图像旋转的旋转参考中心点坐标二元组
  • angle:旋转角度,坐标原点为左上角情况下正值表示逆时针旋转
  • scale:等比例缩放因子
3.2.3、返回值

getRotationMatrix2D返回值为一2*3复合旋转变换仿射矩阵。按照OpenCV官方介绍,getRotationMatrix2D得到的矩阵为:
在这里插入图片描述

在《https://blog.youkuaiyun.com/LaoYuanPython/article/details/113841635 图像仿射变换原理4:组合变换及对应变换矩阵》中介绍:
绕指定点旋转进行组合变换时,参考点p(m,n)顺时针旋转θ的组合变换的齐次坐标表示公式为:
在这里插入图片描述
上述公式中θ为正表示是顺时针旋转,与getRotationMatrix2D中的angle参数取值方式相反,由于cos(-θ)=cosθ,sin(-θ)=-sinθ,因此实际上getRotationMatrix2D中旋转正值的角度时对应的上述矩阵计算公式中sin函数前面的符号需要取反(正号变副号、副号变正号)。

而缩放的齐次坐标表示公式为:
在这里插入图片描述
用缩放矩阵左乘平移矩阵则可以得到顺时针旋转同时进行缩放的齐次坐标表示公式:
在这里插入图片描述
当等比例缩放且缩放因子等于s时,上述公式中的kx、ky使用s替换。则最后的组合变换矩阵为:
在这里插入图片描述

可以看到,将getRotationMatrix2D的参数angle(逆时针旋转为正)的角度变为上述组合矩阵变换公式中的-θ(顺时针旋转为正)、getRotationMatrix2D中的center.x、center.y分别使用m、n替换,取组合变换矩阵的前2行,则二者结果等价。因此getRotationMatrix2D函数获得的变换矩阵和上述组合变换矩阵连乘的结果相同。

3.3、getAffineTransform函数

getAffineTransform通过确认源图像中不在同一直线的三个点对应的目标图像的位置,来获取对应仿射变换矩阵,从而用该仿射变换矩阵对图像进行统一的仿射变换。

3.3.1、调用语法

retval = cv.getAffineTransform(src, dst)

3.3.1、语法说明
  • src:源图像中三角形顶点的坐标,也就是在源图像中任找不在同一直线上的三个点,将三个点的坐标作为三个元素放到src对应列表中
  • dst:目标图像中相应三角形顶点的坐标,也就是三个点在变换后图像中的坐标列表,要求与源图像三个点一一对应
  • 返回值:从三对对应的点计算出来的仿射变换矩阵

四、案例:图像旋转

4.1、输入图像

图像文件名:f:\pic\dogAndCat.JPG,本图像比较大,所以装入后长和宽等比例缩小50%。
在这里插入图片描述

4.2、部分自定义函数说明

在使用自定义函数构造变换矩阵时,使用了在付费专栏文章《https://blog.youkuaiyun.com/LaoYuanPython/article/details/113879385 图像仿射变换原理5:组合变换矩阵的OpenCV-Python实现》介绍的如下自定义函数:

constructAffineMatrix(rotationAngle=0,xShearAngle=0,yShearAngle=0,translationX=0,translationY=0,scaleX=1,scaleY=1)
    """
    :param rotationAngle: 旋转角度,图像旋转时使用,逆时钟为正、顺时针为负,如顺时针旋转30°,则值为-30
    :param xShearAngle: 水平错切角,水平错切时使用
    :param yShearAngle: 垂直错切角,垂直错切时使用
    :param translationX: x轴平移距离
    :param translationY: y轴平移距离
    :param scaleX: 水平方向缩放因子
    :param scaleY: 竖直方向缩放因子
    :param bTMT: 是否返回3*3矩阵,为False返回2*3矩阵,为True返回3*3矩阵,默认值为False
    :return: 构建的3*3矩阵
    补充说明:
    本函数只能构建旋转、错切、平移、缩放四种情况的一种矩阵,参数只取一种情况进行矩阵构造,
    取的情况按照旋转、错切、平移、缩放从高到低的优先级排列,高优先级的值非0则低优先级的值忽略。
    如果返回的矩阵为3*3矩阵,如果该矩阵立即调用warpAffine进行仿射变换,需要通过切片方式取前2行传入warpAffine,如果需要与其他仿射矩阵相乘,则必须保持3*3矩阵,相乘的结果再进行切片处理,因为两个2*3的矩阵之间没法相乘(矩阵乘法要求第一个矩阵的列数等于第二个矩阵的行数)
    """

matrixMultiply(*mList)#矩阵连乘函数,将输入的n个矩阵按从左到右方式相乘,返回结果矩阵

了解相关知识根据函数的说明自己实现以上函数并不难,且该部分仅在自定义实现仿射矩阵时需要,对仿射矩阵原理不感兴趣的可以忽略。

4.3、图像旋转案例

下面代码将图像读入后每按键一次在当前位置再逆时针旋转5°。使用两种方式实现,一种是直接使用OpenCV函数getRotationMatrix2D构建仿射矩阵,示例代码为函数rotationByOpenCVMat,一种是使用自定义函数构建仿射矩阵,示例代码为函数myrotation。

4.3.1 示例代码
def myrotation(imgfile):
    img = cv2.imread(imgfile)

    img = cv2.resize(img, None,fx=0.5, fy=0.5)
    cv2.putText(img, 'https://blog.youkuaiyun.com/LaoYuanPython', (100, 158), fontFace=cv2.FONT_HERSHEY_SIMPLEX,fontScale=0.5, color=(255, 0, 0))
    cv2.imshow('srcimg', img)
    rows,cols,c = img.shape
    #求原图像中心点
    centerX = int(cols/2)
    centerY = int(rows/2)

    angle = 0 #初始角度
    incAngle = 5 #每次增加角度
    factor = 1  # 目标图像缩放因子,为了应对可能变换后图像范围扩大的情况如放到图像,为1表示不扩大
    edge = int(sqrt(cols*cols+rows*rows)*factor) #目标图像边长设置为矩形的对角线长度,为了应对矩形绕中心旋转变换后图像范围扩大的情况


    destCenter = int(edge / 2) #获取目标图像中心点
    M1 = constructAffineMatrix(translationX=-1*centerX, translationY=-1 * centerY) #构建参考点(图像中心)平移到原点的平移矩阵
    M3 = constructAffineMatrix(translationX=destCenter, translationY=destCenter) #构建参考点移动到目标图像中心位置的反向平移矩阵

    flag = cv2.INTER_LINEAR #| cv2.WARP_INVERSE_MAP# | cv2.WARP_FILL_OUTLIERS

    while True:
        #复合变换矩阵 = 反向平移矩阵M3*旋转矩阵M2*平移矩阵M1
        M2 = constructAffineMatrix(rotationAngle=angle)  #构建基础旋转矩阵
        M4 = np.matmul(M2,M1) #平移矩阵乘旋转矩阵
        M = np.matmul(M3, M4) #再乘反向平移矩阵
        M = matrixMultiply(M3,M2,M1) #构建复合旋转矩阵
        dst1 = cv2.warpAffine(img, M[0:2], (edge,edge), flags=flag) #复合旋转变换
        dst2= cv2.warpAffine(img, M2[0:2], (edge, edge), flags=flag) #基本旋转变换

        cv2.imshow('rotationAndTranslation', dst1)
        cv2.imshow('rotationOnly', dst2)
        ch = cv2.waitKey(0)
        if ch == 27:break
        angle = (angle + incAngle) % 360  # 图像角度每次增加incAngle
    cv2.destroyAllWindows()

def rotationByOpenCVMat(imgfile):
    img = cv2.imread(imgfile)
    img = cv2.resize(img,None,fx=0.5,fy=0.5)
    cv2.putText(img, 'https://blog.youkuaiyun.com/LaoYuanPython', (100, 158), fontFace=cv2.FONT_HERSHEY_SIMPLEX,fontScale=0.5, color=(255, 0, 0))

    rows, cols, c = img.shape
    # 求原图像中心点
    centerX = int(cols / 2)
    centerY = int(rows / 2)
    factor = 1  # 目标图像缩放因子,为了应对可能变换后图像范围扩大的情况如放到图像
    edge = int(sqrt(cols * cols + rows * rows) * factor)  # 目标图像边长设置为矩形的对角线长度,为了应对矩形绕中心旋转变换后图像范围扩大的情况,为1表示不扩大
    destCenter = int(edge/2)
    angle = 0  # 初始角度
    incAngle = 5  # 每次增加角度

    flag = cv2.INTER_LINEAR

    while True:
        M = cv2.getRotationMatrix2D((centerX,centerY),angle,1)  # 构建复合旋转矩阵
        dst = cv2.warpAffine(img, M, (edge,edge), flags=flag)  # 复合旋转变换

        cv2.imshow('rotationUsinggetRotationMatrix2D', dst)
        ch = cv2.waitKey(0)
        if ch == 27: break
        angle = (angle + incAngle) % 360  # 图像角度每次增加incAngle
    cv2.destroyAllWindows()



rotationByOpenCVMat(r'f:\pic\dogAndCat.JPG')
myrotation(r'f:\pic\dogAndCat.JPG')

由于图像是长方形的,以图像为中心的旋转过程会导致图像内容超出图像大小,因此在上述代码中将目标图像设置为了正方形,边长为原图像的对角线长度。

4.3.2、执行效果
  • 使用rotationByOpenCVMat执行后效果
    按键触发图像旋转,如下动图所示:

在这里插入图片描述

  • 使用myrotation执行后绕目标图像中心旋转效果

在这里插入图片描述

  • 使用myrotation执行后绕坐标原点旋转效果
    在这里插入图片描述
从上述三张动图对比可以看出:
  • rotationByOpenCVMat虽然放大了目标图像,但图像的内容并没有移动到目标图像的中间,导致放大后旋转还是有图像丢失,而使用myrotation执行后通过控制结果图像平移到目标图像中心,可以达到绕目标图像中心旋转且旋转过程中不丢失图像内容
  • 使用myrotation执行后绕坐标原点旋转时,图像在旋转时可能完全超出目标图像范围导致不可见
  • myrotation是顺时针旋转,rotationByOpenCVMat是逆时针旋转

五、案例2:任选三个点放大选定区域

详细案例请见《https://blog.youkuaiyun.com/LaoYuanPython/article/details/113924512 openCV仿射变换:getAffineTransform的案例》的介绍。

六、小结

本节介绍了仿射变换的概念、类型、基本仿射变换矩阵、OpenCV-Python与仿射变换相关的主要函数及语法说明,并提供了两种不同方式实现的图像旋转和任选三个点将圈定子图放大的示例。通过阅读相关内容可以有助于大家理解仿射变换的概念和仿射变换的OpenCV-Python实现方法。

七、后记

仿射变换涉及一些基础知识的理解如齐次坐标、变换矩阵,对于熟悉线性代数的人理解起来很容易,但对于未学过或者象老猿这种学过又还给老师的人来说则理解很困难,为此老猿花了40余天时间温习了部分线性代数知识,并查找各种资料,结合自己的理解写了如下仿射变换原理的博文:

  1. https://blog.youkuaiyun.com/LaoYuanPython/article/details/113743213 图像仿射变换原理1:齐次坐标来龙去脉详解
  2. https://blog.youkuaiyun.com/LaoYuanPython/article/details/113804210 图像仿射变换原理2:矩阵变换、线性变换和图像线性变换矩阵
  3. https://blog.youkuaiyun.com/LaoYuanPython/article/details/113788380 图像仿射变换原理3:仿射变换类型及变换矩阵详解
  4. https://blog.youkuaiyun.com/LaoYuanPython/article/details/113841635 图像仿射变换原理4:组合变换及对应变换矩阵
  5. https://blog.youkuaiyun.com/LaoYuanPython/article/details/113879385 图像仿射变换原理5:组合变换矩阵的OpenCV-Python实现

这些仿射变换原理方面的博文浓缩了仿射变换相关的基础知识,可以使得完全不了解仿射变换的人员理解仿射变换的基本原理和具体应用矩阵的构建,不过相关知识发布在了付费专栏,感兴趣的同仁可以订阅后阅读。

更多图像处理的介绍请参考专栏《OpenCV-Python图形图像处理 https://blog.youkuaiyun.com/laoyuanpython/category_9979286.html》和《https://blog.youkuaiyun.com/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》相关文章。

更多图像处理的数学基础知识请参考专栏《人工智能数学基础 https://blog.youkuaiyun.com/laoyuanpython/category_10382948.html》

写博不易,敬请支持:

如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

如果对文章内容存在疑问,可以在博客评论区留言,或关注:老猿Python 微信公号发消息咨询。

参考资料:

  1. [Python图像处理] 六.图像缩放、图像旋转、图像翻转与图像平移
  2. [Python图像处理] 三十六.OpenCV图像几何变换万字详解(平移缩放旋转、镜像仿射透视)

关于老猿的付费专栏

  1. 付费专栏《https://blog.youkuaiyun.com/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.youkuaiyun.com/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
  2. 付费专栏《https://blog.youkuaiyun.com/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.youkuaiyun.com/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
  3. 付费专栏《https://blog.youkuaiyun.com/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《https://blog.youkuaiyun.com/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《https://blog.youkuaiyun.com/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录 》
  4. 付费专栏《https://blog.youkuaiyun.com/laoyuanpython/category_10762553.html Python爬虫入门 》站在一个互联网前端开发小白的角度介绍爬虫开发应知应会内容,包括爬虫入门的基础知识,以及爬取优快云文章信息、博主信息、给文章点赞、评论等实战内容。

前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.youkuaiyun.com/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.youkuaiyun.com/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

跟老猿学Python!

☞ ░ 前往老猿Python博文目录 https://blog.youkuaiyun.com/LaoYuanPython ░
OpenCV-Python实战(4)——OpenCV常见图像处理技术,网易程序员面试题 Python崛起并且风靡,因为优点多、应用领域广、被大牛们认可。学习 Python 门槛很低,但它的晋级路线很多,通过它你能进入机器学习、数据挖掘、大数据,CS等更加高级的领域。Python可以做网络应用,可以做科学计算,数据分析,可以做网络爬虫,可以做机器学习、自然语言处理、可以写游戏、可以做桌面应用…Python可以做的很多,你需要学好基础,再选择明确的方向。这里给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助! 阅读详情

相关推荐

getPerspectiveTransform通过4对点确认透视变换矩阵的原理分析

本文分析了OpenCV-Python中getPerspectiveTransform通过4对点确认透视变换矩阵的原理,有助于大家理解透视变换相关知识。

老猿Python 6214

狗狗变形记:任选4点的投影变换warpPerspective OpenCV-Python案例

本节介绍了使用OpenCV-Python的getPerspectiveTransform函数,通过4个源图像的点映射到目标图像的四角对应点得到投影变换的变换矩阵,然后使用warpPerspective进行投影变换,可以对选择4个点进行投影变换的步骤有清晰的理解。

老猿Python 1万+

OpenCV 几何图像变换模块 - getAffineTransform 函数

在上面的代码中,我们首先定义了源图像上的三个点的坐标和目标图像上对应的三个点的坐标。本文将重点介绍 OpenCV 中的 getAffineTransform 函数,该函数用于计算从三个点的源图像坐标到目标图像坐标的仿射变换矩阵。getAffineTransform 函数在计算机视觉和图像处理中具有广泛的应用,它为我们提供了一种方便的方式来实现图像的仿射变换操作。通过合理地选择源图像上的点和目标图像上对应的点,我们可以实现各种不同的图像变换效果。运行上述代码,你将看到原图像和变换后的图像在窗口中显示出来。

bug_code702的博客 816

getAffineTransform函数

getAffineTransform函数 函数作用: 主要用于生成仿射变换矩阵 一个任意的仿射变换都能表示为 乘以一个矩阵 (线性变换) 接着再 加上一个向量 (平移). 综上所述, 我们能够用仿射变换来表示: 旋转 (线性变换)平移 (向量加)缩放操作 (线性变换) 你现在可以知道, 事实上, 仿射变换代表的是两幅图之间的 关系 . 我们通常

qq_18343569的博客 1万+

OpenCV-Python图像处理:仿射变换深入解析及应用实例

在图像处理中,仿射变换是一种重要的技术,它可以通过对图像进行旋转、缩放、平移等操作,来实现对图像的形变和变换。2)cv2.warpAffine(src, M, dst, flags=INTER_LINEAR),该函数用于对原始图像进行仿射变换,并输出变换后的图像。1)cv2.getAffineTransform(src, dst),该函数用于获取从原始图像到目标图像的仿射变换矩阵M。(4)利用cv2.warpPerspective函数对原始图像进行透视变换,并输出变换后的图像。(1)读取原始图像。

PixelShadeZ的博客 589

[Python图像处理] 十二.图像几何变换之图像仿射变换、图像透视变换和图像校正

该系列文章是讲解Python OpenCV图像处理知识,主要讲解图像入门、OpenCV基础用法。前面的第六篇文章讲解了图像缩放、图像旋转、图像翻转和图像平移的几何变换,本篇文章主要讲解图像仿射变换和图像透视变换,通过Python调用OpenCV函数实。基础性知识希望对您有所帮助。

杨秀璋的专栏 1万+

【OpenCV】Python图像处理之仿射变换

仿射变换是一种保持图像平行性和共线性的几何变换,通过线性变换(缩放、旋转、剪切)与平移变换的组合实现。OpenCV提供cv2.warpAffine()函数进行仿射变换,需先构造2×3变换矩阵,其中前2×2子矩阵控制线性变换,最后一列控制平移。常用方法包括三点映射构造矩阵(cv2.getAffineTransform())和手动构造矩阵。仿射变换广泛应用于图像校正、姿态调整、视角变换等场景,其特点是保持平行线变换后仍平行,仅需3个非共线点即可确定变换关系。与透视变换不同,仿射变换不能改变平行线的相交关系。使用

棒棒的皮皮 1563

python之详细图像仿射变换讲解(图像平移、旋转、缩放、翻转),一文就够了,赶紧码住

图像仿射变换仿射变换简介什么是放射变换图像平移公式推导例程演示代码图像平移v2图像旋转利用getRotationMatrix2D实现旋转演示代码利用wrapAffine实现缩放数学原理推导代码演示围绕任意点进行旋转数学原理推导代码演示图像缩放利用resize函数实现缩放 仿射变换简介 什么是放射变换 图像上的仿射变换, 其实就是图片中的一个像素点,通过某种变换,移动到另外一个地方。 从数学上来讲, 就是一个向量空间进行一次线形变换并加上平移向量, 从而变换到另外一个向量空间的过程。 向量空间m : m=(x

左手の明天的博客 3305

【Python图像处理篇】opencv中的仿射变换和透视变换

opencv提供了两个变换函数,cv2.warpAffine和cv2.warpPerspective,使用这两个函数可以实现所有类型的变换。

ZZQ_UESTC的博客 8838

[Python图像处理] 三十六.OpenCV图像几何变换万字详解(平移缩放旋转、镜像仿射透视)

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。前面一篇文章介绍了OpenCV图像处理入门知识、算数逻辑运算与图像融合。这篇文章将介绍图像几何变换,包括:图像平移变换、图像缩放变换、图像旋转变换、图像镜像变换、图像仿射变换和图像透视变换,万字长文整理,希望对您有所帮助。

杨秀璋的专栏 9385

图像仿射变换原理: 仿射变换类型及变换矩阵详解 Python

综上所述,仿射变换是一种常用的图像处理技术,用于对图像进行平移、旋转、缩放和倾斜等几何变换操作。通过Python中的OpenCV库,可以方便地实现图像的仿射变换,并根据具体需求调整变换矩阵来实现不同类型的变换。然后,定义一个2x3的变换矩阵M,其中前两列表示平移向量,最后一列为空。图像处理中的仿射变换是一种常见的技术,用于对图像进行平移、旋转、缩放和倾斜等几何变换操作。通过修改变换矩阵M的参数,可以实现不同类型的仿射变换,如旋转、缩放和倾斜等。其中,tx和ty分别表示在x和y方向上的平移量。

Meta_C的博客 492

OpenCV-Python图形图像处理专栏文章目录

OpenCV-Python setMouseCallback回调函数中图像变量img的传递方法解析 OpenCV-Python图像乘法运算cv2.multiply函数详解及像素值溢出归一化处理 OpenCV-Python图像位与运算bitwise_and函数详解 OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减法的差异对比 OpenCV-Python图像的加法运算cv2.add函数详解 OpenCV-Python图像融合cv2.addWeighted权重加法函数详解 Op

老猿Python 6717

OpenCV-Python仿射变换案例详解与实战

仿射变换是图像处理中最基本的变换之一,它能够在保持图形的”仿射性质”的前提下,对图形进行平移、旋转、缩放、倾斜等操作。在二维空间中,仿射变换可以表示为一个点到另一个点的线性变换后加上一个平移向量。形式上,可以写作:其中,(\mathbf{x})是原始点的坐标,(\mathbf{x’})是变换后点的坐标,(A)是线性变换矩阵,(\mathbf{b})是平移向量。图像拼接技术大致分为三个步骤:1.特征匹配:识别并匹配多张图像之间的相同特征点。2.图像变换。

weixin_42608299的博客 501

TensorFlow+OpenCV图像处理( 二 图像几何变换-镜像、仿射变换、旋转)

文章目录1.6图像镜像1.7图像仿射变换1.8图像旋转 1.6图像镜像 import cv2 import numpy as np img = cv2.imread('lenacolor.png',1) cv2.imshow('src',img) imgInfo = img.shape height = imgInfo[0] width = imgInfo[1] deep = imgInfo[2] newImgInfo = (height*2,width,deep) dst = np.zeros(newIm

qq_951274168的博客 462

DANN实战:用Python手把手教你实现对抗迁移学习(附完整代码)

本文通过Python实战教程,手把手教你实现DANN对抗迁移学习模型,以解决领域偏移问题。文章详细解析了领域对抗神经网络的核心机制,包括梯度反转层和领域判别器的构建,并提供了从数据准备、模型搭建到训练评估的完整代码,帮助开发者快速掌握这一强大的无监督领域自适应技术。

net55的博客 317

分布式推理服务(策略:数据并行、张量并行、流水线并行、专家并行)技术分析

摘要:分布式推理突破单GPU内存和算力限制,支持大模型部署。四种核心策略包括: 数据并行:复制模型拆分数据,提升吞吐但内存效率低; 流水线并行:模型分阶段执行,支持超大模型但存在计算气泡; 张量并行:拆分层内矩阵运算,延迟低但通信开销大; 专家并行:动态激活MoE模型专家,计算高效但路由复杂。实际应用中常组合策略(如3D并行),需权衡模型规模、硬件条件与性能目标。

技术引领业务创新 943

OpenCV简介、导入及图像处理基础方法讲解(图文解释 附源码)

OpenCV简介、导入及图像处理基础方法讲解(图文解释 附源码)

showswoller的博客 3542

深入解析ADC采样电容:从充电误差到LSB精度的关键设计

本文深入解析了ADC采样电容在模数转换中的核心作用,重点探讨了充电时间常数与采样误差的博弈关系。通过推导最小采样时间公式,揭示了精度、速度、源阻抗与内部电容之间的制约关系,并提供了从理论计算到外部驱动电路设计的实战指南,是确保ADC达到LSB精度的关键。

android的专栏 1103

传统CV算法——仿射变换原理及应用

可以理解一下常规的翻转和平移。“线性变换”+“平移” 空间变换中的仿射变换对应着五种变换,平移,缩放,旋转,翻转,错切。而这五种变化由原图像转变到变换图像的过程,可以用仿射变换矩阵进行描述。而这个变换过程可以用一个3*3的矩阵与原图进行相乘得到。 仿射变换(Affine Transformation)其实是另外两种简单变换的叠加:一个是线性变换,一个是平移变换 共线性:若几个点变换前在一条线上,则仿射变换后仍然在一条线上 共线比例不变性:变换前一条线上两条线段的比例,在变换后比例不变 平行性:若两条线变换.

swpucwf的博客 6032

基于STM32设计的计算器(实现基本运算)

当前文章介绍的是STM32+LCD触摸屏设计的一个触摸计算器功能,实现基本的加减乘除,二进制转换显示等功能。LCD屏使用的是3.5寸带触摸屏的显示屏,方便操作屏幕,MCU采用STM32F103ZET6。

8817

YOLOv13涨点改进| CVPR 2026 |独家创新首发、主干改进篇 |利用RIS-PiDiNet主干让YOLOv13更加强大!适合遥感目标检测、小目标检测、旋转目标检测,变化检测,图像分割涨点

🔥本文提出了一种改进的RIS-PiDiNet主干网络,通过引入几何先验构建几何一致性检测器,显著提升了模型在任意方向、结构规则目标场景下的检测性能。包含两个核心模块:S-PDC利用极谐变换的谐波核建模目标结构对称性,RIS-PDC通过SO(2)群平均实现旋转不变性。网络采用基于RIS-block的主干结构并融合轻量级LBP特征,增强了细粒度结构表达能力。实验表明,该方法特别适用于遥感和复杂几何分布场景,能有效提升目标检测的鲁棒性和精度。文章还详细介绍了如何将RIS-PiDiNet集成到YOLOv13框架

Ai缝合怪、助力小伙伴高效发论文 90

OpenCV中仿射变换warpAffined和getRotationMatrix2D ——python

opencv python c++ warpAffine getRotationMatrix2D,旋转平移

大墅哥哥的博客 1189

Spring-AI 第 17 章 - 飞书机器人接入详解

✅ Stream 长连接(官方 SDK)✅ AI 对话(支持工具调用)✅ 消息接收与回复✅ 天气查询✅ 数据库查询✅ 数学计算✅ 事件去重Stream 长连接模式:使用官方 SDK 建立 WebSocket 长连接,服务器主动连接飞书,无需公网 IP消息处理流程:接收消息 → 解析内容 → AI 处理 → 回复用户AI 工具调用:接入 FunctionTools,支持天气、计算、日期、数据库查询等多种工具。

AppBlog.CN全栈架构 210
上一篇: 图像仿射变换原理5:组合变换矩阵的OpenCV-Python实现
下一篇: openCV仿射变换:getAffineTransform的案例
LaoYuanPython
LaoYuanPython 2020年博客之星Top3 2020年博客之星Top3 领域专家: Python技术领域 领域专家: Python技术领域
博客等级 码龄8年 15万+粉丝 1324原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaoYuanPython

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值