圖像到圖像的映射


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.結果

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM