图像之间的映射(仿射变换、alpha通道叠加图片)

单应性变换

一、概念
1.单应性变换是将一个平面内的点映射到另一个平面内的二维投影变换。平面指图像或者三维中的平面表面。单应性变换具有很强的实用性,如图像配准、图像纠正和纹理扭曲、以及创建全景图像等都会频繁地使用单应性变换。
2.齐次坐标:使用N+1维坐标来表示N维坐标。一幅2D图像上的非齐次坐标为(x,y),而齐次坐标为(x,y,1),也可以写成(x/z,y/z,1)或(x,y,z)。
3.本质上,单应性变换是对齐次坐标下点的线性变换,可以通过矩阵运算来表达:x′=Hx
H是单应性矩阵(homography)用来计算一堆在同一个三维平面上的点在不同的二维图像中的投影位置,是一个一对一的映射。
图像之间的映射(仿射变换、alpha通道叠加图片)_第1张图片

仿射变换

仿射变换是一种二维坐标到二维坐标之间的线性变换(相同平面),它保持了二维图形的“平直性”(直线经过变换之后依然是直线)和“平行性”(二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变),但是角度会改变。任意的仿射变换都能表示为乘以一个矩阵(线性变换),再加上一个向量 (平移) 的形式。由于仿射变换具有6个自由度,因此需要三个对应点来对估计矩阵H。
图像之间的映射(仿射变换、alpha通道叠加图片)_第2张图片

Alpha通道原理

在图形学中,ALPHA指的是除了颜色的三个分量(RGB)外的第四个分量:透明度。所以,一个真彩色(指利用RGB分量合成颜色)的像素就变成由四个分量组成:R、G、B、A。假设R、G、B、A均为从0到1的值,其中ALPHA=0为完全透明,ALPHA=1为完全覆盖,中间的数值代表半透明。这样的设定是为了能使本文独立于显示硬件。把诸如 (R,G,B,A)这样的东西称为四元组。一个这样的四元组代表一个由RA、GA、B*A组合而成的颜色。
两个关键像素:黑色=(0,0,0,1),完全透明=(0,0,0,0)
若对两张图片进行叠加,则需对需要组合的颜色先计算出不含ALPHA分量的原始RGB分量,然后与Alpha相加。比如现在有两幅图象,分别称为图象A和图象B,将A叠加在B图上:
把图片A分解为B1矩阵,G1矩阵,R1矩阵,A1矩阵
把图片B作为背景图片分解为了B0矩阵,G0矩阵,R0矩阵
根据像素点叠加公式得到叠加结果:
B=B1 * alpha/255 + B0 * beta/255
G=G1 * alpha/255 + G0 * beta/255
R=R1 * alpha/255 + R0 * beta/255

python实现

1.使用仿射变换与Alpha通道将一幅图像放置到另一幅图像中:
图像一:集美大学尚大楼
图像之间的映射(仿射变换、alpha通道叠加图片)_第3张图片
图像二:图像之间的映射(仿射变换、alpha通道叠加图片)_第4张图片
核心代码:warp.py文件

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] #m,n为坐标范围
    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通道大小的尺寸
    alpha = (im1_t > 0)#在扭曲图像的扭曲区域之外以0来填充所得的图像
    
    return (1-alpha)*im2 + alpha*im1_t

affine是2D homography的一个特例,它对应着的情况是这个三维平面在无穷远。
从代数特性上讲,homography是一个rank=3或是可逆的矩阵,一般可以表示为:

图像之间的映射(仿射变换、alpha通道叠加图片)_第5张图片
ffine是它的简化形式,可逆且第三行无未知数:
图像之间的映射(仿射变换、alpha通道叠加图片)_第6张图片
a相当于A11,b相当于A12,d相当于A21,以此类推。

运行代码:

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

#仿射扭曲im1到im2的图像
im1 = array(Image.open('E:/image/1.jpg').convert('L'))
im2 = array(Image.open('E:/image/17.jpg').convert('L'))
#选定要叠加的目标点
tp = array([[729,1230,1230,729],[750,750,1000,1000],[1,1,1,1]])
im3 = warp.image_in_image(im1,im2,tp)#利用warp使im1中的像素替换im2中的像素
plt.figure()
plt.gray()
plt.imshow(im3)
plt.axis('equal')#x轴和y轴的单位长度相同
plt.axis('off')#关闭所有坐标轴线、刻度标记和标签
plt.show()

结果如下:
图像之间的映射(仿射变换、alpha通道叠加图片)_第7张图片

你可能感兴趣的:(计算机视觉)