一、概念

1.单应性变换(Homography)

同一个平面(比如书皮)的两张图片,红点表示同一个物理坐标点在两张图片上的各自位置。在 CV 术语中,我们称之为对应点。
【计算机视觉】单应性变换/仿射变换/alpha通道及其实现
Homography 就是将一张图像上的点映射到另一张图像上对应点的3x3变换矩阵.
A Homography is a transformation ( a 3×3 matrix ) that maps the points in one image to the corresponding points in the other image.

因为 Homography 是一个 3x3 的 矩阵,所以我们可以把它写成
【计算机视觉】单应性变换/仿射变换/alpha通道及其实现
对于图中的一对儿对应点,位于图一的 (x1, y1) 和 位于图二的 (x2, y2). H 把二者映射关系建立起来
【计算机视觉】单应性变换/仿射变换/alpha通道及其实现
对于所有的对应点,只要它们都位于同一个物理平面上,上述 Homography 就是成立的。换句话说,就是可以把图一中书皮上的所有点都映射到图二的书皮上,也就是看起来,图一中的书皮和图二中的书皮对齐了!如下图:
【计算机视觉】单应性变换/仿射变换/alpha通道及其实现

2.仿射变换(Affine transformation)

仿射变换的功能是从二维坐标到二维坐标之间的线性变换,且保持二维图形的“平直性”和“平行性”。
一个集合 XX 的仿射变换为:
f(x)=Ax+b,x∈Xf(x)=Ax+b,x∈X
它的几何意义是对一个图形进行:

缩放(Scale)、平移(transform)、旋转(rotate)、反射(reflection, 对图形照镜子)、错切(shear mapping,感觉像是一个图形的倒影)

或者它们的任意组合

维基百科中的一个图很好诠释了各种仿射变换:

【计算机视觉】单应性变换/仿射变换/alpha通道及其实现

3.alpha通道(α Channel或Alpha Channel)

阿尔法通道(α Channel或Alpha Channel)是一个8位的灰度图像通道,该通道用256级灰度来记录图像中的透明信息,定义透明、不透明和半透明区域,其中黑表示透明,白表示不透明,灰表示半透明。主要是用来保存选区和编辑选区。
例如:一个使用每个像素16比特存储的位图,对于图形中的每一个像素而言,可能以5个比特表示红色,5个比特表示绿色,5个比特表示蓝色,最后一个比特是阿尔法。在这种情况下,它要么表示透明要么不是,因为阿尔法比特只有0或1两种不同表示的可能性。又如一个使用32个比特存储的位图,每8个比特表示红绿蓝,和阿尔法通道。在这种情况下,就不光可以表示透明还是不透明,阿尔法通道还可以表示256级的半透明度,因为阿尔法通道有8个比特可以有256种不同的数据表示可能性。

二、实现

1.ndimage.affine_transform()函数实现

from scipy import ndimage
from PIL import Image
from pylab import *

im = array(Image.open('D:/FFOutput/school/1.jpg').convert('L'))
H = array([[1.4,0.05,-100],[0.05,1.5,-100],[0,0,1]])
im2 = ndimage.affine_transform(im,H[:2,:2],(H[0,2],H[1,2]))

figure()
gray()
subplot(121)
axis('off')
imshow(im)
subplot(122)
axis('off')
imshow(im2)
show()

【计算机视觉】单应性变换/仿射变换/alpha通道及其实现
2.完全图像扭曲和使用两个三角的仿射弯曲效果
a)

tp = array([[1455,2614,2540,1305],[620,508,2153,2153],[1,1,1,1]])

这一句的坐标可以通过查看绘制图像(在PyLab图像中,鼠标的坐标显示在图像底部附近)手工确定。

b)
fp = 齐次坐标表示下,扭曲前的点
tp = 齐次坐标表示下,扭曲后的点

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:/data/sunset_tree.jpg').convert('L'))
#im2 = array(Image.open('D:/data/turningtorso1.jpg').convert('L'))
im1 = array(Image.open('D:/FFOutput/school/6.jpg').convert('L'))
im2 = array(Image.open('D:/图片/pv/图像仿射变换/背景.jpg').convert('L'))

# 选定一些坐标点set to points
#tp = array([[120,260,260,120],[16,16,305,305],[1,1,1,1]])
tp = array([[1455,2614,2540,1305],[620,508,2153,2153],[1,1,1,1]])#变换的目标坐标

im3 = warp.image_in_image(im1,im2,tp)#函数内部warp
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])#图像alpha通道
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()

【计算机视觉】单应性变换/仿射变换/alpha通道及其实现
图3完全图像扭曲、图4三角仿射弯曲

概念部分参考:
https://blog.csdn.net/baishuo8/article/details/80777995#_Homography_8
https://www.learnopencv.com/homography-examples-using-opencv-python-c/
https://blog.csdn.net/robert_chen1988/article/details/80498805
https://www.cnblogs.com/xiayong123/archive/2011/08/19/3717559.html
https://baike.baidu.com/item/alpha/6892050

相关文章:

  • 2022-01-23
  • 2021-05-23
  • 2022-12-23
  • 2021-04-13
  • 2021-10-05
  • 2021-11-10
  • 2021-12-16
  • 2021-05-18
猜你喜欢
  • 2021-10-21
  • 2021-07-05
  • 2021-11-16
  • 2021-07-08
  • 2021-11-29
  • 2022-12-23
  • 2021-06-14
相关资源
相似解决方案