zoukankan      html  css  js  c++  java
  • 图像到图像的映射

    1. 仿射变换原理

      仿射变换(Affine Transformation 或Affine Map)是一种二维坐标(x, y)到二维坐标(u, v)的线性变换,其数学表达式形式如下:

      

      对应的齐次坐标矩阵表示形式为:

      

      仿射变换保持了二维图形的“平直性”(直线经仿射变换后依然为直线)和“平行性”(直线之间的相对位置关系保持不变,平行线经仿射变换后依然为平行线,且直线上点的位置顺序不会发生变化)。非共线的三对对应点确定一个唯一的仿射变换。

    2.拼接图像

      估计出图像间的单应性矩阵(使用RANSAC算法),现在我们需要将所有的图像扭曲到一个公共的图像平面上。通常,这里的公共平面为中心图像平面。一种方法是创建一个很大的图像,比如图像中全部填充0,使其和中心图像平行,然后将所有的图像扭曲到上面,由于我们所有的图像是由照相机水平旋转拍摄的,因此我们可以使用一个较简单的步骤:将中心图像左边或者右边的区域填充0,以便为扭曲的图像腾出空间。

    3.alpha通道

      在图形图像学中,透明通道也称Alpha通道,代表数字图像中像素点的透明信息。白色的Alpha像素用以定义不透明的彩色像素,而黑色的Alpha定以透明像素,黑白之间的灰阶则是彩色图片中的半透明部分。

    4.代码

     1  # -*- coding: utf-8 -*-
     2 from PCV.geometry import warp, homography
     3 from PIL import Image
     4 from pylab import *
     5 from scipy import ndimage
     6 
     7 # example of affine warp of im1 onto im2
     8 
     9 im1 = array(Image.open('C:/Users/w/PycharmProjects/sift/picture/1.jpg').convert('L'))
    10 im2 = array(Image.open('C:/Users/w/PycharmProjects/sift/picture/2.jpg').convert('L'))
    11 # set to points
    12 tp = array([[120,260,260,120],[16,16,305,305],[1,1,1,1]])#变换的目标坐标
    13 #tp = array([[675,826,826,677],[55,52,281,277],[1,1,1,1]])
    14 im3 = warp.image_in_image(im1,im2,tp)#函数内部warp
    15 figure()
    16 gray()
    17 subplot(141)
    18 axis('off')
    19 imshow(im1)
    20 subplot(142)
    21 axis('off')
    22 imshow(im2)
    23 subplot(143)
    24 axis('off')
    25 imshow(im3)
    26 
    27 # set from points to corners of im1
    28 m,n = im1.shape[:2]
    29 fp = array([[0,m,m,0],[0,0,n,n],[1,1,1,1]])
    30 # first triangle
    31 tp2 = tp[:,:3]
    32 fp2 = fp[:,:3]
    33 # compute H
    34 H = homography.Haffine_from_points(tp2,fp2)#
    35 im1_t = ndimage.affine_transform(im1,H[:2,:2],(H[0,2],H[1,2]),im2.shape[:2])
    36 # alpha for triangle
    37 alpha = warp.alpha_for_triangle(tp2,im2.shape[0],im2.shape[1])#图像alpha通道
    38 im3 = (1-alpha)*im2 + alpha*im1_t
    39 # second triangle
    40 tp2 = tp[:,[0,2,3]]
    41 fp2 = fp[:,[0,2,3]]
    42 # compute H
    43 H = homography.Haffine_from_points(tp2,fp2)
    44 im1_t = ndimage.affine_transform(im1,H[:2,:2],
    45 (H[0,2],H[1,2]),im2.shape[:2])
    46 # alpha for triangle
    47 alpha = warp.alpha_for_triangle(tp2,im2.shape[0],im2.shape[1])
    48 im4 = (1-alpha)*im3 + alpha*im1_t
    49 subplot(144)
    50 imshow(im4)
    51 axis('off')
    52 show()
    View Code

    5.结果

  • 相关阅读:
    上海汉得面试:
    二叉树的遍历
    操作系统知识总结
    mysql单表查询&&多表查询(职员表14+9)
    数据库查询
    数据库设计三大范式及事务
    某硕笔试题mysql数据库部分(较为全面)
    java 读取excel 将数据插入到数据库
    java 读取excel 正常 xls
    java 读取excel(Map结构)xls
  • 原文地址:https://www.cnblogs.com/wenbozhu/p/10559068.html
Copyright © 2011-2022 走看看