图像的仿射变换原理、Homography、alpha通道以及python实现
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 就可以运行啦。
结果:
- kNN算法的原理以及Python实现
- 图像去雾之何凯明暗通道先验去雾算法原理及c++代码实现
- KD-tree的原理以及构建与查询操作的python实现
- 图像去雾之何凯明暗通道先验去雾算法原理及c++代码实现
- 蒙版原理以及Python简单实现
- Alpha通道原理及实现方法
- [置顶] 浅谈SVD原理以及python实现小demo
- 卡方检验的原理作用以及Python、R语言的实现方式
- 图像拐点检测-原理以及代码实现
- 图像的仿射变换原理及示例(python)
- KD-tree的原理以及构建与查询操作的python实现
- Python OpenCV学习笔记之:图像直方图反向投影(backprojection)原理简单实现
- 3.python中map,filter,reduce以及内部实现原理剖析
- web框架的原理以及web框架的实现(python)
- KD-tree的原理以及构建与查询操作的python实现
- KD-tree的原理以及构建与查询操作的python实现
- 排序算法二:快速排序算法原理以及MATLAB与Python实现
- 图像去雾之何凯明暗通道先验去雾算法原理及c++代码实现
- 【python图像处理】给图像添加透明度(alpha通道)
- windows程序的运行原理以及VC 的实现过程