考虑图1所示的两个平面图像(书的顶部)。红点表示两个图像中相同的物理点。在计算机视觉术语中,我们把这些对应的点称为。图1.用四种不同的颜色显示四个对应的点-红色、绿色、黄色和橙色。一个单形是一种变换(3×3矩阵),它将一幅图像中的点映射到另一幅图像中的对应点。既然一个同形是一个3×3的矩阵,我们可以把它写成

在计算机视觉中,平面的单应性被定义为一个平面到另外一个平面的投影映射。因此一个二维平面上的点映射到摄像机成像仪上的映射就是平面单应性的例子。如果点Q到成像仪上的点q的映射使用齐次坐标,这种映射可以用矩阵相乘的方式表示。若有一下定义:

则可以将单应性简单的表示为:

这里引入参数s,它是任意尺度的比例(目的是使得单应性定义到该尺度比例)。

H有两部分组成:用于定位观察的物体平面的物理变换和使用摄像机内参数矩阵的投影。

物理变换部分是与观测到的图像平面相关的部分旋转R和部分平移t的影响之和,表示如下

这里R为3*3大小的矩阵,t表示一个一个3维的列矢量。

摄像机内参数矩阵用M表示,那么我们重写单应性如下:

我们知道单应性研究的是一个平面上到另外一个平面的映射,那么上述公式中的~Q,就可以简化为平面坐标中的~Q',即我们使Z=0。即物体平面上的点我们用x,y表示,相机平面上的点,我们也是用二维点表示。我们去掉了Z方向的坐标,那么相对于旋转矩阵R,R可以分解为R=[r1 r2 r3],那么r3也就不要了,参考下面的推导:

其中H为:

是一个3×3大小的矩阵.故最终的单应性矩阵可表示如下:

opencv是利用上述公式来计算单应性矩阵。它使用同一物体的多个图像来计算每个视场的旋转和平移,同时也计算摄像机的内参数。我们知道旋转和平移共6个参数,摄像机内参数为4个参数。对于每一个视场有6个要求解的新参数和4个不变的相机内参数。对于平面物体如棋盘,能够提供8个方差,即映射一个正方形到四边形可以用4个(x,y)来描述。那么对于两个视场,我们就有8*2=16=2*6+4,即求解所有的参数,至少需要两个视场。

为什么正方形到四边形的四个点的映射可以确定8个方程呢,结果是显然的,我们假设物体平面上的正方形的一个顶点坐标为(u,v),成像仪与该点对应的点坐标为(x,y),我们假设它们之间的关系如下:

u=f(x,y);

v=g(x,y);

显然,我们把四点的对应坐标带入到上述公式可以得到8个方程。

这里我们会想物体平面上正方形的四个顶点坐标如何确定,其实我们就可以理解为角点的个数,对于尺度的话,我们有s进行控制。对于图像平面上的角点的位置,我们可以可以通过寻找角点来定位他们的位置。其实对于具体的操作,由于还没细读代码和相关原理,在这里只能大体猜测一下。等日后学习了,再来纠正。

单应性矩阵H把源图像平面上的点集位置与目标图像平面上(通常是成像仪平面)的点集位置联系起来:

让我们考虑第一组对应的要点-在第一张图片中在第二张图片中。那么,“单字”以下列方式映射它们

基于单形的图像对齐

上述方程适用于所有对应的点集,只要它们位于现实世界中的同一平面上。换句话说,您可以将同调应用于第一个图像,而第一个图像中的书将与第二个图像中的书对齐!参见图2。

图2:三维平面的一幅图像可以使用“单形”对齐同一平面的另一幅图像

全景:单字的一种应用

如果已知两个图像之间的同调,我们可以将一个图像扭曲到另一个图像上。然而,有一个很大的警告。图像必须包含一个平面(一本书的顶部),并且只有平面部分是正确地对齐的。结果是,如果你拍摄了任何场景的照片(不仅仅是一个平面),然后通过旋转相机拍摄第二张照片,那么这两幅图像是由一个同调相关联的!换句话说,你可以把相机安装在三脚架上并拍照。接下来,在垂直轴周围进行平移,并拍摄另一张照片。你刚刚拍摄的两幅完全任意三维场景的图像是通过一个同调来关联的。这两个图像将共享一些共同的区域,可以对齐和缝合

如何计算单字?要计算两个图像之间的同源性,您需要知道这两个图像之间至少有4个点对应。如果你有四个以上的对应点,那就更好了。OpenCV将稳健地估计一个最适合所有对应点的同调。通常,这些点对应是通过匹配图像之间的SIFT或冲浪等功能自动找到的

单字”的应用:“单字”最有趣的应用无疑是制作全景图(即图像拼接和图像拼接)。全景图将在稍后的一篇文章中讨论。让我们看看其他一些有趣的应用程序。

ALPHA通道

阿尔法通道是一个8位的灰度通道,该通道用256级灰度来记录图像中的透明度信息,定义透明、不透明和半透明区域。如果一个像素的alpha通道数值为0,那它就是完全透明的(也就是看不见的),而数值为1则意味着一个完全不透明的像素(传统的数字图像)。我们常说的RGBA图像就是普通的RGB加上这个α通道。就是控制图像透明度,在下面的代码段中:
tp = array([[120,260,260,120],[16,16,305,305],[1,1,1,1]])

最后四个1就表示四个角点的透明度为不透明,以此实现图像的完全覆盖
(1)先导入使用到的两个模块:numpy和Python-OpenCV(cv2)

(2)定义了一个函数paste_ROI_to_image来完成透明素材的粘贴。函数中,先使用cv.resize函数来调整素材ROI的尺寸,使其和粘贴区域的尺寸是匹配的。x表示图像的列数,y表示图像中的行数。

(3)粘贴透明素材。

(4)显示粘贴结果。

粘贴素材的原理

首先,透明素材ROI具有透明度是因为它除了有RGB三个颜色通道以外,还有一个alpha通道我们粘贴透明图像时就利用到了这个通道。就是让image和ROI的RGB三个通道进行混合。

alpha通道的值取值范围是0-255。0表示完全透明,255表示完全不透明。

(1)alpha通道:

1: 将alpha通道值取值范围由0-255转换到0-1

alpha_image = image[y1:y2+1, x1:x2+1, 3]/255.0

alpha1_ROI = ROI[:,:,3]/255.0

2:  计算合成后的图像的透明度:

alpha = 1 - (1 - alpha_image)*(1 - alpha_ROI)

这个公式可以这么理解,剩余透明度(1 - alpha_image) 和(1 - alpha_ROI)混合后,得到的图像透明度。

(2)RGB通道:

image[R,G,B] = (image[R,G,B]*alpha_image*(1 - alpha_ROI) + ROI[R,G,B]*alpha_ROI)    / alpha

ROI是上层,其颜色的透出部分为 ROI[R,G,B]*alpha_ROI,然后按照最后合成图像的透明度分配比例,则ROI提供的RGB值为:

ROI[R,G,B]*alpha_ROI)    / alpha

image是底层,其颜色的透出部分为image[R,G,B]*alpha_image,而由于上层的ROI透过了alpha_ROI,留给image的只有(1 - alpha_ROI), 所以image提供的RGB值为:

image[R,G,B]*alpha_image*(1 - alpha_ROI)  / alpha

3)合并alpha通道和RGB通道

image[y1:y2+1, x1:x2+1, 3] = alpha*255
              image = image.astype(np.uint8)

代码:

 # -*- 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 im2im1 = array(Image.open('jmu.jpg').convert('L'))
im2 = array(Image.open('jmu1.jpg').convert('L'))
# set to points
tp = array([[120,260,260,120],[16,16,305,305],[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()

结果图:

Homography单应性矩阵原理相关推荐

  1. 计算机视觉学习笔记(四)homography 单应性矩阵的理解及求解

    单应性矩阵的理解及求解 1. 齐次坐标(Homogeneous Coordinate) 一幅2D图像上的非齐次坐标为(x,y),而齐次坐标为(x,y,1),也可以写成(x/z,y/z,1)或(x,y, ...

  2. Homography单应性矩阵程序实现

    单应性矩阵重要应用在求解两幅图像的映射关系,或者图像坐标与世界坐标的映射关系. 这里主要在张正有相机标定法的基础上,求解H. 具体理论为请点:相机标定法-张正有 Opencv程序实现 std::vec ...

  3. 关于单应性矩阵的理解:Homography matrix for dummies

    尽量写的通俗一点,因为从某种程度上讲,本人也是dummy..... 1. 先说homogeneous coordinate,齐次坐标 一幅2D图像上的非齐次坐标为(x,y),而齐次坐标为(x,y,1) ...

  4. 《增强现实:原理、算法与应用》读书笔记(1)基础矩阵、本质矩阵与单应性矩阵

    <增强现实:原理.算法与应用>读书笔记(1) 入坑增强现实,学长让我先把这本书看懂,看了一小半,确实有很多对数学要求挺高的地方,所以打算写个读书笔记,分享一些体会. 第三章:实景的三维结构 ...

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

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

  6. 单应性矩阵Homography计算和优化

    单应性矩阵,是用来描述两个平面之间的变换关系,是一个3x3的齐次矩阵. 图上的4个绿色的圈,两两可以对应,H可以表达第一张图变换到第二张图的转换关系.具体的表达式: aaa表示尺度信息,h1−h9h_ ...

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

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

  8. Homography matrix(单应性矩阵)在广告投放中的实践

    原文首发于微信公众号「3D视觉工坊」. 前言 由于近期在研究相机与投影仪的标定程序时,需要将结构光图片与灰点相机拍摄得到的图片中,找出角点之间的对应性,使用了如下一条代码: Mat HomoMatri ...

  9. Homography 估计单应性矩阵代码实现

    import cv2 import numpy as np # 读取图片 img1 = cv2.imread('01.jpg') img2 = cv2.imread('02.jpg')# 计算SURF ...

  10. 单应性矩阵求解函数findHomography()

    OPENCV官方地址:Camera Calibration and 3D Reconstruction 上面这个地址是OPENCV标定和三维重建集合的函数说明,包括标定原理,过程和工具的使用,想要使用 ...

最新文章

  1. 知乎好物推荐玩法介绍
  2. RO段、RW段和ZI段 转载:RO段、RW段和ZI段
  3. Redis:17---常用功能之(事务)
  4. 【Python笔记】AttributeError: module 'urllib3' has no attribute 'PoolManager'
  5. js中的instanceof运算符
  6. discuz门户文章增加代码高亮
  7. 淘宝客推广平台软件源码
  8. 分享学JavaScript的第七天
  9. ssd测试软件和实际 速度,固态硬盘实际速度比拼_三星 300E5K-Y05_笔记本评测-中关村在线...
  10. python去除\u3000,空格,\n等
  11. addonsmaker怎么制作_我的世界addons制作器
  12. three、vue中使用three、three怎么加载obj模型和mtl文件、three自定义800*800大小怎么拾取/点击
  13. 数学计算机教学课题,《运用信息技术,优化数学课堂教学》课题方案.doc
  14. HTML编写个人日记,HTML学习日记(1-基础)
  15. 相机的硬件接口以及传输协议介绍
  16. Substance Painter笔记:多显示器且多分辨率显示器时的设置
  17. 考研数二第十七讲 反常积分与反常积分之欧拉-泊松(Euler-Poisson)积分
  18. 企业线上培训直播平台如何选择?有何优势?
  19. 494. 目标和 - 01背包中装满背包有几种方法的问题
  20. VHDL例子说明Register寄存器,Multiplexer复用器,Add加法器,Latch锁存器

热门文章

  1. FTPS服务器搭建流程
  2. Android性能测试工具(一) 之Emmagee[转载]
  3. Abaqus中多层介质设置初始应力场(补充介绍)
  4. 《张宇考研数学基础30讲》思维导图-第1讲 高等数学预备知识
  5. 兼具教育耐心和AI匠心,看「网易有道词典笔2.0」的变革者角色
  6. Xshell远程连接配置 Ubuntu 18.04.6 + Anaconda + CUDA + Cudnn + Pytorch(GPU+CPU)
  7. TI深度学习(TIDL)--1
  8. python开根号_python开根号_python 开根号_python开根号函数 - 云+社区 - 腾讯云
  9. 用Python算出你的名字,比老僧算的更快!
  10. 虚拟机安装win10教程(详细版)