文章目录
1.1 包的导入问题:
在开始出现了如下问题:
modulenotfounderror: no module named ‘matplotlib.delaunay’ |
---|
需要在warp.py中,把matplotlib.delaunay
改成matplotlib.tri
即可
1.2 选择两图片
其中图一(左上)是要粘贴上去的原图,图二(右上)是底图,图三(左下)仿射变换,图四(右下)是将图像分为两个三角形进行扭曲图像操作。
代码如下:
# -*- 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:/pycharmfile/test/wbz1.jpg').convert('L'))
im2 = array(Image.open('D:/pycharmfile/test/wbz2.jpg').convert('L'))
# set to points
tp = array([[320,460,460,320],[500,500,610,610],[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(131)
axis('off')
imshow(im1)
subplot(132)
axis('off')
imshow(im2)
# subplot(121)
# 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(133)
imshow(im4)
axis('off')
show()
其中H = homography.Haffine_from_points(tp2,fp2)
代表对图像进行了单应性变化,其中单应性矩阵主要解决以下两个问题:
(式1)
点的齐次坐标依赖于其尺度定义,因此单应性矩阵H也仅依赖尺度定义,所以,单应性矩阵具有8个独立的自由度。
参考文章 https://blog.csdn.net/czl389/article/details/71524752
仿射变换,又称仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。
在有限维的情况,每个仿射变换可以由一个矩阵A和一个向量b给出,它可以写作A和一个附加的列b。一个仿射变换对应于一个矩阵和一个向量的乘法,而仿射变换的复合对应于普通的矩阵乘法,只要加入一个额外的行到矩阵的底下,这一行全部是0除了最右边是一个1,而列向量的底下要加上一个1。
仿射变换包含一个可逆矩阵A和一个平移向量 t = [ t x , t y ] t=[t_{x},t_{y}] t=[tx,ty],仿射变换可以应用于图像扭曲等场景。
其中仿射变换包括平移变换、旋转变换、缩放变换(也叫尺度变换)、倾斜变换(也叫错切变换、剪切变换、偏移变换)、翻转变换,有六个自由度。,因此我们需要三个对应点对来估计矩阵H。通过将最后两个元素设置为0,即h7=h8=0,仿射变换可以用DLT算法估计得出。
图形的相似变换是指由一个图形到另一个图形,在改变的过程中保持形状不变(大小方向和位置可变)的图形。
参考文章 https://blog.csdn.net/algzjh/article/details/80152230、
https://www.cnblogs.com/liekkas0626/p/5238564.html
alpha = warp.alpha_for_triangle(tp2,im2.shape[0],im2.shape[1])
是计算图片的alpha通道。
1.定义:
其中,Alpha是一个8位的灰度图像通道,该通道用256级灰度来记录图像中的透明度信息,定义透明、不透明和半透明区域,其中黑表示透明,白表示不透明,灰表示半透明。例如:一个使用16位存储的图片,可能5位表示红色,5位表示绿色,5位表示蓝色,1位是阿尔法。在这种情况下,它要么表示透明要么不是。一个使用32位存储的图片,每8位表示红绿蓝,和阿尔法通道。在这种情况下,就不光可以表示透明还是不透明,阿尔法通道还可以表示256级的半透明度。
2.alpha通道包括
2.1 主通道
打开新图像时,自动创建颜色信息通道。图像的颜色模式确定所创建的颜色通道的数目。例如,RGB 图像有4 个默认通道:红色、绿色和蓝色各有一个通道,以及一个用于编辑图像的复合通道(主通道)。
2.2 专色通道
专色通道也就是除RGB三个颜色之外的用户自己添加的颜色。和主通道一样,也是用来存储颜色信息的。只不过要记得,作完效果之后要合并到主通道里面。
2.3 普通通道
普通通道不是用来存储颜色信息的。而是用来存储选区的。
参考文章 https://baike.baidu.com/item/alpha/6892050