计算机视觉学习 图像映射与前景拼接

1.原理

仿射变换是一种二维坐标到二维坐标之间的线性变换,它保持了二维图形的“平直性”(直线经过变换之后依然是直线)和“平行性”(二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变)。任意的仿射变换都能表示为乘以一个矩阵(线性变换),再加上一个向量 (平移) 的形式

2.代码及分析

主代码:

# -*- 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

im2 = array(Image.open('beatles.jpg').convert('L'))
im1 = array(Image.open('billboard.jpg').convert('L'))
# set to points
tp = array([[1800,2400,2400,1800],[1750,1750,2650,2650],[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()

, 运行结果:
在这里插入图片描述
知识点分析:
1,alpha通道
利用alpha通道,将扭曲的图像和第二幅图像融合。每个像素点的像素是两种源图片的对应像素点的像素加权算出来的,融合公式如下:
dst = alphasrc1 + betasrc2 + gamma
当alpha为a,beta为1-a,gamma为0,其中,a>=0且a<=1时,融合方程被称为标准融合方程alpha取值在[0,1]之间,0代表完全透明,1代表完全不透明
如果alpha取值在[0,255],公式改成
R = (R(a)alpha + R(b)(255-alpha))/255
在这里插入图片描述
2.单应性矩阵
在计算机视觉中,平面的单应性被定义为一个平面到另外一个平面的投影映射。两个不同视角的图像上的点对的homogeneous coordinate可以用一个射影变换(projective transformation)表述,即:x1 = H*x2

二维和三维的图示如下:

在这里插入图片描述
如果给定一个单应H={h_ij},给它的元素乘上同一个数a,得到的的单应aH和H作用相同,因为新单应无非把齐次点x1变成了齐次点ax1,都是一回事。因此我们可以把a换成1/h22,那么H就变成了只有8个自由元素的矩阵。

在这里插入图片描述
homography.py部分代码:

def Haffine_from_points(fp,tp):
    """ Find H, affine transformation, such that 
        tp is affine transf of fp. """
    #计算H矩阵,fp仿射变换得到tp
    if fp.shape != tp.shape:
        raise RuntimeError('number of points do not match')
        
    # condition points 归一化
    # --from points--
    m = mean(fp[:2], axis=1)
    maxstd = max(std(fp[:2], axis=1)) + 1e-9
    C1 = diag([1/maxstd, 1/maxstd, 1]) 
    C1[0][2] = -m[0]/maxstd
    C1[1][2] = -m[1]/maxstd
    fp_cond = dot(C1,fp)
    
    # --to points--
    m = mean(tp[:2], axis=1)
    C2 = C1.copy() #must use same scaling for both point sets
    C2[0][2] = -m[0]/maxstd
    C2[1][2] = -m[1]/maxstd
    tp_cond = dot(C2,tp)
    
    # conditioned points have mean zero, so translation is zero
    A = concatenate((fp_cond[:2],tp_cond[:2]), axis=0)
    U,S,V = linalg.svd(A.T)
    
    # create B and C matrices as Hartley-Zisserman (2:nd ed) p 130.
    tmp = V[:2].T
    B = tmp[:2]
    C = tmp[2:4]
    
    tmp2 = concatenate((dot(C,linalg.pinv(B)),zeros((2,1))), axis=1) 
    H = vstack((tmp2,[0,0,1]))
    
    # decondition
    H = dot(linalg.inv(C2),dot(H,C1))
    
    return H / H[2,2]





’

3.本次运行出现的问题:

1.出现missing parentheses in call to ‘print’

在这里插入图片描述
原因是Python2.X和Python3.X不兼容。
我安装的是Python3.6,但是这里运行的是Python2.的代码。
所以某些语法在python3中是错误的。这样的情况在python3中,找到warp.py文件,将print后面的语句加括号即可解决问题。
2.关’ModuleNotFoundError: No module named ‘matplotlib.delaunay’问题
表示matplotlib库不支持delaunay模块。可以用别的模块替代他,此处可用 from scipy.spatial import Delaunay 仿佛替代,即用scipy库来替代matplotlib库。
参考:https://blog.csdn.net/qq_33363973/article/details/80181950

猜你喜欢

转载自blog.csdn.net/weixin_44321243/article/details/88663307