100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Homography单应性矩阵原理

Homography单应性矩阵原理

时间:2021-09-07 19:59:57

相关推荐

Homography单应性矩阵原理

考虑图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, homographyfrom PIL import Imagefrom 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 pointstp = 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 im1m,n = im1.shape[:2]fp = array([[0,m,m,0],[0,0,n,n],[1,1,1,1]])# first triangletp2 = tp[:,:3]fp2 = fp[:,:3]# compute HH = 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 trianglealpha = warp.alpha_for_triangle(tp2,im2.shape[0],im2.shape[1])im3 = (1-alpha)*im2 + alpha*im1_t# second triangletp2 = tp[:,[0,2,3]]fp2 = fp[:,[0,2,3]]# compute HH = 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 trianglealpha = warp.alpha_for_triangle(tp2,im2.shape[0],im2.shape[1])im4 = (1-alpha)*im3 + alpha*im1_tsubplot(144)imshow(im4)axis('off')show()

结果图:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。