图像到图像之间的映射

一.仿射变换的原理
仿射变换是在几何上定义为两个向量空间之间的一个仿射变换或者仿射映射由一个非奇异的线性变换(运用一次函数进行的变换)接上一个平移变换组成。
在有限维的情况,每个仿射变换可以由一个矩阵A和一个向量b给出,它可以写作A和一个附加的列b。一个仿射变换对应于一个矩阵和一个向量的乘法,而仿射变换的复合对应于普通的矩阵乘法,只要加入一个额外的行到矩阵的底下,这一行全部是0除了最右边是一个1,而列向量的底下要加上一个1。
1.1 二维图像仿射变换

图像处理中,可应用仿射变换对二维图像进行平移、缩放、旋转等操作。实例如下:
图像到图像之间的映射_第1张图片
经仿射变换后,图像关键点依然构成三角形,但三角形形状已经发生变化。

1.2原子变换

仿射变换通过一系列原子变换复合实现,具体包括:平移(Translation)、缩放(Scale)、旋转(Rotation)、翻转(Flip)和错切(Shear)。
a. 平移
在这里插入图片描述
在这里插入图片描述
b. 缩放
在这里插入图片描述
在这里插入图片描述
c. 旋转
在这里插入图片描述
在这里插入图片描述
d. 翻转
在这里插入图片描述
在这里插入图片描述
e. 错切
错切亦称为剪切或错位变换,包含水平错切和垂直错切,常用于产生弹性物体的变形处理。
图像到图像之间的映射_第2张图片
在这里插入图片描述
在这里插入图片描述
二、使用仿射将一副图像放置到另一幅图像中

2.1源代码

-- coding: utf-8 --

from PCV.geometry import warp, homography
from PIL import Image
from pylab import *
from scipy import ndimage

example of affine warp of im1 onto im2

im1 = array(Image.open(‘D:\vscode\code\pcv-book-code-master\ch03\LL.jpg’).convert(‘L’))
im2 = array(Image.open(‘D:\vscode\code\pcv-book-code-master\ch03\321.jpg’).convert(‘L’))

set to points

tp = array([[47,784,784,47],[812,805,1658,1658],[1,1,1,1]])
#tp = array([[675,826,826,677],[55,52,281,277],[1,1,1,1]])
im3 = warp.image_in_image(im1,im2,tp)
figure()
gray()
subplot(141)
axis(‘off’)
imshow(im1)
subplot(142)
axis(‘off’)
imshow(im2)
subplot(143)
axis(‘off’)
imshow(im3)

set from points to corners of im1

m,n = im1.shape[:2]
fp = array([[0,m,m,0],[0,0,n,n],[1,1,1,1]])

first triangle

tp2 = tp[:,:3]
fp2 = fp[:,:3]

compute H

H = homography.Haffine_from_points(tp2,fp2)
im1_t = ndimage.affine_transform(im1,H[:2,:2],
(H[0,2],H[1,2]),im2.shape[:2])

alpha for triangle

alpha = warp.alpha_for_triangle(tp2,im2.shape[0],im2.shape[1])
im3 = (1-alpha)im2 + alphaim1_t

second triangle

tp2 = tp[:,[0,2,3]]
fp2 = fp[:,[0,2,3]]

compute H

H = homography.Haffine_from_points(tp2,fp2)
im1_t = ndimage.affine_transform(im1,H[:2,:2],
(H[0,2],H[1,2]),im2.shape[:2])

alpha for triangle

alpha = warp.alpha_for_triangle(tp2,im2.shape[0],im2.shape[1])
im4 = (1-alpha)im3 + alphaim1_t
subplot(144)
imshow(im4)
axis(‘off’)
show()

2.2运行结果
图像到图像之间的映射_第3张图片
2.3运行结果分析
如图所示,实验通过修改tp = array([[47,784,784,47],[812,805,1658,1658],[1,1,1,1]])这一行的坐标点改变图一映射在图二的位置,其中前四个数字代表四个角点的纵坐标,中间四个数字代表四个角点的横坐标,在进行顺时针与逆时针的变换,最后将集美大学校徽与庄重文操场合在一起。

你可能感兴趣的:(图像到图像之间的映射)