精华内容
下载资源
问答
  • 图像对齐

    2020-08-10 17:29:55
    在本文中,我们将学习如何使用OpenCV执行基于特征的图像对齐。 我们将通过一个示例演示这些步骤,其中将使用手机拍摄的表格照片与表格模板对齐。我们将使用的技术通常称为“基于特征的”图像对齐,因为在此技术中,...

    在本文中,我们将学习如何使用OpenCV执行基于特征的图像对齐。

    我们将通过一个示例演示这些步骤,其中将使用手机拍摄的表格照片与表格模板对齐。我们将使用的技术通常称为“基于特征的”图像对齐,因为在此技术中,一幅图像中检测到一组稀疏特征,并与另一幅图像中的特征匹配。然后根据这些匹配的特征(将一张图像扭曲到另一张图像)计算出一个转换。

    什么是图像对齐或图像配准?

    在许多应用程序中,我们具有相同场景或相同文档的两个图像,但是它们没有对齐。换句话说,如果您在一幅图像上选择一个要素(例如一个角点),则另一幅图像中相同角的坐标会非常不同。

    图像对齐(也称为图像配准)是使一个图像(或有时两个图像)变形以使两个图像中的特征完美对齐的技术。

    在这里插入图片描述
    图1.左:下载的表格。中心:填写的DMV表格,使用手机拍摄。右:将移动照片(中心)与原始模板(左)对齐的结果。

    在上面的示例中,我们左侧有一个来自汽车部门的表格。表格被打印,填写,然后使用手机(中心)照相。在此文档分析应用程序中,在进行任何分析之前,首先将表格的移动照片与原始模板对齐是有意义的。对齐后的输出如右图所示。

    图像对齐的应用

    图像对齐有许多应用。

    在许多文档处理应用程序中,第一步是将扫描或拍照的文档与模板对齐。例如,如果您要编写自动表单阅读器,则最好先将表单与表单模板对齐,然后根据模板中的固定位置读取字段。

    在某些医疗应用中,可以在稍有不同的时间进行组织的多次扫描,并且使用本教程描述的技术组合来记录两个图像。

    图像对齐最有趣的应用可能是创建全景图。在这种情况下,这两个图像不是平面的图像,而是3D场景的图像。通常,3D对齐需要深度信息。但是,当通过围绕相机的光轴旋转相机来拍摄两个图像时(如在全景图的情况下),我们可以使用本教程中介绍的技术来对齐全景图的两个图像。

    图像对齐:基础理论

    图像对齐技术的核心是称为Homography的简单3×3矩阵。有关单应性矩阵的Wikipedia条目看起来非常可怕。

    什么是单应性?

    场景的两个图像在两个条件下通过单应性关联。

    1. 这两个图像是飞机的图像(例如,纸,信用卡等)。
    2. 通过围绕相机的光轴旋转相机来获取两个图像。我们在生成全景时拍摄此类图像。

    如前所述,单应性就是3×3矩阵,如下所示。
    在这里插入图片描述
    我们x1y1(x_1,y_1)是第一个图像中的点, x2y2(x_2,y_2)是第二图像在同一个物理点的坐标。然后,Homography 通过以下方式将它们关联
    在这里插入图片描述
    如果知道单应性,则可以将其应用于一个图像的所有像素,以获得与第二个图像对齐的扭曲图像。

    如何寻找单应性矩阵?

    单应性示例图2.同一图的两个3D平面图像(本书顶部)通过单应性矩阵关联

    如果我们知道两个图像中有4个或更多对应点,则可以使用OpenCV函数findHomography查找单应性。上图中显示了四个对应点的示例。红色,绿色,黄色和橙色点是对应的点。

    利用函数findHomography,求解线性方程组以寻找单应性,但是在本文中,我们将不讨论该数学运算。

    python

    h, status = cv2.findHomography(points1, points2)
    

    其中,points1points2是对应点的向量/阵列,h是单应性矩阵。

    如何自动找到对应的点?

    在许多计算机视觉应用程序中,我们经常需要识别图像中有趣的稳定点。这些点称为关键点特征点。OpenCV中实现了多个关键点检测器(例如SIFT,SURF和ORB)。

    在本教程中,我们将使用**ORB特征检测器,**因为它是由我的前实验室工作人员Vincent Rabaud共同发明的。开玩笑!我们将使用ORB,因为SIFT和SURF已获得专利,如果要在实际应用中使用它,则需要支付许可费。ORB快速,准确且无许可证!

    下图使用圆圈显示了ORB关键点。

    在这里插入图片描述
    图3.用圆圈显示的ORB关键点的位置。

    ORB代表“FAST算法”和“BRIEF算法”。

    特征点检测器分为两部分

    1. 定位器:标识图像上的点,这些点在图像变换(例如平移(移位),缩放(大小增加/减小)和旋转)下是稳定的。定位器找到这些点的x,y坐标。ORB检测器使用的定位器称为FAST
    2. 描述符:上一步中的定位器仅告诉我们有趣的点在哪里。特征检测器的第二部分是描述符,该描述符对点的外观进行编码,以便我们可以区分另一个特征点。在特征点评估的描述符只是一个数字数组。理想情况下,两个图像中的相同物理点应具有相同的描述符。ORB使用名为BRISK的功能描述符的修改版本。

    当我们知道两个图像中的对应特征时,才能计算出两个图像的单应性。因此,使用匹配算法来查找一个图像中的哪些特征与另一图像中的特征匹配。为此,将一个图像中每个特征的描述符与第二个图像中每个特征的描述符进行比较,以找到良好的匹配。

    OpenCV图像对齐代码

    在本节中,我们介绍使用OpenCV进行图像对齐Python代码。

    基于特征的图像对齐的步骤

    现在,我们可以总结图像对齐中涉及的步骤。下面的描述引用了下一部分中的代码。

    1. 读取图像:我们首先Python代码的56-65 行中读取参考图像(或模板图像)以及我们要与该模板对齐的图像。

    2. 检测特征:然后,我们检测两个图像中的ORB特征。尽管我们仅需要4个特征即可计算出单应性,但是通常在两个图像中会检测到数百个特征。我们使用Python代码中的参数MAX_FEATURES控制功能的数量。Python代码中的第16-19行检测功能并使用**detectAndCompute**计算描述符。

    3. 匹配功能:Python的第21-34行中,

      我们在两个图像中找到了匹配的特征,并根据匹配的优劣对其进行了排序,仅保留了原始匹配的一小部分。最后,我们在图像上显示匹配良好的特征点与特征描述符。我们使用汉明距离作为两个特征描述符之间相似度的量度。

      下图通过画一条连接它们的线来显示匹配的特征。请注意,我们有许多不正确的匹配项,因此在下一步中,我们将需要使用可靠的方法来计算单应性。

    在这里插入图片描述

    图4.通过在它们之间画一条线来显示匹配的关键点。点击放大图片。匹配并不完美,因此我们需要一种可靠的方法来计算下一步的单应性。

    1. 计算单应性:当两个图像中有4个或更多对应点时,可以计算单应性。上一节中说明的自动匹配并不总是能产生100%准确的匹配。20%至30%的匹配不正确的情况并不少见。

      幸运的是,findHomography方法利用了一种称为随机样本一致性(RANSAC)的鲁棒估计技术,即使在存在大量不好匹配的情况下,该技术也能得出正确的结果。Python中的第36-45行在代码中完成了此任务。

    2. 扭曲图像:计算出正确的单应性后,可以将变换应用于一个图像中的所有像素,以将其映射到另一图像。这是使用OpenCV中的warpPerspective函数完成的。这是Python的第49行中完成的。

    代码实现:

    from __future__ import print_function
    import cv2
    import numpy as np
    
    
    MAX_FEATURES = 500
    GOOD_MATCH_PERCENT = 0.15
    
    
    def alignImages(im1, im2):
    
      # Convert images to grayscale
      im1Gray = cv2.cvtColor(im1, cv2.COLOR_BGR2GRAY)
      im2Gray = cv2.cvtColor(im2, cv2.COLOR_BGR2GRAY)
      
      # Detect ORB features and compute descriptors.
      orb = cv2.ORB_create(MAX_FEATURES)
      keypoints1, descriptors1 = orb.detectAndCompute(im1Gray, None)
      keypoints2, descriptors2 = orb.detectAndCompute(im2Gray, None)
      
      # Match features.
      matcher = cv2.DescriptorMatcher_create(cv2.DESCRIPTOR_MATCHER_BRUTEFORCE_HAMMING)
      matches = matcher.match(descriptors1, descriptors2, None)
      
      # Sort matches by score
      matches.sort(key=lambda x: x.distance, reverse=False)
    
      # Remove not so good matches
      numGoodMatches = int(len(matches) * GOOD_MATCH_PERCENT)
      matches = matches[:numGoodMatches]
    
      # Draw top matches
      imMatches = cv2.drawMatches(im1, keypoints1, im2, keypoints2, matches, None)
      cv2.imwrite("matches.jpg", imMatches)
      
      # Extract location of good matches
      points1 = np.zeros((len(matches), 2), dtype=np.float32)
      points2 = np.zeros((len(matches), 2), dtype=np.float32)
    
      for i, match in enumerate(matches):
        points1[i, :] = keypoints1[match.queryIdx].pt
        points2[i, :] = keypoints2[match.trainIdx].pt
      
      # Find homography
      h, mask = cv2.findHomography(points1, points2, cv2.RANSAC)
    
      # Use homography
      height, width, channels = im2.shape
      im1Reg = cv2.warpPerspective(im1, h, (width, height))
      
      return im1Reg, h
    
    
    if __name__ == '__main__':
      
      # Read reference image
      refFilename = "form.jpg"
      print("Reading reference image : ", refFilename)
      imReference = cv2.imread(refFilename, cv2.IMREAD_COLOR)
    
      # Read image to be aligned
      imFilename = "scanned-form.jpg"
      print("Reading image to align : ", imFilename);  
      im = cv2.imread(imFilename, cv2.IMREAD_COLOR)
      
      print("Aligning images ...")
      # Registered image will be resotred in imReg. 
      # The estimated homography will be stored in h. 
      imReg, h = alignImages(im, imReference)
      
      # Write aligned image to disk. 
      outFilename = "aligned.jpg"
      print("Saving aligned image : ", outFilename); 
      cv2.imwrite(outFilename, imReg)
    
      # Print estimated homography
      print("Estimated homography : \n",  h)
    

    结果:

    Reading reference image :  form.jpg
    Reading image to align :  scanned-form.jpg
    Aligning images ...
    Saving aligned image :  aligned.jpg
    Estimated homography : 
     [[ 1.40104964e+00 -2.02959669e-01 -7.41342584e+00]
     [ 2.25280216e-01  1.52880342e+00 -4.85162159e+02]
     [-6.39599712e-05  1.34896590e-04  1.00000000e+00]]
    

    在这里插入图片描述

    展开全文
  • 使图像对齐

    2019-01-24 15:20:16
    两幅图像其中一幅歪斜,对两幅对比,将歪斜的图像对齐
  • 深度图像和彩色图像对齐 原因:由于RGB图像数据与深度图像数据的空间坐标系是不同的,前者的原点是RGB摄像头,后者的原点是红外摄像头,因此两者会有相应的误差。没对齐之前的结果如下图所示:(执行这个 bin/cpp-...

    深度图像和彩色图像对齐

    原因:由于RGB图像数据与深度图像数据的空间坐标系是不同的,前者的原点是RGB摄像头,后者的原点是红外摄像头,因此两者会有相应的误差。没对齐之前的结果如下图所示:(执行这个 bin/cpp-capture,我用opencv显示的)

    执行bin/cpp-alignimages 实现图像对齐,如下图所示:

    对齐的原理:

           深度图上的2D点转换到世界坐标的3D点,世界坐标的3D点再投影到彩色图像上;如下图所示:

      

    代码如下:

    void alignmentDepthandColor(const Mat depth, const Mat color, const rs::device &dev)
    {
        rs::float2 pt_depth, pt_color; 
        rs::float3 pt3_depth, pt3_color;
        auto intrinDepth = dev.get_stream_intrinsics(rs::stream::depth);
        auto intrinColor = dev.get_stream_intrinsics(rs::stream::color);
        auto extrinsics = dev.get_extrinsics(rs::stream::depth, rs::stream::color);
        int y=0, x= 0;
        Mat mat = Mat::zeros(color.rows,color.cols,CV_8UC3);  
        for (int row=0; row<depth.rows; row++)
        {
            for (int col=0; col<depth.cols; col++)
            {
                 pt_depth.x = row;
                 pt_depth.y = col;
               //  cout<<"depth 2d: x="<<pt_depth.x<<",y="<<pt_depth.y<<endl;
                 pt3_depth = intrinDepth.deproject(pt_depth, depth.at<ushort>(row,col));
                // cout<<"depth 3d: x="<<pt3_depth.x<<",y="<<pt3_depth.y<<", z="<<pt3_depth.z<<endl;
                 pt3_color = extrinsics.transform(pt3_depth);
                 pt_color = intrinColor.project(pt3_color);
                // cout<<"color 2d: x="<<pt_color.x<<",y="<<pt_color.y<<endl;
                 
                 x = (int)pt_color.x;///(depth.at<ushort>(row,col)+1);
                 x = x<0? 0 : x;
                 x = x>depth.cols-1? depth.cols-1 : x;
                 y = (int)pt_color.y;///(depth.at<ushort>(row,col) + 1);
                 y = y<0? 0 : y;
                 y = y>depth.rows-1? depth.rows-1 : y;
                // cout<<"xy 2d: x="<<x<<",y="<<y<<endl;
                 for (int k=0; k<3; k++)
                 {
                     mat.at<Vec3b>(y, x)[k] = color.at<Vec3b>(row,col)[k];
                 }       
            }   
        }
        Mat color1,color2;
        transpose(mat, color1); //旋转
        flip(color1, color2,1); //水平镜像
        imshow("color1", color1);

        imshow("color2", color2);
        imwrite("color.bmp", color2);
        imshow("alignment", mat);
    }

    效果图:

    备注:

         最后一张图是彩色图与深度图对齐后的图像,对齐图像的大小变了,需要调整成同样大小。
    ————————————————
    版权声明:本文为CSDN博主「jay463261929」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/jay463261929/article/details/53582800

    展开全文
  • matlab开发-将深度图像与相应的彩色图像对齐。此程序将深度贴图与其颜色图像对齐,以用于基于图像的渲染应用程序
  • 图像对齐(image alignment)

    千次阅读 2019-09-15 20:14:50
    1、图像对齐的步骤 已知图像A和B,图像对齐的步骤: 提取图像A和B的特征 匹配图像A和B中的特征 求解图像A和B的对齐矩阵 2使用最小二乘求解对齐矩阵的问题 使用最小二乘求解对齐矩阵容易受到outliers的影响, ...

    1、图像对齐的步骤

    已知图像A和B,图像对齐的步骤:

    • 提取图像A和B的特征
    • 匹配图像A和B中的特征
    • 求解图像A和B的对齐矩阵

     

    2  使用最小二乘求解对齐矩阵的问题

    使用最小二乘求解对齐矩阵容易受到outliers的影响, 误差会很大。

     

    3 RANSAC(random sample consensus)算法

    3.1 思想

    假设一条线,计算非常接近这条线的局内点(inliers)的个数,在所有可能的假设线中,选择inliers最多的那条线。

     

    3.2 RANSAC(random sample consensus)算法步骤

    • 随机选取 s 个样本点
    • 根据这些样本点训练出一个模型
    • 对这个模型的 局内点计数
    • 以上步骤重复 N 次
    • 选择局内点最多的那个模型

    3.3 一些问题

    • 如何选择样本点的个数?

    ——训练样本所需的最小样本数

    • 假设局内点的概率为w(未知),模型选择s个点,运行N次,算法产生有用结果的概率为p, 求w

    ——选择 s 个点,均为局内点的概率:w^s

    ——至少有一个点为局外点的概率:1-w^s,即产生了一个不好的模型

    ——重复运行 N 次,都为不好的模型的概率:(1-w^s)^N,即没有产生有用结果的概率

    ——建立等式:1-p=(1-w^s)^N, 可以求解w。

    3.4 RANSAC 算法的优缺点

    3.4.1 优点

    • 简单
    • 应用范围广
    • 实用

    3.4.2 缺点

    • 参数需要微调
    • 需要很多次的迭代
    • 如果局内点的比例太低,会运行失败
    展开全文
  • 全景图:使用MATLAB进行图像对齐和拼接
  • 图像对齐(图像配准)方法记录

    千次阅读 2020-05-31 16:40:52
    图像对齐方法 1、基于ORB特征的方法 1、检测两张图的ORB特征点 2、特征匹配 3、计算单应性矩阵 4、扭转图片 具体的代码实现可以参考这篇文章:...

    图像对齐方法

    展开全文
  • 我们提出了一种新颖的基于地标匹配的多模态图像对齐方法,该方法可以通过解决不同特征模态之间的线性映射来唯一实现。 该线性映射导致对从不同模态捕获的图像的相似性进行新的测量。 此外,我们的方法通过最小化凸二...
  • intel realsense SR300 深度图像和彩色图像对齐

    万次阅读 热门讨论 2016-12-12 14:59:11
    1.深度图像和彩色图像对齐 原因:由于RGB图像数据与深度图像数据的空间坐标系是不同的,前者的原点是RGB摄像头,后者的原点是红外摄像头,因此两者会有相应的误差。若要修正这些误差,可以调用Kinect for windows ...
  • 旷视 R TALK:图像对齐及其应用 单应性Homograph估计:从传统算法到深度学习 1. 传统算法 大致流程: 提取特征点 特征匹配 RANSAC 排除错误匹配 求解单应性(Homograph)矩阵 难点: 弱纹理、无纹理(特征少,...
  • 1.1 什么是图像对齐或图像对准? 1.2 图像对齐的应用 1.3 图像对齐基础理论 1.4 如何找到对应点 2 OpenCV的图像对齐 2.1 基于特征的图像对齐的步骤 2.2 代码 3 参考 在这篇文章中,我们将学习如何使用OpenCV...
  • 思量许久,把这个版权属于自己的工作开源出来,耗4,5天写的一个基于多尺度ORB(orbslam2里面的orb)图像对齐,及金字塔多帧融合去噪开源出来。 适当修改应该够水一篇中文核心了,想发论文的同学请联系我qq:...
  • Python - OpenCV 基于特征的图像对齐

    千次阅读 2019-01-03 13:05:11
    机器视觉:基于特征的图像对齐(使用opencv和python)
  • 图像对齐相关资料

    2018-11-17 12:59:16
    该文件是我的博客:应用 OpenCV 进行 增强相关系数(ECC)最大化的图像配准 的相关资料,欢迎下载!
  • 在典型的图像对齐问题中,我们有两个场景图像,它们通过运动模型相关联。不同的图像对齐算法旨在使用不同的技巧和假设来估计这些运动模型的参数。一旦知道这些参数,将一个图像变形以使其与另一个图像对齐是直截了当...
  • 旷视算法负责人技术分享PPT,深入分析对比传统和深度学习在图像对齐方向的最新成果,尤其在产品化落地方向有重要借鉴意义。
  • 概述 本文主要内容来自参考资料《mage Alignment ...这里用到的技术被称为基于特征的图像对齐,因为在这种技术中,要在一个图像中检测到一组特征点,并与另一张图像中的特征点相匹配。然后根据这些匹配的特征...
  • kinect 深度彩色图像对齐的问题

    千次阅读 2016-04-07 14:45:32
    最近在用kinect和opencv做东西,遇到了深度和彩色图像不能对齐的... 图像对齐(KINECTSDK + OPENCV)http://blog.csdn.net/zjstxszqzwccbzt25/article/details/41511451或许会有帮助,正在努力应用中,希望会有好结果。
  • 针对图像对齐两大类方法的缺陷: 参数化方法 以单应性变换为代表,只能得到真实变换的一个近似(细节部分对齐不好)。 非参数化方法 以光流法为代表,局限于对非常相似的两张图像做像素级对齐变换。 1.2 方法...
  • 这是一段 StyleGAN(v2) 使用的人脸图像对齐代码,也可用于其他任务和其他人脸数据集的对齐。 import numpy as np from PIL import Image from tqdm import tqdm import os import json import matplotlib.pyplot ...
  • windows使用librealsense进行深度彩色图像对齐

    千次阅读 热门讨论 2017-05-24 09:05:45
    因为需要把realsense的深度图像对齐到彩色空间。 我知道官方的SDK中Projection.cpp的例子。 但是那个程序(C++版)是基于MFC框架写得,一看什么消息什么句柄我就懵比了,而且程序很复杂,我理不清。 也尝试过用...
  • 北京时间12月18日(周三)晚8点,旷视成都研究院负责人刘帅成博士,将在将门技术社群在线进行技术分享,主题为“图像对齐技术及其应用”。这次分享中,他将会介绍图像对齐领域的发展现状和主要面...
  • GDAL安装 图像对齐

    2020-11-30 19:43:07
    Python版本的GDAL 安装 - wenglabs - 博客园 (cnblogs.com)
  • 使用OPENCV3图像对齐

    万次阅读 2016-12-15 15:27:19
    右:对齐图像 1. 左边的图像是一个具有历史意义的照片的集合称为Prokudin-Gorskii集。图像是由使用一个早期的彩色摄像机拍摄。因为相机的机械性质,图像的颜色通道未对齐。右边的图像通过OPENCV3进行对齐后的图像...
  • 代码来自RS的Example 用的都是API… ## License: Apache 2.0. See LICENSE file in root directory. ## Copyright(c) 2017 Intel Corporation.... ###################################################...
  • preserveAspectRatio 允许我们指定被缩放的图像相对视口的对齐方式,以及是希望它适配边缘还是裁剪。这一属性的模型为: preserveAspectRatio = “alignment [meet | slice]” 如果不保留长宽比,可设置: ...
  • 2 使用增强相关系数最大化(ECC)的图像对齐 2.1 findTransformECC在OpenCV中的示例 2.2 重建Prokudin-Gorskii系列图像 3 参考 上面左边的图像是由Prokudin-Gorskii拍摄的历史系列照片中的一部分。这张照片...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,737
精华内容 1,094
关键字:

图像对齐