精华内容
下载资源
问答
  • 一、介绍 一般的仿射变换是下面五种变换的组合:旋转,平移,缩放,错切,翻转。 仿射变换能够保持图像的平直性和平行性。... 步骤一:通过cv2.getAffineTransform()来生成仿射变换所使...

     

     

    一、介绍

    一般的仿射变换是下面五种变换的组合:旋转,平移,缩放,错切,翻转。

    仿射变换能够保持图像的平直性和平行性。平直性是指:图像经过仿射变换后,直线仍然是直线。平行性是指:图像经过仿射变换后,平行线仍然是平行线。

     

     

    二、实现

    opencv提供了cv2.getAffineTransform()来生成仿射变换所使用的矩阵M。

     

    步骤一:通过cv2.getAffineTransform()来生成仿射变换所使用的矩阵M。

     

    M = cv2.getAffineTransform(src, dst)

     

    src为输入图像中的三个点,分别是图像的左上角、右上角、左下角。

    dst分别为生成的图像对应的三个点的位置。

     

    步骤二:通过cv2.warpAffine()函数进行仿射变换。

     

     

     

    三、代码

     

    例:

     

    (0,0)点 转换后变到位置(0, height*0.5)      ,即左上角的点变到左边中间的地方。

    (width-1, 0) 变到位置(width*0.85, height*0.1) , 即右上角的点变到考里一点。

     

     

    结果:

     

     

     

     

    展开全文
  • 仿射变换

    2020-07-14 09:32:48
    Halcon中进行仿射变换的常见步骤如下:① 通过hom_mat2d_identity算子创建一个初始化矩阵(即[1.0, 0.0, 0.0, 0.0, 1.0, 0.0]);② 在初始化矩阵的基础上,使用hom_mat2d_translate(平移)、hom_mat2d_rotate...

    Halcon二维仿射变换实例探究 二维仿射变换,顾名思义就是在二维平面内,对对象进行平移、旋转、缩放等变换的行为(当然还有其他的变换,这里仅论述这三种最常见的)。 Halcon中进行仿射变换的常见步骤如下:① 通过hom_mat2d_identity算子创建一个初始化矩阵(即[1.0, 0.0, 0.0, 0.0, 1.0, 0.0]);② 在初始化矩阵的基础上,使用hom_mat2d_translate(平移)、hom_mat2d_rotate(旋转)、hom_mat2d_scale(缩放)等生成仿射变换矩阵;(这几个算子可以叠加或者重复使用)③ 根据生成的变换矩阵执行仿射变换,执行仿射变换的算子通常有:affine_trans_image、affine_trans_region、affine_trans_contour_xld,即不管对于图像、区域、XLD都可以执行仿射变换。 下面用一个完整程序分别展示hom_mat2d_translate(平移)、hom_mat2d_rotate(旋转)、hom_mat2d_scale(缩放)这三个算子的的具体功能。(特别要注意程序注释部分)hom_mat2d_translate( : : HomMat2D, Tx, Ty : HomMat2DTranslate)hom_mat2d_rotate( : : HomMat2D, Phi, Px, Py : HomMat2DRotate)hom_mat2d_scale( : : HomMat2D, Sx, Sy, Px, Py : HomMat2DScale) 程序所用图片如下: 1 read_image (Image, ‘hogn-1.jpg’)
    2 threshold (Image, Region, 0, 200)
    3 opening_circle (Region, Region, 1.5)
    4 connection (Region, ConnectedRegions)
    5 select_shape_std (ConnectedRegions, SelectedRegions, ‘max_area’, 70)
    6 *得到变换的中心点
    7 area_center (SelectedRegions, Area, Row, Column)
    8 dev_set_draw (‘margin’)
    9
    10 *hom_mat2d_translate中的两个参数的意思是:Tx和Ty分别代表Row方向和Column方向的平移量
    11 dev_display (Image)
    12 disp_cross (3600, Row, Column, 10, 40)
    13 hom_mat2d_identity (HomMat2DIdentity)
    14 hom_mat2d_translate (HomMat2DIdentity,30, 150, HomMat2DTranslate)
    15 affine_trans_region (Region, RegionAffineTrans, HomMat2DTranslate, ‘nearest_neighbor’)
    16
    17 *hom_mat2d_rotate中的三个参数的意思是:旋转角度(逆时针为正,弧度制),旋转中心的row和column值
    18 dev_display (Image)
    19 disp_cross (3600, Row, Column, 10, 40)
    20 hom_mat2d_rotate (HomMat2DIdentity, rad(20), Row, Column, HomMat2DRotate)
    21 affine_trans_region (Region, RegionAffineTrans, HomMat2DRotate, ‘nearest_neighbor’)
    22
    23 *hom_mat2d_scale中的四个参数的意思是:Sx和Sy分别代表Row方向和Column方向的缩放系数,缩放中心的row和column值
    24 dev_display (Image)
    25 disp_cross (3600, Row, Column, 10, 40)
    26 hom_mat2d_scale (HomMat2DIdentity, 2.0, 1.05, Row, Column, HomMat2DScale)
    27 affine_trans_region (Region, RegionAffineTrans, HomMat2DScale, ‘nearest_neighbor’)效果分别如下:  有时候,并不需要创建初始化矩阵也可以执行仿射变换,例如vector_angle_to_rigid算子就是如此。vector_angle_to_rigid( : : Row1, Column1, Angle1, Row2, Column2, Angle2 : HomMat2D) 该算子意思是:先将图像旋转,旋转角度为(Angle2 - Angle1) (逆时针为正),旋转中心坐标是(Row1, Column1)。再将原图的点(Row1, Column1)一一对应移到点 (Row2, Column2)上,移动的row和column方向的位移分别是( Row2 - Row1)、( Column2 - Column1),

    如果Row1 = Row2, Column1 = Column2,那么就完整等价于旋转变换。可以执行下面的程序感受一下: 1 read_image (Image, ‘hogn-1.jpg’)
    2 Row := 100
    3 Column := 200
    4 dev_display (Image)
    5
    6
    7 for Index := 1 to 150 by 1
    8 vector_angle_to_rigid (Row, Column, 0, Row, Column, rad(10), HomMat2D)
    9 disp_cross (3600, 100, 200, 10, 40)
    10 affine_trans_image (Image, ImageAffinTrans, HomMat2D, ‘nearest_neighbor’, ‘false’)
    11 copy_image (ImageAffinTrans, Image)
    12 endfor 可以将vector_angle_to_rigid理解为同时执行旋转变换和平移变换。最难弄明白的是旋转中心是什么?下面的程序可以说明如果先旋转后平移,那么旋转中心是(Row1, Column1),而不是 (Row2, Column2)。(如果先平移后旋转,那么结论刚好相反,大家可以试试) 1 read_image (Image, ‘hogn-1.jpg’)
    2 Row1 := 100
    3 Column1 := 100
    4
    5 Row2 := 100
    6 Column2 := 200
    7 dev_display (Image)
    8 *用vector_angle_to_rigid实现缩放、平移
    9 vector_angle_to_rigid (Row1, Column1, 0, Row2, Column2, rad(10), HomMat2D)
    10 affine_trans_image (Image, ImageAffinTrans, HomMat2D, ‘nearest_neighbor’, ‘false’)
    11
    12 *分两步依次执行缩放、平移
    13 hom_mat2d_identity (HomMat2DIdentity)
    14 hom_mat2d_rotate (HomMat2DIdentity, rad(10) - 0, Row1, Column1, HomMat2DRotate)
    15 hom_mat2d_translate (HomMat2DRotate,Row2 - Row1, Column2 - Column1, HomMat2DTranslate)
    16 *观察图像ImageAffinTrans和ImageAffinTrans_2能够完全重合
    17 affine_trans_image (Image, ImageAffinTrans_2, HomMat2DTranslate, ‘nearest_neighbor’, ‘false’)
    18
    19 disp_cross (3600, Row1, Column1, 10, 40) vector_angle_to_rigid最常用到的场合一般是模板匹配之类的算法场合,通常用在find_shape_model等算子后面。 下面用一个例子说明一下仿射变换的综合应用,即当图片旋转90°时,想办法变换Region使之能够翻转到对应的位置。将图片顺时针翻转90°的方法可以是:rotate_image (image, ImageRotate, -90, ‘constant’)。但其实它不仅经过了旋转变换、还进行了平移变换,最明显的证据就是:翻转前后的图像,他们的中心点坐标不一样。完整程序如下: 1 read_image (image, ‘C:/Users/happy xia/Desktop/dynPic.png’)
    2 binary_threshold (image, Region, ‘max_separability’, ‘dark’, UsedThreshold)
    3 dev_set_draw (‘margin’)
    4 connection (Region, ConnectedRegions)
    5 select_shape_std (ConnectedRegions, SelectedReg, ‘max_area’, 70)
    6 area_center (image, Area, Row, Column)
    7
    8 rotate_image (image, ImageRotate, -90, ‘constant’)
    9 area_center (ImageRotate, Area2, Row2, Column2)
    10
    11 hom_mat2d_identity (HomMat2DIdentity)
    12 hom_mat2d_rotate (HomMat2DIdentity, -rad(90), Row, Column, HomMat2DRotate)
    13 hom_mat2d_translate (HomMat2DRotate,Row2 - Row, Column2 - Column, HomMat2DTranslate)
    14
    15 affine_trans_region (SelectedReg, RegionAffineTrans, HomMat2DTranslate, ‘constant’)该算法顺利达到了目的——图像翻转以后,原先生成的Region也翻转到了对应的位置。注意:用rotate_image 算子旋转图像时,如果旋转角度不是0°、90°、180°、270°等角度,那么图像其实只做了旋转变换,而没有进行平移变换。

    展开全文
  • 图像的仿射变换

    2019-12-28 15:18:51
    仿射变换可以理解成为对坐标进行缩放、旋转、平移后取得的新坐标的值,或者是经过对坐标的缩放、旋转、平移后原坐标在新坐标领域中的值,可以用以下函数来描述: f(x)=Ax+b 其中,A 是变形矩阵,b是平移矩阵。在二...


    两个向量空间之间的仿射变换(仿射映射)是由一个线性变换接上一个平移组成。仿射变换可以理解成为对坐标进行缩放、旋转、平移后取得的新坐标的值,或者是经过对坐标的缩放、旋转、平移后原坐标在新坐标领域中的值,可以用以下函数来描述:
    f(x)=Ax+b
    其中,A 是变形矩阵,b是平移矩阵。在二维空间里,A可以按4个步骤分解:尺寸、伸缩、扭曲、旋转。

    1.尺度与伸缩变换

    尺度变换的变换矩阵表达式为
    在这里插入图片描述
    伸缩变换的变换矩阵表达式为
    在这里插入图片描述

    创建图像并对其进行尺寸变换

    clear
    clf
    I=checkerboard(40,4);
    subplot(121)
    imshow(I)
    title('原始图像')
    axis on
    s=1.2;
    T=[s,0;0,s;0 ,0];
    tf=maketform('affine',T);
    I1=imtransform(I,tf,'bicubic','FillValues',0.7);%对图像进行尺寸变换
    subplot(122)
    imshow(I1)
    title('尺寸变换')
    axis on
    

    在这里插入图片描述
    对图像进行伸缩变换

    clear all
    clf
    I=checkerboard(40,4);
    subplot(121)
    imshow(I)
    axis on
    title('原始图像')
    t=2;
    T=[1 0;0,t;0 0];
    tf=maketform('affine',T);
    I1=imtransform(I,tf,'bicubic','FillValues',0.3);
    subplot(122)
    imshow(I1)
    axis on
    title('伸缩变换')
    

    在这里插入图片描述

    2.扭曲与旋转变换

    扭曲与旋转的变换矩阵表达式为
    在这里插入图片描述
    旋转变换的变换矩阵表达式为
    在这里插入图片描述
    对创建的图像进行扭曲变换

    clear all
    clf
    I=checkerboard(40,4);
    subplot(121)
    imshow(I)
    axis on
    title('原始图像')
    u=0.5;
    T=[1 u;0 1;0 0];
    tf=maketform('affine',T);
    I1=imtransform(I,tf,'bicubic','FillValues',0.3);
    subplot(122)
    imshow(I1)
    axis on
    title('扭曲变换')
    

    在这里插入图片描述
    对图像进行旋转变换

    clear all
    clf
    I=checkerboard(40,4);
    subplot(121)
    imshow(I)
    axis on
    title('原始图像')
    angle=15*pi/180;
    sc=cos(angle);
    ss=sin(angle);
    T=[sc -ss;ss sc;0 0];
    tf=maketform('affine',T);
    I1=imtransform(I,tf,'bicubic','FillValues',0.3);
    subplot(122)
    imshow(I1)
    title('旋转图像')
    

    在这里插入图片描述
    对所创建的图像进行综合仿射变换

    clear all
    clf
    I=checkerboard(40,4);
    subplot(121)
    imshow(I)
    axis on
    title('原始图像')
    Angle=60;
    s=2;As=[s,0;0,s];%尺度变换
    t=2;At=[1 0;0 t];%伸缩变换
    u=1.5;Au=[1 u;0 1];%扭曲变换
    st=30*pi/180;sc=cos(Angle);ss=sin(Angle);
    Ast=[sc -ss; ss sc];%旋转变换
    T=[As*At*Au*Ast;3 5];
    tf=maketform('affine',T);
    I1=imtransform(I,tf,'bicubic','FillValues',0.3);
    subplot(122)
    imshow(I1)
    axis on
    title('综合仿射变换')
    

    在这里插入图片描述

    展开全文
  • (一)仿射变换步骤: 1.得到仿射变换的算子 2.进行仿射变换的操作。 仿射变换的操作: 1.平移操作:三个点的坐标进行加运算 2.旋转操作:中心点,旋转角度,缩放比例构成仿射算子 3.缩放:可以根据旋转操作来,...

    (一)仿射变换的步骤:
    1.得到仿射变换的算子
    2.进行仿射变换的操作。

    仿射变换的操作:
    1.平移操作:三个点的坐标进行加运算
    2.旋转操作:中心点,旋转角度,缩放比例构成仿射算子
    3.缩放:可以根据旋转操作来,旋转操作中的角度为0度,有缩放比例来进行缩放操作,也可以用三点来进行缩放的操作。
    最重要的一点是只要是重映射能操作的仿射变换均能进行操作的。
    仿射变换的函数:warpAffine(输入,输出,仿射算子,输出图像的大小)
    1.getAffineTransform 获得简单的仿射算子
    2.getRotationMatrix2D 获得旋转缩放的仿射算子
    仿射变换的程序:
    #include <opencv2\opencv.hpp>
    #include <opencv2\imgproc\imgproc.hpp>
    #include <opencv2\highgui\highgui.hpp>

    using namespace cv;
    using namespace std;

    void showHelpText()
    {
    printf("\n\n\n\n 当前的程序是仿射变换\n\n");
    printf("当前的opencv的版本为:"CV_VERSION);
    }
    int main()
    {
    showHelpText();
    Point2f srcTriangle[3];
    Point2f dstTriangle[3];//定义两组点,每组有三个点
    Mat rotMat(2,3,CV_32FC1);
    Mat warpMat(2,3,CV_32FC1);//定义两个23的矩阵
    Mat srcImg,dstImg,dstImg_warpRotate;
    srcImg=imread(“2.jpg”);
    if(!srcImg.data){
    printf(“载入图片失败”);
    return false;
    }
    dstImg=Mat::zeros(srcImg.size(),srcImg.type());
    srcTriangle[0]=Point2f(0,0);
    srcTriangle[1]=Point2f(static_cast(srcImg.cols-1),0);
    srcTriangle[2]=Point2f(0,static_cast(srcImg.rows-1));
    dstTriangle[0]=Point2f(static_cast(srcImg.cols
    0.0),static_cast(srcImg.rows0.33));
    dstTriangle[1]=Point2f(static_cast(srcImg.cols
    0.65),static_cast(srcImg.rows0.35));
    dstTriangle[2]=Point2f(static_cast(srcImg.cols
    0.15),static_cast(srcImg.rows*0.6));
    //求得仿射变换
    warpMat=getAffineTransform(srcTriangle,dstTriangle);//仿射因子
    warpAffine(srcImg,dstImg,warpMat,dstImg.size());
    //对图像缩放后在进行旋转,先仿射变换在进行旋转仿射变换
    /Point center=Point(dstImg.cols/2,dstImg.rows/2);
    double angle=30.0;
    double scale=0.8;
    //在仿射变换的基础上进行旋转变换
    rotMat=getRotationMatrix2D(center,angle,scale); //旋转因子
    warpAffine(dstImg,dstImg_warpRotate,rotMat,dstImg.size());
    /
    Point center=Point(srcImg.cols/2,srcImg.rows/2); //对原图进行旋转变换
    double angle=0.0;
    double scale=0.5;
    //在仿射变换的基础上进行旋转变换
    rotMat=getRotationMatrix2D(center,angle,scale); //旋转因子
    warpAffine(srcImg,dstImg_warpRotate,rotMat,srcImg.size()); imshow(“原始的图像”,srcImg);
    imshow(“仿射变换的图像”,dstImg);
    imshow(“仿射变换之后进行旋转的图像”,dstImg_warpRotate);
    waitKey(0);
    return 1;
    }

    展开全文
  • Halcon:二维仿射变换

    2021-03-11 17:22:36
    Halcon中进行仿射变换的常见步骤如下: 1.通过hom_mat2d_identity算子创建一个初始化矩阵(即[1.0, 0.0, 0.0, 0.0, 1.0, 0.0]); 2.在初始化矩阵的基础上,使用hom_mat2d_translate(平移)、hom_mat2d_rotate...
  • 今天我想来谈谈视图几何的3D空间的三种变换方式,分别是相似变换、仿射变换和影射变换。 提示:以下是本篇文章正文内容,下面案例可供参考 一、相似变换 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决...
  • Halcon二维仿射变换实例探究 ...Halcon中进行仿射变换的常见步骤如下: ① 通过hom_mat2d_identity算子创建一个初始化矩阵(即[1.0, 0.0, 0.0, 0.0, 1.0, 0.0]); ② 在初始化矩阵的基础上,使用hom_ma...
  • 【计算机视觉】仿射变换

    千次阅读 2019-03-19 21:19:34
    使用仿射变换将一幅图像放置到另一幅图像中 本篇欲使用仿射变换将一张图片插入到另外一张图片的指定位置中。 相关代码(注:你需要已下载好PCV库,如未安装,可参考python中PCV库安装的方法步骤): from PIL ...
  • 一般对图像的变化操作有放大、缩小、旋转等,统称为几何变换,对一个图像的图像变换主要有两大步骤,一是实现空间坐标... ##仿射变换## 二维空间坐标的仿射变换公式:$$ \left( \begin{matrix} \overline{x} \ \ove...
  • Halcon中进行仿射变换的常见步骤如下: ① 通过hom_mat2d_identity算子创建一个初始化矩阵(即[1.0, 0.0, 0.0, 0.0, 1.0, 0.0]); ② 在初始化矩阵的基础上,使用hom_mat2d_translate(平移)、hom_mat2d_rotate...
  • 一般对图像的变化操作有放大、缩小、旋转等,统称为几何...其中主要的图像变换有:仿射变换、投影变换、极坐标变换。 仿射变换 二维空间坐标的仿射变换公式: (x‾y‾)=(a11a12a21a22)(xy)+(a13a23) \left( \beg...
  • 仿射变换(2):旋转

    2020-11-24 15:32:54
    同样要使用cv2.warpAffine()进行仿射变换。 一、方法 步骤一:可以通过函数cv2.getRotationMatrix2D()获取转换矩阵 在使用之前,可以通过函数cv2.getRotationMatrix2D()获取转换矩阵。 ...
  • 算法框架和步骤可以以图像旋转算法为参考。 ...仿射变换公式: i´= a*i+b*j+ai  j´= c*i+d*j+aj [i´, j´,1] = [i, j, 1][a b 0; c d 0; ai aj 1];  function [im] = aff(I,T)
  • Halcon中进行仿射变换的常见步骤如下:① 通过hom_mat2d_identity算子创建一个初始化矩阵(即[1.0, 0.0, 0.0, 0.0, 1.0, 0.0]);② 在初始化矩阵的基础上,使用hom_mat2d_translate(平移)、hom_mat2d...
  • 核心函数:cvWarpAffinecvGetAffineTransformcv2DRotationMatrix步骤:先用GetAffineTransform(形变,拉伸,收缩,源目标图像三个点对应确定)或者cv2DRotationMatrix(旋转)求出变换矩阵,然后用cvWarpAffine进行...
  • 图像仿射矩阵T。图像旋转、偏移变换变换原理同样,依据这些在自己实现时。可分为三个步骤: 坐标转换 这些变换是以图像的中心为坐标原点(O’(x’,y’)),而图片原本设定是以图像左上角为坐标原点(O(x,y))...
  • 现在的人脸图像识别流程中有一个步骤叫人脸对齐,现在的一般方法是采用人脸上的关键点坐标,进行相似变换来实现人脸校正。多次在人脸识别的论文中看到 similarity transform,由于在线代和矩阵分析的课上一直划水。...
  • OpenCv图像仿射变换

    千次阅读 2013-12-02 11:20:57
    几何运算需要空间变换和灰度级差值两个步骤的算法,像素通过变换映射到新的坐标位置,新的位置可能是在几个像素之间,即不一定为整数坐标。这时就需要灰度级差值将映射的新坐标匹配到输出像素之间。最简单的插值方法...
  • 测试程序 【仿射变换】 时间:2016年8月31日 步骤:1、构建变换矩阵参数 2、根据参数获取变换矩阵 getAffineTransform/getRotationMatrix2D 3、应用变换矩阵变换warpAffine **********************
  • 图像仿射变换及图像扭曲(Image Warping)

    万次阅读 多人点赞 2015-01-07 23:33:36
    对于用得普遍的仿射变换,可以表达为如下式子: (x, y)为变换后的坐标,(v, w)为变换前的坐标。通过变换矩阵T,可以进行图像的缩放,旋转,平移等。有了坐标的变换,下面一步就是进行像素灰度级的赋值了。从...
  • 基于opencv的仿射变换

    2014-04-22 12:07:02
    几何运算需要空间变换和灰度级差值两个步骤的算法,像素通过变换映射到新的坐标位置,新的位置可能是在几个像素之间,即不一定为整数坐标。这时就需要灰度级差值将映射的新坐标匹配到输出像素之间。最简单的插值方法...
  • matlab 中的仿射变换函数

    万次阅读 2014-05-01 10:52:44
    执行一般的二维空间变换包括如下三步:这三步是最基本的步骤 1.定义空间变换的参数; 2.创建变换结构体TFORM,它定义了你所要执行变换的类型; TFORM结构体包含了执行变换需要的所有参数。你可以定义很多...
  • python+opencv实现多张图像的仿射变换 步骤: 1.导入opencv、numpy、os 2.把所要处理的图像放在一个文件中,然后用os.listdir(‘文件目录’)读取该文件夹目录下的所有图片的名字,然后通过字符串连接将图片的完整...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 133
精华内容 53
关键字:

仿射变换步骤