仿射变换

图解图像仿射变换

谁都会走 提交于 2020-03-18 17:40:21
一. 原理: 文章参考自: https://www.cnblogs.com/liekkas0626/p/5238564.html 仿射变换(Affine Transformation 或 Affine Map)是一种二维坐标(x,y)到二维坐标(u,v)的线性变换,其数学表达式为: 仿射变换数学表达式 ↑ 对应齐次坐标矩阵 ↑ 仿射变换保持了二维图像的 “平直性”(直线经仿射变换后依然为直线)和 “平行性” (直线之间的相对位置关系保持不变,平行线经仿射变换后依然为平行线,且直线上点的位置顺序不会发生改变)。非共线的三对对应点确定一个唯一的仿射变换。 二. 二维图像仿射变换 图像处理中,可应用仿射变换对二维图像进行平移、缩放、旋转等操作。实例如下: 经仿射变换后,图像关键点依然构成三角形,但三角形形状已经发生变化 ↑ 三. 原子变换 仿射变换通过一系列原子变换复合实现,具体包括:平移(Translation)、缩放(Scale)、旋转(Rotation)、翻转(Flip)和错切(Shear)。 ① 平移图解 ↑ ① 平移原理 ↑ ② 缩放图解 ↑ ② 缩放原理 ↑ ③ 旋转图解 ↑ ③ 旋转原理 ↑ ④ 翻转图解 ↑ ④ 翻转原理 ↑ ⑤ 错切亦称为剪切或错位变换,包含水平错切和垂直错切,常用于物体产生弹性形变时 ↑ ⑤ 错切图解 ↑ ⑤ 错切原理 ↑ 四. 参考内容:   

OpenCV实现仿射变换

老子叫甜甜 提交于 2020-03-11 10:51:32
什么是仿射变换? ¶ 一个任意的仿射变换都能表示为 乘以一个矩阵 (线性变换) 接着再 加上一个向量 (平移). 综上所述, 我们能够用仿射变换来表示: 旋转 (线性变换) 平移 (向量加) 缩放操作 (线性变换) 你现在可以知道, 事实上, 仿射变换代表的是两幅图之间的 关系 . #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> #include <stdio.h> using namespace cv; using namespace std; /// 全局变量 char* source_window = "Source image"; char* warp_window = "Warp"; char* warp_rotate_window = "Warp + Rotate"; /** @function main */ int main( int argc, char** argv ) { Point2f srcTri[3]; Point2f dstTri[3]; Mat rot_mat( 2, 3, CV_32FC1 ); Mat warp_mat( 2, 3, CV_32FC1 ); Mat src, warp_dst,

一文解决!opencv中的仿射变换(仿射变化的原理,使用,提升拓展的总结)

谁都会走 提交于 2020-03-10 00:32:38
仿射变化的原理,使用及相关拓展的总结 仿射变换 仿射变化的原理,使用及相关拓展的总结 前言 简单的例子 原理 提升拓展 flags:插值方法 borderMode:像素外推方法(边界像素模式) borderValue:边界不变时使用的值 结尾 前言 看了下原理计划上榜的文章,没错,我也会写标题了,不过本文内容无愧于题目。给大家详细讲一讲opencv里的仿射变换,也就是 cv2.getAffineTransform 和 cv2.warpAffine 这两个函数。 原本我通常会先写原理,然后再举个简单的例子,之后再举一个复杂点的拓展的例子。为了防止大家一看原理或者数学公式这类东西就跑,我先举个例子,大家理解了就能用,想提升的再往下看就好。 简单的例子 这个例子看懂了,遇到图像仿射变换的需求直接套就行。 我们来变下面这张图: 其中三个圆圈的中心点大概是,红[316,76],黄[215,369],蓝[413,371]。 那么我们把红点往左移,黄和蓝不变。移动后,红[215,76],黄[215,369],蓝[413,371]。 代码如下 #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Mon Mar 9 13:53:38 2020 @author: phoenix """ import cv2 import

图像常用的数学变换

拟墨画扇 提交于 2020-03-07 21:56:03
1.坐标的空间变换 几何变换改变了图像中像素间的空间关系。由两个基本操作组成:坐标的空间变换和变换后灰度插值。 图像处理中常用的坐标变换就是仿射变换,下面截图常见的仿射变换 这些变换通常称为橡皮膜变换。坐标变换可由下式表示: (x,y)=T{(v,w)}。其中(v,w)是原图像中像素的坐标,(x,y)是变换后图像中像素的坐标。常用的仿射变换一般形式如下: ** 这个变换可以把一幅图像上的像素重新定位到一个新位置,为了完成该处理,还必须对这些新位置赋灰度值。 实际上,有两种基本方法来使用(**)式。第一种方法称为前向映射,它由扫描输入图像的像素,并在每个位置(v,w)用(**)式直接计算输出图像中相应像素的空间坐标位置(x,y)组成。前向映射算法的一个问题是输入图像中的两个或更多个像素可被变换到输出图像的同一位置。第二种方法称为反向映射,扫描输出像素的位置,并在每一个位置(x,y)使用 计算输入图像中的相应位置。然后,内插灰度值。 2.灰度插值 2.1 最近邻插值 2.2 双线性插值 2.3 双三次插值 3.傅里叶变换 傅里叶级数 傅里叶积分 傅里叶变换 未完待续... 4.傅里叶变换的基本性质 未完待续... 来源: CSDN 作者: 考研命题组长 链接: https://blog.csdn.net/FeNGQiHuALOVE/article/details/104711199

python-opencv-人脸对齐和反对齐

删除回忆录丶 提交于 2020-03-06 13:59:14
背景描述 我需要将视频中的图像拆帧后对齐到标准人脸上,进行一些算法加工后在反对齐回原始视频里。对齐人脸主要依赖于仿射变换,即根据lmks中的5个关键点(眼睛眉毛)找出仿射变换矩阵,再将原img中的所有像素点变换到标准人脸上,反对齐其实就是把对齐后人脸变换到原img的位置,再做一次仿射变换就可以了。另外以防我以后忘记,记录下变换像素的计算公式:设仿射矩阵为M x = M[0,0]*pixel[0] + M[0,1]*pixel[1] + M[0,2] y = M[1,0]*pixel[0] + M[1,1]*pixel[1] + M[1,2] 人脸对齐 首先你需要先把人脸的lmk提取出来(提取方法可以参考dlib) #计算仿射矩阵 def align ( src_points , dst_points ) : # align dst to src src_points = np . matrix ( src_points . astype ( np . float64 ) ) dst_points = np . matrix ( dst_points . astype ( np . float64 ) ) c1 = np . mean ( src_points , axis = 0 ) c2 = np . mean ( dst_points , axis = 0 ) #print

2D射影几何和变换

梦想的初衷 提交于 2020-02-20 07:57:09
阅读《计算机视觉中的多视图集合》 2D射影几何和变换 2D射影平面 本章的关键是理解线和点的对偶性。从射影平面模型出发,IP^2^内的点(a, b ,c)由IP^3^空间中一条过原点的射线k(x1, x2, x3)^T^表示。点采用的是齐次坐标表示,具有相同比例,不同缩放因子的表示都是同一个点,就像射线也可以用同比例,不同缩放因子的向量表示一样。 射影变换projectivity 射影映射 ,也叫 保线变换 ,或者 射影变换 ,或者 单应(homography) ,都是同义词,其性质是保线性,即 直线变换之后还是直线 。 可以用一个 8 自由度的三维 非奇异矩阵H 表示。 只需要4个任意三点不共线的点即可以求得射影变换H,然后求得逆矩阵H^-1^即可以消除射影变换H带来的变化。 透视变换 ,也即 中心投影 ,是 射影变换 的一种,它的特点是:连接对应的直线 共点 。透视变换的复合不再是透视变换,但还会是射影变换。 如果有一个射影变换H,点 x 变换之后为 Hx ,那么在同样的变换下,直线 I 变换为 H^-T^I 。我们称点的变换为 逆变 ,线的变换为 协变 。 变换的层次 如下表,下层的都是上层变化的特例。 另外还有一个 透视变换perspectivity ,它是射影变换的一个特例,与仿射变换affine的区别: 透视变换可以用于把3D变成2D,而仿射变换都是2D平面

Python 9. OpenCV 仿射变换

流过昼夜 提交于 2020-01-31 10:17:48
import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('pic3.PNG') cv2.imshow('img', img) cv2.waitKey(0) cv2.destroyAllWindows() rows, cols = img.shape[:2] pts1 = np.float32([[50, 50], [200, 50], [50, 200]]) pts2 = np.float32([[10, 100], [200, 50], [100, 250]]) M = cv2.getAffineTransform(pts1, pts2) dst = cv2.warpAffine(img, M, (cols, rows)) plt.subplot(121), plt.imshow(img), plt.title('Input') plt.subplot(122), plt.imshow(dst), plt.title('Output') plt.show() 来源: CSDN 作者: qq_36071362 链接: https://blog.csdn.net/qq_36071362/article/details/104110313

仿射变换(Affine Transformation)

旧街凉风 提交于 2020-01-31 05:10:35
仿射变换(Affine Transformation) 变换模型是指根据待匹配图像与背景图像之间几何畸变的情况,所选择的能最佳拟合两幅图像之间变化的几何变换模型。可采用的变换模型有如下几种:刚性变换、仿射变换、透视变换和非线形变换等,如下图: 参考: http://wenku.baidu.com/view/826a796027d3240c8447ef20.html 其中第三个的仿射变换就是我们这节要讨论的。 仿射变换(Affine Transformation) Affine Transformation是一种二维坐标到二维坐标之间的线性变换,保持二维图形的“平直性”(译注:straightness,即变换后直线还是直线不会打弯,圆弧还是圆弧)和“平行性”(译注:parallelness,其实是指保二维图形间的相对位置关系不变,平行线还是平行线,相交直线的交角不变。)。 c和d的区别可以看下图: 仿射变换可以通过一系列的原子变换的复合来实现,包括:平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和剪切(Shear)。 仿射变换可以用下面公式表示: 参考: http://wenku.baidu.com/view/826a796027d3240c8447ef20.html 这个矩阵乘法的计算如下: 具体到二维的仿射变换的计算如下:

opencv for python仿射变换

那年仲夏 提交于 2020-01-18 03:58:34
使用cv2.wrapAffine()进行仿射变换 result = wrapAffine(img,M,dsize) 参数解释: result:输出图片 img:输入图片 M:转换矩阵,共计六个参数,M11,M12,M13,M21,M22,M23 对应:out=(M11 x+M12 y+M13,M12 x+M22 y+M23) 通过上式进行仿射变换 dsize:输出图像大小,通常先使用 .shape方法获得 仿射变换的关键是获取变换矩阵M 示例: import numpy as np from cv2 import cv2 lena = cv2 . imread ( 'black.bmp' ) #先行再列,多少行对应的是height #多少列对应的是width width , height = lena . shape [ : 2 ] #出来的dx和dy必须是整数 lena_1 = cv2 . resize ( lena , dsize = ( int ( width * 2 ) , int ( height * 2 ) ) ) #水平翻转,正数水平,负数竖直,0为水平加竖直 lena_2 = cv2 . flip ( lena_1 , flipCode = 1 ) #创建平移数组 #1*x+0*y+50,0*x+1*y+50=x+50,y+50 #向左下各平移50 m_move =

STN-Spatial Transformer Networks-论文笔记

痴心易碎 提交于 2020-01-07 19:58:43
原文链接: https://arleyzhang.github.io/articles/7c7952f0/ 论文地址: https://arxiv.org/abs/1506.02025 1 简介 1.2 问题提出 CNN在图像分类中取得了显著的成效,主要是得益于 CNN 的深层结构具有 空间不变性(spatially invariance)(平移不变性,旋转不变性),所以图像上的目标物体就算是做了平移或者旋转,CNN仍然能够准确的识别出来,这对于CNN的泛化能力是有益的。 空间不变性主要是由于 Pooling 层 和 步长不为1的卷积层 的存在带来的。实际上主要是池化层的作用,因为大部分的卷积层的步长都是大于1而又小于卷积核大小的,也就是滑动时是有重叠的,而池化层一般不是重叠的。也就是说这些层越多,越深,池化核或卷积核越大,空间不变性也越强;但是随之而来的问题是局部信息丢失,所以这些层越多准确率肯定是下降的,所以主流的CNN分类网络一般都很深,但是池化核都比较小,比如2×2。 比如ResNet,GoogLeNet,VGG,FCN,这些网络的总降采样比例一般是 16或32,基本没有见过 64倍,128倍或者更高倍数的降采样(会损失局部信息降低准确率),也很少见到 2倍或者4倍的降采样比例(空间不变性太弱,泛化能力不好)。不过这个是跟数据集中的图像大小有关的