精华内容
下载资源
问答
  • 更多相关内容
  • 音视频资料-图像仿射变换原理3:仿射变换类型及变换矩阵详解.rar
  • 资源名:基于仿射变换的数字图象置乱技术_MATLAB源程序代码_数字图象置乱_仿射变换_matlab 资源类型:matlab项目全套源码 源码说明: 全部项目源码都是经过测试校正后百分百成功运行的,如果您下载后不能运行可联系...
  • 在此基础上提出一种针对不同类型物体的仿射不变性特征提取策略,并建立一个实现三维物体任意姿态识别的软件系统平台,应用Princeton形状标准库中的部分模型对该平台进行测试。结果表明,该方法能够取得较好的识别效
  • 线性仿射变换

    2017-09-18 14:09:24
    在监控视频中,当监控摄像头发生晃动或偏移时,视频也会发生短暂的抖动现象(该类视频变换在短时间内可近似视为一种线性仿射变换,如旋转、平移、尺度变化等)。对这种类型的视频,有效地提取前景目标
  • 仿射变换加密

    2011-12-14 14:48:50
    密码学里面的仿射密码java文件代码 System.out.print("请输入你要加密的偏移量(k):"); t=input(); k=Integer.parseInt(t); System.out.print("请输入明码的倍乘因子(a):"); t=input(); a=Integer....
  • 仿射变换(Affine transformation),又称仿射映射,是指在几何中,对一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。 它是一种二维坐标到二维坐标间的线性变换,保持了二维图形的“平直性”...

    前言

    仿射变换(Affine transformation),又称仿射映射,是指在几何中,对一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。

    它是一种二维坐标到二维坐标间的线性变换,保持了二维图形的“平直性”(直线经过变换之后依然是直线)和“平行性”(二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变)。
    在这里插入图片描述

    任意的仿射变换都能表示成“乘以一个矩阵(线性变换),再加上一个向量 (平移) 的形式”。

    仿射变换

    仿射变换包含geometric contraction、expansion、dilation、reflection、rotation、shear、similarity transformations、spiral similarities和translation等类别及它们的组合,通常来讲,可以简单地认为仿射变换由rotations、translations、dilations和shears四类组合而成。

    在这里插入图片描述

    实际上“仿射变换”可以看成基础的“线性变换”+“平移”的组合。而“线性变换”要求变换前是直线的变换后仍然是直线,且直线之间的比例保持不变,同时原点本质保持不变。
    在这里插入图片描述
    OpenCV封装了仿射变换的函数可供调用:
    在这里插入图片描述

    仿射矩阵

    在这里插入图片描述
    对于二维图像而言,仿射变换可以表示成矩阵相乘形式。

    (1)平移量为0的仿射变换称为线性变换,可以用下列矩阵表示:
    在这里插入图片描述
    (2)只有平移变换而没有线性变换的仿射变换,可以用下列矩阵表示:
    在这里插入图片描述
    将同时含有线性变换和平移变换的仿射变换,用下列矩阵表示:
    在这里插入图片描述
    则变换矩阵为:
    在这里插入图片描述
    不同的仿射变换类型,其仿射矩阵参数a~f不同。维基百科中有一个非常直观地描述放射矩阵对应仿射变换效果的图示,如下所示:
    在这里插入图片描述
    对应二维图像而言,仿射矩阵的求解,需要至少三个非共线的点的映射关系。其中一个对应点可以列一个线性方程,三个对应点可以列出线性方程组,可以采用最小二乘法或者SVD分解法等方法进行求解。

    常用的求解仿射矩阵的函数有OpenCV的getAffineTransform() 方法和
    scikit-image (skimage) 的transform.SimilarityTransform.estimate()方法。
    在这里插入图片描述
    在这里插入图片描述

    其中skimage的transform.SimilarityTransform.estimate()方法则是采用最小均方估计的umeyama算法实现。

    在这里插入图片描述

    逆仿射变换与其矩阵

    对于仿射变换,我们在某些应用场景下需要进行其逆变换,即将变换后的图片再变换回原来的位置。

    此时,我们需要对所求的仿射矩阵求逆矩阵,通过逆矩阵做仿射变换则可以回到原先的图片位置状态。

    求二阶矩阵的逆矩阵,有:
    在这里插入图片描述
    其中 a d − b c ≠ 0 ad-bc≠0 adbc=0

    OpenCV中实现的仿射矩阵的逆矩阵求解也用了这一推论:
    在这里插入图片描述
    利用求出的逆矩阵,再进行仿射变换,即可得到原仿射变换前的状态。

    在这里插入图片描述

    参考资料

    [1] 仿射变换 - 维基百科,自由的百科全书
    [2] Affine transformation - Wikipedia
    [3] Affine Transformation – from Wolfram MathWorld
    [4] 仿射变换及其变换矩阵的理解 - shine-lee - 博客园
    [5] 如何通俗地讲解「仿射变换」这个概念? - 知乎
    [6] OpenCV: Geometric Image Transformations
    [7] 图像处理的仿射变换与透视变换
    [8] OpenCV:图像变换-仿射变换与透视变换研究_SSS_369-CSDN博客
    [9] OpenCV-Python教程:12.图片的几何转换 - 简书
    [10] opencv_attic/imgwarp.cpp · opencv/opencv_attic
    [11] 人脸对齐中的相似性变换_yiran103的专栏-CSDN博客
    [12] 图像的几何变换 — OpenCV-Python Tutorials 文档
    [13] Module: transform — skimage v0.18.0.dev0 docs
    [14] Module: transform.SimilarityTransform — skimage v0.18.0.dev0 docs
    [15] scikit-image/_geometric.py · scikit-image/scikit-image
    [16] skimage库的transform.SimilarityTransform()用法_小C的博客-CSDN博客
    [17] OpenCV: Image Warping
    [18] opencv_contrib/warp.cpp · opencv/opencv_contrib
    [19] opencv_contrib/warp.cu · opencv/opencv_contrib
    [20] Transformation matrix - Wikipedia

    展开全文
  • OpenCV——仿射变换

    2021-06-09 18:10:42
    getRotationMatrix2D()函数用于计算旋转矩阵和warpAffine()函数用于实现图像的仿射变换

    getRotationMatrix2D()函数用于计算旋转矩阵warpAffine()函数用于实现图像的仿射变换

    Mat getRotationMatrix2D( Point2f center, double angle, double scale );
    • center:图像旋转的中心位置。
    • angle:图像旋转的角度,单位为度,正值为逆时针旋转。
    • scale:两个轴的比例因子,可以实现旋转过程中的图像缩放,不缩放输入1。

     在这里插入图片描述

    在这里插入图片描述 

    warpAffine()函数进行仿射变换

    void cv::warpAffine(InputArray src,
                        OutputArray dst,
                        InputArray M,
                        Size dsize,
                        int  flags = INTER_LINEAR,
                        int  borderMode = BORDER_CONSTANT,
                        const Scalar& borderValue = Scalar()
    )

     

    • src:输入图像。
    • dst:仿射变换后输出图像,与src数据类型相同,但是尺寸与dsize相同。
    • M:2×3的变换矩阵。
    • dsize:输出图像的尺寸。
    • flags:插值方法标志,可选参数及含义在表3-3和表3-4中给出。
    • borderMode:像素边界外推方法的标志。
    • borderValue:填充边界使用的数值,默认情况下为0

    根据旋转矩阵和平移矩阵以及图像像素值,仿射变换的数学原理

    在这里插入图片描述 

     

    Mat getAffineTransform( const Point2f src[], const Point2f dst[] );
    • src[]:原图像中的三个像素坐标。
    • dst[]:目标图像中的三个像素坐标。

    该函数两个输入量都是存放浮点坐标的数组,在生成数组的时候像素点的输入顺序无关,但是需要保证像素点的对应关系,函数的返回值是一个2×3的变换矩阵。

    简单示例

    //
    // Created by smallflyfly on 2021/6/9.
    //
    
    #include "opencv2/opencv.hpp"
    #include "opencv2/highgui.hpp"
    
    #include <iostream>
    
    using namespace cv;
    using namespace std;
    
    int main() {
        Mat im = imread("test.jpg");
        resize(im, im, Size(0, 0), 0.5, 0.5);
        imshow("im", im);
    
        Mat r1;
        double angle = 30.0;
        Size size(im.cols, im.rows);
        Point2f center(im.rows / 2.0, im.cols / 2.0);
        r1 = getRotationMatrix2D(center, angle, 1);
        Mat warp;
        warpAffine(im, warp, r1, size);
        imshow("warp1", warp);
    
        // 根据三个点进行仿射
        Point2f srcPoints[3];
        Point2f dstPoints[3];
    
        //src image 3 points
        srcPoints[0] = Point2f(0, 0);
        srcPoints[1] = Point2f(0, im.cols-1);
        srcPoints[2] = Point2f(im.rows-1, im.cols-1);
        // dst image 3 points
        dstPoints[0] = Point2f(im.rows * 0.2, im.cols * 0.2);
        dstPoints[1] = Point2f(im.rows * 0.1, im.cols * 0.7);
        dstPoints[2] = Point2f(im.rows * 0.9, im.cols * 0.7);
        r1 = getAffineTransform(srcPoints, dstPoints);
        warpAffine(im, warp, r1, size);
        imshow("warp", warp);
    
        waitKey(0);
        destroyAllWindows();
    
        return 0;
    }

     

     

     

    展开全文
  • 仿射密码

    千次阅读 2021-04-21 22:43:39
    语言:python3 实验目的: 通过编程实现代换密码算法——仿射密码和简单置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。 实验内容: ... 仿射密码加密解密模块 @author WQ @.

    仿射密码定义原理:
      仿射密码为单表加密的一种,字母系统中所有字母都借一简单数学方程加密,对应至数值,或转回字母。 其仍有所有替代密码之弱处。所有字母皆借由方程加密,b为移动大小。
      在仿射加密中,大小为m之字母系统首先对应至0…m-1范围内之数值, 接着使用模数算数来将原文件中之字母转换为对应加密文件中的数字。 单一字母的加密函数为:
      在这里插入图片描述
    取余m为字母系统大小且a和b为密码关键值。a之值必须使得a与m互质。
    解密方程为
      在这里插入图片描述
    举例说明:

    代换密码算法的原理是使用替代法进行加密,就是将明文中的字符用其它字符替代后形成密文。例如,明文字母a、b、c、d,用D、E、F、G做对应替换后形成密文。
    代换密码包括多种类型,如单表代换密码、多表代换密码等。下面介绍一种典型的单表代换密码——仿射密码。它的加密、解密过程可以表示为下面的函数:
    在这里插入图片描述
    仿射加密要求gcd(k1,26)=0,否则就褪化为 y=f(k)=k2(mod 26)。
    故密钥空间大小为: (k1,k2)=12x26=312
    例如:密钥k=(7,3),7-1(mod 26)=15
    加密函数: y=f(x)=7x+3(mod 26)
    解密函数: x=f^(-1)(y)=15(y-3)(mod 26)=15y-9(mod 26)
    设明文:China,首先转换为数字:2,7,8,13,0 在这里插入图片描述
    原始消息“China”得到恢复

    1、实验目的:
      通过编程实现代换密码算法——仿射密码和简单置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。
    2、实验内容:
      根据仿射密码的实现原理,实现利用仿射密码进行加密和解密的程序。
      (1)设计加密程序:能够根据用户输入明文的内容产生加密的密文并输出。
      (2)设计解密程序:能够对输入的密文内容破解并输出得到其对应的明文。

    # -*- coding: UTF-8 -*-
    import math
    """
        仿射密码加密解密模块
        @author WQ
        @time 2020/11/18
    """
    class Affine():
        """
            仿射密码
            Encrypt:加密方法
    		Decrypt:解密方法
    		letters:字母数字对应字典
        """
        def __init__(self):
            self.ciphertext=''  #加密后的密文
            self.plaintext=''   #解密后的明文
            self.reverse=0 #秘钥a的逆元
            self.list_keya=[3,5,7,9,11,15,17,19,21,23,25] #秘钥a可能取值
            self.letters = {
                    'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4, 'f': 5, 'g':6, 'h': 7,
                    'i': 8, 'j': 9, 'k': 10, 'l': 11, 'm': 12, 'n': 13, 'o': 14,
                    'p': 15, 'q': 16, 'r': 17, 's': 18, 't': 19, 'u': 20,
                    'v': 21, 'w': 22, 'x': 23, 'y': 24, 'z': 25}
    
        def gcd(self,a,b=26):
            if(a<b):
                return self.gcd(b,a)
            while(a%b!=0):
                temp = b
                b = a%b
                a = temp
            return b 
    
        def Encrypt(self,a=0,b=0,input=""):
            """
                对输入的字符串进行加密
                加密算法:c=Ea,b(m)=am+b(mod26) m是单个明文字母
                args={
                        a,b:秘钥
                        input:用于加密的明文
                }  
            """
            if(self.gcd(a)!=1):
                print("秘钥a错误,应与26互质,请重输!")
                exit(0)
            if(b>=26):
                print("秘钥b错误[0~26],请重输!")
                exit(0)
            input=input.lower()
            digitals=[]
            #加密转化成密文对应数字
            for i in input:
                for j in self.letters:
                    if(i==j):
                        d=(a*self.letters[i]+b)%26
                        digitals.append(d)
    
            #将对应数字转化对应密文字母
            for i in digitals:
                for j in self.letters:
                    if(i==self.letters[j]):
                        self.ciphertext=self.ciphertext+j  
    
        def Decrypt(self, a, b, input=""):
            """
                对输入的字符串进行解密
                解密算法:m=Da,b(m)=a(-1)(c-b)(mod26) c是单个密文字母
                args={
                        a(-1):秘钥a的逆元
                        b:秘钥
                        input:用于解密的秘文
                }  
            """
            if(self.gcd(a)!=1):
                print("秘钥a错误,应与26互质,请重输!")
                exit(0)
            if(b>=26):
                print("秘钥b错误[0~26],请重输!")
                exit(0)
            digitals=[]
            self.reverse=self.Inverse(a) #求逆元
            for i in input:#解密 密文转化成对应数字
                for j in self.letters:
                    if(i==j):
                        digitals.append(self.letters[j])
            #解密
            for i in digitals:
                t=(self.reverse*(i-b))%26
                for j in self.letters:
                    if(t==self.letters[j]):
                        self.plaintext=self.plaintext+j
    
        def BruteForce(self, input=''):
            #暴力破解仿射密码
            digitals=[]
            plaintext=''
            for i in input: #解密 密文转化成对应数字
                for j in self.letters:
                    if(i==j):
                        digitals.append(self.letters[j])
    
            for keya in self.list_keya:
                a=self.Inverse(keya)
                for keyb in range(0,26):
                    for i in digitals:
                        t=(keya*(i-keyb))%26
                        for j in self.letters:
                            if(t==self.letters[j]):
                                plaintext=plaintext+j
                                break
                    print(plaintext)
                    plaintext=''
    
        def Inverse(self, a,mod=26):
            #求秘钥a的逆元 欧几里得算法   
            x1,x2,x3 = 1,0,mod
            y1,y2,y3 = 0,1,a
            while(1):
                if(y3==0):
                    g=x3
                    break
                if(y3==1):
                    g=y3
                    break
                q=math.floor(x3/y3)#向下取整
                t1,t2,t3=x1-q*y1,x2-q*y2,x3-q*y3
                x1,x2,x3=y1,y2,y3
                y1,y2,y3=t1,t2,t3
            return y2   #逆元求得为y2,y3为gcd(a,26),最大公因数   
    
    if __name__ == "__main__":
        test=Affine()
        #a=test.Inverse(615647919867658945209035999713482421889581801898774401730949,691310408299283134015133178155232316338199895735303344369216)
        #print(a)
        inputs=input("请输入待加密明文:")
        a=int(input("请输入秘钥[a]:"))
        b=int(input("请输入秘钥[b]:"))
        test.Encrypt(a,b,inputs)
        test.Decrypt(a,b,test.ciphertext)
        s1 = "加密为:" + test.ciphertext
        s2 ="解密为:" + test.plaintext
        s3 = str(a) + "的逆元为: " + str(test.reverse)
        print(s1)
        print(s2)
        print(s3)
        #test.BruteForce(test.ciphertext)
    

    运行结果:

    在这里插入图片描述

    小结:仿射密码是利用简单的置换原理,实现比较容易;增加了一个爆破函数,利用穷举爆破仿射密码。

    展开全文
  • 资源名:基于仿射变换的数字图象置乱技术 MATLAB源程序代码 资源类型:matlab项目全套源码 源码说明: 全部项目源码都是经过测试校正后百分百成功运行的,如果您下载后不能运行可联系我进行指导或者更换。 适合人群...
  • OpenCV图像仿射变换

    2021-10-09 14:31:05
    OpenCV图像仿射变换 OpenCV图像的旋转是通过图像的仿射变换来实现的,实现图像的旋转,分为三个步骤: 第一步:确定旋转角度和旋转中心。 第二步:确定旋转矩阵。通过getRotationMatrix2D函数计算出。 第三步:通过...
  • 仿射变换矩阵

    2022-04-19 10:58:39
    仿射变换Affine3f矩阵 首先总结而言:仿射变换矩阵实际上就是:平移向量+旋转变换组合而成,可以同时实现旋转,缩放,平移等空间变换。 Eigen库中,仿射变换矩阵的大致用法为: 创建Eigen::Affine3f 对象a。 创建...
  • 图像的仿射变换

    2021-02-05 06:15:56
    目录:概述图像基本变换仿射变换原理python实现一、概述图像的几何变换主要包括:平移、缩放、旋转、仿射、透视等等。图像变换是建立在矩阵运算基础上的,通过矩阵运算可以很快的找到不同图像的对应关系。理解变换的...
  • 仿射变换~

    2021-09-02 19:15:39
    文章目录定义一、性质二、...一个仿射变换对应于一个矩阵和一个向量的乘法,而仿射变换的复合对应于普通的矩阵乘法,只要加入一个额外的行到矩阵的底下,这一行全部是0除了最右边是一个1,而列向量的底下要加上一个1。
  • 仿射变换介绍

    2021-06-20 14:30:18
    仿射变换,又称仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。
  • 小白学视觉,笔记,扩展 1 仿射变换原理 2 放射变换函数及实验 用途 旋转 (线性变换),平移 (向量加).缩放(线性变换),错切,反转 方法 仿射变换是一种二维坐标到二维坐标之间的线性变换,它保持了二维图形的“平直...
  • 本节介绍了仿射变换的概念、类型、基本仿射变换矩阵、OpenCV-Python与仿射变换相关的主要函数及语法说明,并提供了两种不同方式实现的图像旋转和任选三个点将圈定子图放大的示例。通过阅读相关内容可以有助于大家...
  • RCWA-[R]残留-[C] -W [ise]仿射基团 GAP 4套件 作者和维护者:Stefan Kohl, 抽象的 GAP 4的此程序包提供了用于在作用于整数集合的某些无限置换组中进行计算的算法和方法的实现。 它可用于调查以下类型的组以及更多...
  • OpenCV之仿射变换

    2020-12-31 15:16:12
    仿射变换 仿射变换,是指在几何中,一个向量空间进行一次线型变换并接上一个平移,变换为另一个向量空间的过程。它保持了二维图形的“平直性”(直线经过变换之后仍然是直线)和“平行性”(直线经过变换之后仍然是...
  • 本文是老猿关于仿射变换的原理、概念以及OpenCV-Python实现额的导览式文章,通过本文作为入口,读者可以非常快速的理解仿射变换的相关知识以及开发应用。
  • solveMethod,矩阵分解类型; retval,生成的透视变换矩阵(返回值); 使用warpPerspective函数进行透视变换的案例代码如下: import cv2 import numpy as np img = cv2.imread('src.jpg') height, width, ...
  • 这里先说一下我们的目的,最近在用Pix2Pix 做一个项目的...为了解决这一问题,我们使用图像仿射变换技术来解决这个问题,仿射变换的原理网上一搜就有一大把,这里不做介绍,这里只给出代码实现。img_x = "./1.png";i...
  • 仿射变换(Affine Transformation)

    千次阅读 2019-11-22 10:09:12
    文章目录仿射变换(Affine Transformation)仿射变换的类型仿射变换的公式和计算1 平移变换 Translation2 缩放变换(Scale)3 剪切变换(Shear)4 旋转变换(Rotation)5 组合 变换模型是指根据待匹配图像与背景图像...
  • 1、C++仿射变换中主要涉及到2个函数:getAffineTransform() 和warpAffine() 2、粗略的理解:getAffineTransform()是用来求得仿射变换矩阵的;而warpAffine()是用来对原图像进行仿射变换的,从而得到目标图像。 3、...
  • Halcon 仿射变换

    2021-04-07 19:19:16
    仿射变换类型2. 仿射变换相关函数2.1 求仿射变换矩阵的函数:2.2 仿射变换函数3. 插值算法类型4. 平移旋转缩放实例5. 车牌仿射变换实例 1. 仿射变换类型 平移 旋转 缩放 镜像 错切 前三种比较常见,后面两种不常用...
  • Halcon区域几何变换和仿射变换一.Halcon区域几何变换1.move_region 平移2.zoom_region 缩放3.mirror_region 镜像4.transpose_region 倒置二.Halcon仿射变换1.affine_trans_region(区域的任意变换)2.hom_mat2d_...
  • 仿射变化的原理,使用及相关拓展的总结 仿射变换仿射变化的原理,使用及相关拓展的总结前言简单的例子原理提升拓展flags:插值方法borderMode:像素外推方法(边界像素模式)borderValue:边界不变时使用的值结尾 ...
  • C# + OpenCvSharp实现仿射变换

    千次阅读 2021-12-28 13:41:42
    //筛选文件类型 ofdWenJian.Filter = "ALL Image Files|*.bmp;*.gif;*.jpg;*.png"; //显示对话框 ofdWenJian.ShowDialog(); //获取图片的绝对路径 nameImage = ofdWenJian.FileName; if (nameImage == "") { ...
  • 本文介绍了组合(也称复合)仿射变换的概念、变换过程以及变换矩阵,并以绕指定点旋转的组合变换、指定直线作为依赖轴的组合变换详细介绍了变换过程和变换矩阵的构成,有助于深入理解仿射变换的概念和处理过程。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,501
精华内容 3,800
关键字:

仿射类型