图像中的图像-分段仿射扭曲

#图像中的图像-分段仿射扭曲

##原理描述

仿射变换,又称仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。 [
每个仿射变换可以由一个矩阵A和一个向量b给出,它可以写作A和一个附加的列b。一个仿射变换对应于一个矩阵和一个向量的乘法,而仿射变换的复合对应于普通的矩阵乘法,只要加入一个额外的行到矩阵的底下,这一行全部是0除了最右边是一个1,而列向量的底下要加上一个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('校徽.jpg').convert('L'))
im2 = array(Image.open('尚大楼2.jpg').convert('L'))
# set to points
tp = array([[420,830,830,420],[400,350,1060,1000],[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 + alpha*im1_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 + alpha*im1_t
subplot(144)
imshow(im4)
axis('off')
show()


##根据提示修稿错误
图像中的图像-分段仿射扭曲
.修改warp.py文件
打开 PCV-master\PCV\geometry 目录下的warp.py文件,将第一行的代码后半段删除,只留下import matplotlib,以及第113行和128行的print后面加上括号,代码示例才不会报错。然后还要重装pcv,才能正常运行

图像中的图像-分段仿射扭曲
图片和代码位置混乱导致,把他们放一起就可以了

##结果图与分析
图像中的图像-分段仿射扭曲
一张校徽一张集美大学风景照,图片是处理成灰度值,我的放置的位置不太好,只知道通过修改tp = array([[420,830,830,420],[400,350,1060,1000],[1,1,1,1]])这一行的坐标点可以改变图一映射在图二的位置,但一直调理想位置。