Homography单应性矩阵原理

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

 

  

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

https://img-blog.csdn.net/20131204193157421

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

https://img-blog.csdn.net/20131204193317578

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

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

https://img-blog.csdn.net/20131204205302359

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

https://img-blog.csdn.net/20131204201405765

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

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

https://img-blog.csdn.net/20131204201633859

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

https://img-blog.csdn.net/20131204202421015

其中H为:

https://img-blog.csdn.net/20131204202643343是一个3×3大小的矩阵.故最终的单应性矩阵可表示如下:

https://img-blog.csdn.net/20131204203356375

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把源图像平面上的点集位置与目标图像平面上(通常是成像仪平面)的点集位置联系起来:

https://img-blog.csdn.net/20131204210229875

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

  

基于单形的图像对齐

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

im1 = 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()

结果图:

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 单应性矩阵也被称为单应性变换矩阵,是指一个平面上的点通过一个矩阵的变换后,被映射到另一个平面上的点。在Matlab中,可以通过使用homography函数来求解单应性矩阵。 具体步骤如下: 1.准备待变换的点集。在Matlab中,可以通过使用ginput函数在图像上手动选择需要变换的点集。 2.通过使用findHomography函数来计算单应性矩阵。该函数需要输入两个点集,分别是待变换的点集和变换后的点集。 3.输出单应性矩阵。findHomography函数将会输出一个3x3的矩阵,即单应性矩阵。 需要注意的是,单应性矩阵通常通过二维点集之间的对应关系来求解。因此,在选择点集时,需要确保两个点集中的点数相同,并且在相应的位置上是一一对应的。 另外,由于单应性矩阵的求解涉及到矩阵运算,因此在实际应用中可能存在数值计算误差。为了减小误差,可以尝试使用更为精确的数值计算方法,比如SVD分解等。 ### 回答2: 在计算机视觉领域中,单应性矩阵是指两个平面上的点集之间的一种变换关系。在MATLAB中,求解单应性矩阵可以使用HOMOG函数。 使用HOMOG函数,需要输入两个平面上的点集,其中第一组点为原图像上的点,第二组点为目标图像上对应的点。例如: ```matlab points1 = [16 20; 28 46; 234 36; 222 254]; points2 = [17 22; 29 49; 236 35; 223 257]; H = homog(points1, points2) ``` 这里,我们定义了两个点集`points1`和`points2`,然后使用HOMOG函数求解单应性矩阵,并将结果存储在变量H中。 在MATLAB中,HOMOG函数可以通过“Computer Vision Toolbox”获得。如果没有安装此工具箱,可通过以下命令进行安装: ```matlab matlab.addons.toolbox.install('computer-vision') ``` 此命令将从MATLAB Add-Ons库中下载和安装此工具箱。 总之,在MATLAB中求解单应性矩阵可以使用HOMOG函数,需要提供两个平面上的对应点集。 ### 回答3: 单应性矩阵是一种用于计算图像变形的矩阵,通常用于计算摄影和计算机视觉中的问题。MATLAB是一个强大的科学计算软件,可以用来求解单应性矩阵。下面是求解单应性矩阵的步骤: 首先,需要获取两幅图像上的对应点,这些点应该具有一一对应关系。 接下来,需要使用这些对应点来计算单应性矩阵。MATLAB中可以使用“estimateGeometricTransform”函数来计算单应性矩阵。该函数的输入参数包括对应点的坐标和单应性矩阵的类型。输出参数为单应性矩阵。 最后,可以使用计算出的单应性矩阵来变换图像。在MATLAB中,可以使用“imwarp”函数来变换图像。该函数的输入参数包括需要变换的图像和计算出的单应性矩阵。输出参数为变换后的图像。 需要注意的是,在计算单应性矩阵时,对应点应该足够多且分布均匀,否则计算出的单应性矩阵可能有误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值