【计算机视觉】仿射变换

目录

  • (一)仿射变换原理
  • (二)Alpha 通道
  • (三)相关代码及运行结果


(一)仿射变换原理

仿射变换是计算机图形学中经常碰到的基本概念,它其实是线性变换和平移变换的叠加,可用于图像扭曲变形和图像配准。

仿射变换的性质:
1、仿射变换只有6个自由度(对应变换中的6个系数),因此,仿射变换后互相平行的直线仍是互相平行,三角形映射后也仍是三角形,但却不能保证将四边形以上的多边形映射为等边数的多边形。
2、仿射变换的乘积和逆变换仍是仿射变换。
3、仿射变换能够实现平移、旋转、缩放等几何变换。

仿射变换是线性变换后进行平移变换(其实也是齐次空间的线性变换),使用齐次坐标使得仿射变换可以以统一的矩阵形式进行表示。

仿射变换的数学表达形式为:
在这里插入图片描述其中 c1、c2控制平移,a1、a2、b1、b2控制旋转、缩放和剪切。

仿射变换对应的齐次坐标矩阵表示形式为:
【计算机视觉】仿射变换_第1张图片


(二)Alpha 通道

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()

运行结果:
【计算机视觉】仿射变换_第2张图片

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