【python】图像映射:单应性变换与图像扭曲

  • 单应性变换(Homography)
  • 图像扭曲(仿射变换)
  • 图中图
  • 分段仿射扭曲

单应性变换(Homography)

单应性变换(Homography)即一个平面中的点到另一个平面的映射关系,如下图所示,使用单应性矩阵,将不同角度拍摄的图像图1和图2变换到同一平面。

而实现单应性变化的重点就是对单应性矩阵H的求解。如下图所示,其中x1y1表示图像一的矩阵数据,x2y2表示图像二的矩阵数据,而H则为单应性矩阵,通过求解H即可得出两图像间的映射关系。

在一般情况下,矩阵A不可逆,若需要求得t的值(下图中t即为单应性矩阵)则需要做一定的数学变换

如下公式所示,进行转换后,通过计算最小二乘解求得最小特征值对应的特征向量

再通过DLT(Direct Linear Transform)算法解决该最小二乘问题,如下图,通过DTL算法得A = UDVt, 而h (单应性矩阵)即为V的最后一行

单应性变换的结果诶下图,图中将图1与图2通过单应性变换进行了图片融合

图像扭曲(仿射变换)

图像扭曲即仿射变换。仿射变换变化包括缩放、平移、旋转、反射等,,原来的直线仿射变换后还是直线,原来的平行线经过仿射变换之后还是平行线。
仿射变换中一些性质会保持不变:
1.凸性
2.共线性:若几个点变换前在一条线上,则仿射变换后仍然在一条线上
3.平行性:若两条线变换前平行,则变换后仍然平行
4.共线比例不变性:变换前一条线上两条线段的比例,在变换后比例不变

from numpy import *
from matplotlib.pyplot import *
from scipy import ndimage
from PIL import Imageim = array(Image.open('11.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]))gray()
subplot(121)
imshow(im)
axis('off')
subplot(122)
imshow(im2)
axis('off')
show()

图中图

如下图所示,将一图融入了二图中,虽然图片有些扭曲但这就是该算法所需要呈现的效果。图像中的图像即为仿射扭曲的一个简单例子,它将图像或者图像的一部分放置在另一幅图像中,使得他们能够和指定的区域或者标记物对齐。为了能够实现更加精准的匹配,我们可以使用分段仿射扭曲。

from numpy import *
from matplotlib.pyplot import *
from scipy import ndimage
from PIL import Image
def Haffine_from_points(fp, tp):"""计算H仿射变换,使得tp是fp经过仿射变换H得到的"""if fp.shape != tp.shape:raise RuntimeError('number of points do not match')# 对点进行归一化(对数值计算很重要)# --- 映射起始点 ---m = mean(fp[:2], axis=1)maxstd = max(std(fp[:2], axis=1)) + 1e-9C1 = diag([1/maxstd, 1/maxstd, 1]) C1[0][2] = -m[0]/maxstdC1[1][2] = -m[1]/maxstdfp_cond = dot(C1,fp)# --- 映射对应点 ---m = mean(tp[:2], axis=1)C2 = C1.copy() # 两个点集,必须都进行相同的缩放C2[0][2] = -m[0]/maxstdC2[1][2] = -m[1]/maxstdtp_cond = dot(C2,tp)# 因为归一化后点的均值为0,所以平移量为0A = concatenate((fp_cond[:2],tp_cond[:2]), axis=0)U,S,V = linalg.svd(A.T)# 如Hartley和Zisserman著的Multiplr View Geometry In Computer,Scond Edition所示,# 创建矩阵B和Ctmp = V[:2].TB = tmp[:2]C = tmp[2:4]tmp2 = concatenate((dot(C,linalg.pinv(B)),zeros((2,1))), axis=1) H = vstack((tmp2,[0,0,1]))# 反归一化H = dot(linalg.inv(C2),dot(H,C1))return H / H[2,2]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 = 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_tim1 = array(Image.open('31.jpg').convert('L'))
im2 = array(Image.open('32.jpg').convert('L'))gray()
subplot(131)
imshow(im1)
axis('equal')
axis('off')
subplot(132)
imshow(im2)
axis('equal')
axis('off')# 选定一些目标点
tp = array([[264, 538, 540, 264], [40, 36, 605, 605], [1, 1, 1, 1]])im3 = image_in_image(im1, im2, tp)
subplot(133)
imshow(im3)
axis('equal')
axis('off')
show()

分段仿射扭曲

为了能够实现图像中角点的精确匹配,我们通常使用分段仿射扭曲。即首先通过三角化图像块再使用仿射扭曲来扭曲每个三角形,其中的核心部分即为图像块的三角化,可以通过狄洛克三角剖分实现,其具体如下:

from PIL import Image
from pylab import *
import numpy as np
from scipy.spatial import Delaunayx,y  = array(np.random.standard_normal((2,100)))
"""centers, edges, tri, neighbors = md.delaunay(x, y"""
tri = Delaunay(np.c_[x,y]).simplicesfigure()for t in tri:t_ext = [t[0],t[1],t[2],t[0]]plot(x[t_ext], y[t_ext], 'g')plot(x,y,'*')
axis('off')
show()

【python】图像映射:单应性变换与图像扭曲相关推荐

  1. Opencv学习笔记 透视变换/单应性变换

    1.透视变换概述 透视变换(Perspective Transformation),又称Homography Transformation. 在计算机视觉领域,空间中同一平面的任意两幅图像通过单应性关 ...

  2. 【备忘】Homographic Adaptation 单应性变换

    单应性变换是将一个平面内的点映射到另一个平面内的二维投影变换. 应用 单应性在计算机视觉领域是一个非常重要的概念,它在图像校正.视角变换.图像拼接.增强现实.相机位姿估计.视觉SLAM等领域有非常重要 ...

  3. 利用单应性变换方法将自动驾驶汽车拍的照片变换为鸟瞰图

    为什么需要转换为鸟瞰图呢? 因为在检测车道线,需要根据车道线宽度设计合适的滤波器进行噪声剔除,因为车载相机拍出来的图片近处的车道线较宽而远处的车道线较窄,所以需要将图片转换为鸟瞰图.这是车载相机拍摄的 ...

  4. 单应性变换与仿射变换

    经典的仿射变换 初始来自于 ABB实习的项目:目前看有关于多帧去噪论文 Burst Image Deblurring,发现论文作者使用单应性变换进行多帧图片之间的粗对齐. 1.详细的总结性文章 知乎专 ...

  5. 【opencv学习】单应性变换Homography

    import cv2 import numpy as np import pylab as pltif __name__ == '__main__':# 读取原始图像im_src = cv2.imre ...

  6. 缩放图像的单应性矩阵

    def trans_m(W,H,w_out,h_out,M):S1 = np.array([[w_out / W, 0, 0],[0, h_out / H, 0],[0, 0, 1]])S2 = np ...

  7. OpenCV-C++实现单应性矩阵的求解

    1. 单应性矩阵的理解 1.1 图像层面 单应性矩阵(Homography)约束了同一3D空间点在两个像素平面的2D齐次坐标. 单应性矩阵具有8个自由度,已知A和B两张图像上的四对点,即可列出八个方程 ...

  8. [计算机视觉] 一篇文章教你学会单应性矩阵Homography(Python/C++)

    0.国外原文链接 Homography examples using OpenCV ( Python / C ++ ) 1.什么是单应性? 考虑图中显示的平面.红点代表两个图像中的相同物理点.在计算机 ...

  9. 透视变换 单应性矩阵怎么求 matlab,单应性(homography)变换的推导

    矩阵的一个重要作用是将空间中的点变换到另一个空间中.这个作用在国内的<线性代数>教学中基本没有介绍.要能形像地理解这一作用,比较直观的方法就是图像变换,图像变换的方法很多,单应性变换是其中 ...

最新文章

  1. python教程第四版pdf下载-Python参考手册 第4版高清中文PDF下载
  2. 阿里P7亲自教你!我的头条面试经历分享,完整PDF
  3. Java学习笔记13--比较器(Comparable、Comparator)
  4. wxpython嵌入图片_将图片文件嵌入到wxpython代码中的实现方法
  5. Fedora 17配置ssh及Windows远程连接
  6. leetcode 448. 找到所有数组中消失的数字(Find All Numbers Disappeared in an Array)
  7. day02_20190106 基础数据类型 编码 运算符
  8. NYOJ题目325-zb的生日
  9. 惠普服务器驱动自动安装步骤,惠普系统安装步骤的【详细介绍】
  10. 计算机工作月度个人总结怎么写,计算机*学生个人实习工作总结范文
  11. 金蝶中间层服务器组件注册使用信任方式,提示:用户名或密码错误
  12. asp.net知识共享平台
  13. windows PC 连接Windows作为无线显示器
  14. L1-009 N个数求和---题解
  15. mysql字符集与校对规则设置_MySQL 字符集与校对规则
  16. java后门_整理的比较全的一句话后门代码(方面大家查找后门)
  17. QT自定义窗口,可拉伸
  18. redis相关 主从架构
  19. 【附源码】计算机毕业设计SSM小区物业管理系统
  20. record, packed record和变体记录

热门文章

  1. Java 数值大小比较
  2. 如何利用大数据指导市场营销
  3. 2022-2028年中国新能源公交车行业深度调研及投资前景预测报告
  4. 搜索引擎ElasticSearchV5.4.2系列二之ElasticSearchV5.4.2+kibanaV5.4.2+x-packV5.4.2安装
  5. [转]JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分
  6. 树形结构在关系数据库中的设计
  7. ASP.NET文件的下载
  8. Ubuntu换回Gnome界面
  9. 算法设计与分析第3章 贪心算法
  10. 学计算机技术基础B课件,大学计算机基础试题一