python—图像到图像的映射

版权声明:集美大学 https://blog.csdn.net/weixin_43361953/article/details/88663454

图像中的图像

这次实验的目标是将图像或者图像的一部分放置在另一幅图像中,使得它们能够和制定的区域或者标记物对齐,如下图所示:
在这里插入图片描述
在开始之前,先了解以下原理:

1.alpha通道:通道作为图像的组成部分,是与图像的格式密不可分的,图像颜色,格式的不同决定了通道的数量和模式。阿尔法通道是指一张图片的透明和半透明度。例如:一个使用每个像素16比特存储的位图,对于图形中的每一个像素而言,可能以5个比特表示红色,5个比特表示绿色,5个比特表示蓝色,最后一个比特是阿尔法。在这种情况下,它要么表示透明要么不是,因为阿尔法比特只有0或1两种不同表示的可能性。又如一个使用32个比特存储的位图,每8个比特表示红绿蓝,和阿尔法通道。在这种情况下,就不光可以表示透明还是不透明。

2.homography(单应性变换):现在有很多图像变换的方式,单应性变换就是其中一种,它是讲一个平面内的点映射到另一个平面内的二维投影变换。单应性变换的目标是通过给定的4个对应点对来得到单应性矩阵。矩阵如下:
在这里插入图片描述
矩阵H会将一幅图像上的一个点的坐标a=(x,y,1)映射成另一幅图像上的点的坐标b=(x1,y1,1),也就是说,我们已知a和b,它们是在同一平面上。 则有下面的公式:
在这里插入图片描述
即:
在这里插入图片描述
或者 Ah=0,其中A是一个具有对应点对二倍数量行数的矩阵。将这些对应点对方程的系数堆叠到一个矩阵中,使用SVD找到H的最小二乘解,而后经过变形得到矩阵H。简单点说就是指定原图像的四个点,再找到目标图像的四个点,通过这四个对应点对求出H

3.仿射变换:是一种二维坐标(x, y)到二维坐标(u, v)的线性变换,对应的齐次坐标矩阵表示形式为:
在这里插入图片描述
对两张图片,要将一张贴到另一张上,首先要先对其中一张图片进行仿射变换,可能是旋转,可能是平移,把你要贴的第一张图片,变成你想要贴到第二张图的样子,具体可以研究下面代码中的affine_transform()函数。第二步,你就可以把他贴上去,这时候则是用alpha通道融合,用来算两张图之间的对应关系。

实现代码

# -*- coding: utf-8 -*-
from PCV.geometry import warp, homography
from PIL import  Image
from pylab import *
from scipy import ndimage
from scipy.spatial import Delaunay


# example of affine warp of im1 onto im2

im1 = array(Image.open('imagetest/tiyu.jpg').convert('L'))
im2 = array(Image.open('imagetest/3.jpg').convert('L'))
# set to points
tp = array([[364,415,416,362],[410,412,608,605],[1,1,1,1]]) #这里注意坐标顺序,先y后x,且为从左上角开始的逆时针顺序
#tp = array([[120,260,260,120],[16,16,305,305],[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) #仿射扭曲,将图1贴到图2
figure()
gray()
axis('off')
imshow(im1)
axis('off')
imshow(im2)
axis('off')
imshow(im3)
show()


#仿射扭曲
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. """ 
    
    # 扭曲的点
    m,n = im1.shape[:2]
    fp = array([[0,m,m,0],[0,0,n,n],[1,1,1,1]])
    
    #计算仿射变换,并且将其应用于图1
    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

运行结果

原图灰度化:
在这里插入图片描述
在这里插入图片描述
可以看到,“体育中心”被贴到对应的指定目标位置上。

猜你喜欢

转载自blog.csdn.net/weixin_43361953/article/details/88663454