这次我们进行的是warp中image_in_image函数的实验
原函数如下
def image_in_image(im1,im2,tp):
""" Put im1 in im2 with an affine transformation
such that corners are as close to tp as possible.
tp are homogeneous and counter-clockwise from top left. """
# points to warp from
m,n = im1.shape[:2]
fp = array([[0,m,m,0],[0,0,n,n],[1,1,1,1]])
# compute affine transform and apply
H = homography.Haffine_from_points(tp,fp)
im1_t = ndimage.affine_transform(im1,H[:2,:2],
(H[0,2],H[1,2]),im2.shape[:2])
alpha = (im1_t > 0)
return (1-alpha)*im2 + alpha*im1_t
由于我使用的python版本是python3,所以在使用该函数前要将warp.py中
import matplotlib.Delaunay as md
#替换为
from scipy.spatial import Delaunay
该函数有三个参数,im1要嵌入的图片,im2被嵌入的背景图,tp用来设置被嵌入位置、形状的参数
函数中fp取到im1的大小,设置α通道,将该图片所在的位置全部设为1(可通过),和im2相叠加
tp的数组中有3组数据,分别是纵轴坐标,横轴坐标,α通道为1。
在如下代码中,我们不改变im1的形状仅改变长宽,嵌入了im2中
#-*- 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('temp.jpg').convert('L'))
im2 = array(Image.open('30.jpg').convert('L'))
#set to points
tp = array([[300,1250,1250,300],[0,0,280,280],[1,1,1,1]])
tp2 = array([[350,1300,1300,350],[380,380,750,750],[1,1,1,1]])
im3 = warp.image_in_image(im1,im2,tp)
im3 = warp.image_in_image(im1,im3,tp2)
figure()
gray()
subplot(131)
axis('off')
imshow(im1)
subplot(132)
axis('off')
imshow(im2)
subplot(133)
axis('off')
imshow(im3)
show()
此为结果
我们还可以通过调整tp的值改变图像的形状,使图像倾斜
我们将原本的tp2= array([[350,1300,1300,350],[380,380,750,750],[1,1,1,1]])改为
tp2 = array([[350,1300,1400,400],[380,380,750,750],[1,1,1,1]])后得到了更加符合实际路标的图片
备注:用于测试的图片全部来自福建省厦门集美大学,觉得集美大学长得不错的可以点个赞。
代码来源:http://yongyuan.name/pcvwithpython/