您的位置:首页 > 编程语言 > Python开发

图像的仿射变换原理、Homography、alpha通道以及python实现

2019-03-19 21:36 381 查看

1、仿射变换原理

仿射变换有6个自由度,需要3个对应点对来估计矩阵H。仿射变换可以用DLT(Direct Linear Transformation,直接线性变换)算法估计得出,DLT方程为:

1.2 Homography

对图像块进行仿射变换,我们将其称为图形扭曲
仿射扭曲的一个简单例子是将图像或者图像的一部分放置在另一幅图像中,使得他们能够和指定的区域或者标记物对齐。
将函数image_in_image()添加到warp.py文件中。该函数的输入参数为两幅图像和一个坐标。该坐标为将第一幅图像放置到第二幅图像中的焦点坐标。将两幅扭曲的图像和第二幅图像融合就创建了alpha图像。
图像映射流程:
① 针对两张图像提取特征
② 特征匹配
③ 根据图像变换特点,选取合适的变换结构
④ 根据DLT等方法计算变换结构
⑤ 采用正向/逆向映射,利用插值方式实现图像映射变换

2、α通道

在电脑图形中,每个象素都包含RGB三个色彩信息通道–红、绿、蓝,在24位的图形中,每个通道又包含了8位色彩深度。如果图形卡具有32位总线,附加的8位信号就被用来保存不可见的透明度信号以方便处理用。
白色的alpha象素用于定义不透明的彩色象素,而黑色的alpha象素用于定义透明象素,黑白之间的灰阶用来定义半透明象素。 (在24位真彩色的基础上,增加了8位的Alpha数值来描述物体的透明程度)alpha通道,除RGB或CMYK以外的8位的通道,使用Alpha通道可使图像由不透明渐变到透明。
我们在图像仿射的过程中创建了alpha图像,该图像定义了每个像素从每个图像中获取的像素值成分多少。对于三个点,仿射变换可以将一副图像进行扭曲,使这三对对应点对可以完美地匹配上。这是因为,仿射变换有6个自由度,3个对应点对可以给出6个约束条件(对于这3个对应点对,x和y坐标必须都要匹配)。所以我们可以将图像分成两个三角形,然后对它们分别进行扭曲图像处理。

3、图像中的图像–实验结果

代码
# -*- 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('D:/picture/02.jpeg').convert('L'))
im2 = array(Image.open('D:/picture/01.jpg').convert('L'))
# set to points
tp = array([[120,260,260,120],[16,16,185,185],[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()
出现的问题:


要解决这个问题需要将 import matplotlib.delaunay as md 改成 from scipy.spatial import Delaunay 然后将 def triangulate_points(x,y) 中的 centers,edges,tri,neighbors 改成 tri = Delaunay(np.c_[x,y]).simplices 就可以运行啦。

结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: