图像的仿射变换:cv2.warpaffine()(代码片段)

一只眠羊e 一只眠羊e     2023-01-09     367

关键词:

概述

图像的几何变换主要包括:平移、旋转、缩放、剪切、仿射、透视等。
图像的几何变换主要分为:刚性变换、相似变换、仿射变换和透视变换(投影变换)

  • 刚性变换:平移+旋转
  • 相似变换:缩放+剪切
  • 仿射变换:从一个二维坐标系变换到另一个二维坐标系,属于线性变换。通过已知3对坐标点可以求得变换矩阵
  • 透视变换:从一个二维坐标系变换到一个三维坐标系,属于非线性变换。通过已知4对坐标点可以求得变换矩阵。

仿射变换

仿射变换(Affine Transformation)是指在向量空间中进行一次线性变换(乘以一个矩阵)和一次平移(加上一个向量),变换到另一个向量空间的过程。
仿射变换代表的是两幅图之间的映射关系,仿射变换矩阵为2x3的矩阵,如下图中的矩阵M,其中的B起着平移的作用,而A中的对角线决定缩放,反对角线决定旋转或错切。

原像素点坐标(x,y),经过仿射变换后的点的坐标是T,则矩阵仿射变换基本算法原理:

所以仿射变换是一种二维坐标(x,y)到二维坐标(u,v)之间的线性变换,其数学表达式如下:

这个矩阵是2×3的,但是这会改变原始图像的维度,为此,增加一个维度,构造齐次变换矩阵3×3

这就保持了图像的‘平直性’和‘平行性’。
平直性:直线、圆弧不变
平行性:平行关系不变,直线相对位置不变,但是夹角可能会改变。

opencv实现

仿射变化需要一个转换矩阵,但是由于仿射变换比较复杂,一般很难直接找到这个矩阵,opencv提供了根据源图像和目标图像上三个对应的点来自动创建变换矩阵,矩阵维度为 2x3。
这个函数是:cv2.getAffineTransform(pos1,pos2)
最后这个矩阵会被传给函数 cv2.warpAffine()来实现仿射变换。

import cv2 
import numpy as np 

img = cv2.imread('me.jpg')
height, width = img.shape[:2]

# 在原图像和目标图像上各选择三个点 
mat_src = np.float32([[0, 0],[0, height-1],[width-1, 0]]) 
mat_dst = np.float32([[0, 0],[100, height-100],[width-100, 100]]) 

# 得到变换矩阵 
mat_trans = cv2.getAffineTransform(mat_src, mat_dst) 
# 进行仿射变换 
dst = cv2.warpAffine(img, mat_trans, (width,height)) 

# 显示 
imgs = np.hstack([img,dst]) 
cv2.namedWindow('imgs', cv2.WINDOW_NORMAL) 
cv2.imshow("imgs",imgs) 
cv2.waitKey(0)

opencv图像处理

...p;01ty通过numpy来产生这个矩阵,并将其赋值给仿射函数cv2.warpAffine(). 仿射函数cv2.warpAffine()接受三个参数,需要变换的原始图像,移动矩阵M以及变换的图像大小(这个大小如 查看详情

opencv实现图像的几何变换

...和图像裁剪等。执行这些几何变换的两个关键函数是cv2.warpAffine()和cv2.warpPerspective()。cv2.warpAffine()函数使用以下2x3变换矩阵来变换源图像:cv2.warpPerspective()函数使用以下3x3变换矩阵变换源图像:接下来,我们将了解最常见的几何... 查看详情

几何变换(代码片段)

1、变换OpenCV提供了两个变换函数,cv2.warpAffine和cv2.warpPerspective,使用这两个函数你可以实现所有类型的变换。cv2.warpAffine接收的参数是2×3的变换矩阵,而cv2.warpPerspective接收的参数是3×3的变换矩阵。2、扩展缩放(只是改... 查看详情

opencv完整例程25.图像的平移(代码片段)

...偏移量(Tx,Ty)按上式构造平移变换矩阵MAT,由函数cv2.warpAffine可以计算变换后的平移图像。函数说明:cv2.warpAffine(src,M,dsize[,dst[,flags[,borderMode[,borderValue]]]])→dst函数cv2.warpAffine()通过变换矩阵M对图像src进行仿射 查看详情

如何在不使用 cv2.warpAffine() 的情况下翻译图像? [Python 3 和 OpenCV 4.1]

】如何在不使用cv2.warpAffine()的情况下翻译图像?[Python3和OpenCV4.1]【英文标题】:Howtotranslateanimagewithoutusingcv2.warpAffine()?[Python3andOpenCV4.1]【发布时间】:2020-06-2917:41:06【问题描述】:我正在尝试通过切断左侧的100像素并在右侧添加... 查看详情

opencv图像变换(仿射变换与透视变换)

仿射变换(affinetransform)与透视变换(perspectivetransform)在图像还原、图像局部变化处理方面有重要意义。通常,在2D平面中,仿射变换的应用较多,而在3D平面中,透视变换又有了自己的一席之地。两种变换原理相似,结果也类似,... 查看详情

opencv完整例程24.图像的仿射变换(代码片段)

【OpenCV完整例程】24.图像的仿射变换几何变换的可以分为等距变换、相似变换、仿射变换和投影变换。在很多书籍中把等距变换、相似变换都称为仿射变换,常见的仿射变换包括平移、旋转、缩放、翻转、斜切等方法。等距... 查看详情

对图像的仿射变换

...后面两列表示x,y方向平移下面我们来通过仿射变换来实现图像的平移、缩放、旋转平移:(向X轴方向平移1 查看详情

halcon学习笔记3仿射变换

像素的减少开运算(较少)腐蚀(去除更多)对灰度图像的开运算或腐蚀相当于将灰度图像变暗 像素增加闭运算(较少)膨胀(较多)对灰度图像的闭运算或膨胀相当于将灰度图像变亮 仿射变换 另外一种仿射变换*Th... 查看详情

opencv图像变换原理详解图像平移图像旋转图像缩放(代码片段)

...阵M=cv.getAffineTransform(pts1,pts2)#第三个参数为dst的大小dst=cv.warpAffine(img,M,(cols,rows))plt.subplot(121),plt.ims 查看详情

何为仿射变换(affinetransformation)

...p://www.cnblogs.com/ghj1976/p/5199086.html变换模型是指根据待匹配图像与背景图像之间几何畸变的情况,所选择的能最佳拟合两幅图像之间变化的几何变换模型。可采用的变换模型有如下几种:刚性变换、仿射变换、透视变换和非线形变... 查看详情

图片处理-opencv-3.图像缩放、旋转、翻转、平移

...y[,interpolation]]]])图像旋转主要调用getRotationMatrix2D()函数和warpAffine()函数实现M=cv2.getRotationMatrix2D(旋转中心,旋转度数,scale)rotated=cv2.warpAffine(原始图像,旋转参数,原始图像宽高)dst=cv2.flip(src,flipCode)图像平移首先定义平移矩阵M,再调用... 查看详情

opencv图像平移缩放旋转翻转图像仿射变换(代码片段)

...是x和y方向上平移的距离:图像平移利用仿射变换函数cv.warpAffine()实现实验#图像平移importnumpyasnpimportcv2ascvimg=cv.imread(‘paojie.jpg‘)rows,cols=img.shape[:2]#定义平移矩阵,需要是numpy的float32类型#x轴平移100,y轴平移50M=np.float32([[1,0,100],[0... 查看详情

一文搞懂仿射变换(代码片段)

导读在图像处理中,我们经常需要对图像进行各种操作如平移、缩放、旋转、翻转等,这些其实都是图像的仿射变换。通过本篇文章,你能够知道它们的实现原理以及如何应用它们。仿射变换仿射变换也称仿射投影&#x... 查看详情

利用opencv的仿射变换函数warpaffine()实现图像的亚像素级平移(代码片段)

利用OpenCV的仿射变换函数warpAffine()实现图像的亚像素级平移通常的图像平移,移动的都是整数个单位,比如向右移动8个像素。亚像素级平移,则图像的平移量可以为带小数的量,比如向右移动8.5个像素。利用OpenCV... 查看详情

椭圆面片之间的仿射变换

...:02:47【问题描述】:我是OpenCV的新手,我正在学习做一些图像处理。作为我项目的一部分,我遇到了将椭圆形式的图像补丁变形为目标椭圆的问题。据我了解,我需要计算两个补丁之间的仿射变换,然后将此转换扭曲到目标补丁... 查看详情

仿射变换与透视变换

...为例,实现仿射变换,包括旋转,平移,缩放,剪切,以图像中心为变换中心;仿射变换旋转(逆时针旋转30度)MatM=Mat::eye(3,3,CV_32FC1);floatalpha=PI/6;floattx=0;floatty=0;flo 查看详情

计算计视觉:图片仿射(代码片段)

...目标位置matAffine=cv2.getAffineTransform(matSrc,matDst)dst=cv2.warpAffine(img,matAffine,(width,height))cv2.imshow('demo2',dst)cv2.waitKey(0)2.图片旋转importcv2#图片旋转img=cv2.imread(filename='anqila21.jpg',flags=1)imgInfo=im 查看详情