仿射变换是计算机图形学中经常碰到的基本概念,它其实是线性变换和平移变换的叠加,可用于图像扭曲变形和图像配准。
仿射变换的性质:
1、仿射变换只有6个自由度(对应变换中的6个系数),因此,仿射变换后互相平行的直线仍是互相平行,三角形映射后也仍是三角形,但却不能保证将四边形以上的多边形映射为等边数的多边形。
2、仿射变换的乘积和逆变换仍是仿射变换。
3、仿射变换能够实现平移、旋转、缩放等几何变换。
仿射变换是线性变换后进行平移变换(其实也是齐次空间的线性变换),使用齐次坐标使得仿射变换可以以统一的矩阵形式进行表示。
仿射变换的数学表达形式为:
其中 c1、c2控制平移,a1、a2、b1、b2控制旋转、缩放和剪切。
Alpha通道是计算机图形学中的术语,指的是特别的通道,意思是“非彩色”通道,主要是用来保存选区和编辑选区。
Alpha通道是指一张图片的透明和半透明度。一个图像的每个像素都有 RGB 三个通道,后来有人提出每个像素再增加一个 Alpha 通道,变成RGBA(RGBA是代表Red(红色) Green(绿色) Blue(蓝色)和 Alpha的色彩空间)。Alpha取值为0到1,用来储存这个像素是否对图片有“贡献”,0代表透明、1代表不透明。Alpha 通道储存一个值,其外在表现是“透明度”。真正让图片变透明的不是Alpha,实际是Alpha所代表的数值和其他数值做了一次运算。
(注:你需要已下载好PCV库,如未安装,可参考python中PCV库安装的方法步骤):
如果没有载PCV,需要在warp.py文件中加入如下函数:
def image_in_image(im1,im2,tp)
"""使用仿射变换将im1放置在im2上,使im1图像的角和tp尽可能的靠近
tp是齐次表示的,并且是按照从左上角逆时针计算的"""
#扭曲的点
m,n=im1.shape[:2]
fp=array([[0,m,m,0],[0,0,n,n],[1,1,1,1]])
#计算仿射变换,并且将其应用于图像im1
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
主代码:
from PIL import Image
from pylab import *
from numpy import *
from PCV.geometry import warp
#仿射扭曲im1到im2的例子
im1=array(Image.open('im1.jpg').convert('L'))
im2=array(Image.open('im2.jpg').convert('L')) #把图片转成灰度图,然后取图像的二维数组
#选定一些目标点
tp=array([[80,320,320,80],[150,150,400,400],[1,1,1,1]])
im3=warp.image_in_image(im1,im2,tp)
figure()
gray()
imshow(im3)
axis('equal')
axis('off')
show()