图像到图像的映射

一、仿射变换的原理

仿射变换能够保持图像的“平直性”,包括旋转,缩放,平移,错切操作。一般而言,仿射变换矩阵为2*3的矩阵,第三列的元素起着平移的作用,前面两列的数字对角线上是缩放,其余为旋转或者错切的作用。仿射变换(Affine Transformation 或Affine Map)是一种二维坐标(x, y)到二维坐标(u, v)的线性变换,其数学表达式形式如下:
在这里插入图片描述
对应的齐次坐标矩阵表示形式为:
在这里插入图片描述

1.1 二维图像仿射变换

图像处理中,可应用仿射变换对二维图像进行平移、缩放、旋转等操作。实例如下:
在这里插入图片描述
经仿射变换后,图像关键点依然构成三角形,但三角形形状已经发生变化。

1.2原子变换

仿射变换通过一系列原子变换复合实现,具体包括:平移(Translation)、缩放(Scale)、旋转(Rotation)、翻转(Flip)和错切(Shear)。
a. 平移
在这里插入图片描述
在这里插入图片描述
b. 缩放
在这里插入图片描述
在这里插入图片描述
c. 旋转
在这里插入图片描述
在这里插入图片描述
d. 翻转
在这里插入图片描述
在这里插入图片描述
e. 错切
错切亦称为剪切或错位变换,包含水平错切和垂直错切,常用于产生弹性物体的变形处理。在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、什么是α通道

我们常见的RGB图像通常只有R、G、B三个通道,在图像处理的过程中会遇到往往需要向图像中添加透明度信息,如公司logo的设计,其输出图像文件就需要添加透明度,即需要在RGB三个通道的基础上添加alpha通道信息,当α=0时透明,α=1时不透明。

三、使用仿射将一副图像放置到另一幅图像中
3.1源代码
 # -*- 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:\\vscode\\code\\pcv-book-code-master\\ch03\\322.jpg').convert('L'))
im2 = array(Image.open('D:\\vscode\\code\\pcv-book-code-master\\ch03\\321.jpg').convert('L'))
# set to points
tp = array([[120,260,260,120],[829,829,1621,1621],[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()

结果
在这里插入图片描述

3.2实验结果分析

图一为一副艺术图像,图二为集大风雨操场的灰度图像,通过修改tp = array([[47,784,784,47],[812,805,1658,1658],[1,1,1,1]])这一行的坐标点可以改变图一映射在图二的位置,其中前四个数字代表四个角点的纵坐标,中间四个数字代表四个角点的横坐标,四个角点的顺序为从左上角开始按照逆时针方向排序,最后四个数字代表四个角点的α通道。图三和图四都是图片的重合,但是图三是图一和图二的重合,而图四是图三和图一的重合。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值