精华内容
下载资源
问答
  • 图像匹配

    千次阅读 2018-12-29 11:22:06
    在图像配准之后,模板图像和被检测图像之间的各种特征就能对应起来,还要继续提取缺陷像素点,即找到模板图与待检图之间的区别。这时候的做法成为图像匹配,常见的匹配方法有相关法和差影法。...

    在图像配准之后,模板图像和被检测图像之间的各种特征就能对应起来,还要继续提取缺陷像素点,即找到模板图与待检图之间的区别。这时候的做法成为图像匹配,常见的匹配方法有相关法和差影法。

    展开全文
  • 图像处理之图像匹配

    千次阅读 2019-08-07 22:19:52
    该说图像匹配了,图像匹配在图片处理中的作用举重若轻,今天就带大家入门图像匹配,简单介绍一下基础的图像匹配吧。 何为图像匹配呢?在原图片中扣出一块区域,然后通过这块区域的像素找到它在原始图片的位置,在...

    该说图像匹配了,图像匹配在图片处理中的作用举重若轻,今天就带大家入门图像匹配,简单介绍一下基础的图像匹配吧。

    何为图像匹配呢?在原图片中扣出一块区域,然后通过这块区域的像素找到它在原始图片的位置,在今天所讲的是如此。

    来看看百度百科给下的定义吧: 通过对影像内容、特征、结构、关系、纹理及灰度等的对应关系,相似性和一致性的分析,寻求相似影像目标的方法。

    **1.**通过欧式距离来匹配图像。

    将所有像素值看成一个坐标(不用管它是多少维的),通过最小化这两个坐标的欧式距离来确定最终在原始图像上匹配的位置。
    欧式距离公式为:
    在这里插入图片描述
    下面通过代码来演示如何实现

    import cv2 
    import numpy as np
    
    def Distance(x,y):   #计算欧式距离
    	x = np.array(x)
    	y = np.array(y)
    	return np.sqrt(np.sum((x-y)*(x-y)))
    img1 = cv2.imread('1.jpg')  #原始图片
    img2 = img1[300:400,300:400]  #要匹配的区域
    
    h = img2.shape[0]
    w = img2.shape[1]
    mins = le5   距离的最小值
    for i in range(0,img1.shape[0]-h):  #遍历图片
    	for j in range(0,img1.shape[1]-w):
    			dist = img1[i:i+h,j:j+w]
    			loss = Distance(dist,img2)
    			if loss < mins:
    				now_h = i
    				now_w = j     #记住当前目标区域左上角的位置
    				mins = loss   #更新最小值
    
    cv2.rectangle(img1,(now_w,now_h),(now_w+w,now_h+h),(255,0,0))
    cv2,imshow('dist',img1)
    cv2,waitKey(0)
    
    
    

    2.通过差分矩阵求和 均值来匹配

    原理: 目标区域的像素值 - 模板区域的像素值,然后根据其和的大小 或者 其均值的大小来确定目标区域。

    下面直接通过代码来演示

    import cv2
    import numpy as np
    img1 = cv2.imread("1.jpg")
    img2 = img1[100:250,200:350]
    h , w = img2.shape[:2]
    findpt = []
    for i in range(0,img1.shape[0]-h):
        for j in range(0,img1.shape[1]-h):
        	com = img1[i:i+h,j:j+w] - img2
        	if np.mean(com)<20:    #np.sum(com) <1
        	findpt.append(i)
        	findpt.append(j)
        	break
     if len(findpt)>0:
        cv.rectangle(img1,(findpt[1],findpt[0]),(findpt[1]+w,findpt[0]+h),(255,0,0))
    
    cv.imshow('dsts',img1)
    cv.waitKey(0) 
    

    今天的图像匹配的入门基础讲解就说到这里了,下次再见。

    Thank for your reading !!!!

    展开全文
  • opencv之SURF图像匹配

    万次阅读 多人点赞 2017-04-19 14:04:11
    1.概述前面介绍模板匹配的时候已经提到模板匹配时一种基于灰度的匹配方法,而基于特征...接下来将更深一步介绍利用Surf检测到的特征点以及匹配对进行图像匹配. 利用Surf算法进行图像匹配其一般流程为:检测物体特征点

    1.概述

    前面介绍模板匹配的时候已经提到模板匹配时一种基于灰度的匹配方法,而基于特征的匹配方法有FAST、SIFT、SURF等,上面两篇文章已经介绍过使用Surf算法进行特征点检测以及使用暴力匹配(BruteForceMatcher)和最近邻匹配(FLANN)两种匹配方法。接下来将更深一步介绍利用Surf检测到的特征点以及匹配对进行图像匹配.
    利用Surf算法进行图像匹配其一般流程为:检测物体特征点->计算特征点描述子->使用BurteForceMatcher或FLANN进行特征点匹配->匹配到的特征点进行透视变换findHomography()->透视矩阵变换perspectiveTransform()->绘制匹配物体轮廓

    2. OpenCV API

    透视变换
    findHomography()
    这个函数的作用是在图像原平面和目标图像平面之间寻找并返回一个透视变换矩阵H,如下:

    所以反向投影误差

    最小化。如果参数metchod被设置为默认值0,改函数使用所有的点以简单的最小二乘法计算一个初始的单应估计。可以简单理解为透视变换矩阵就是把一幅图像从一个空间变换到另一个空间所需要进行旋转平移而进行加权的矩阵。
    但是并不是所有的点匹配对(srcPoints_i, dstPoints_i)都适合使用刚性的透视变换(有些异常值),这样变换得到的透视矩阵误差较大。在这种情况下可以使用两种鲁棒的方法RANSAC和LMeDS,尝试使用很多对应匹配点的随机子集,使用该子集和最简单的最小二乘法估计单应性矩阵,然后计算得到的透视变换矩阵的质量/好坏(quality/goodness),然后使用最佳子集来计算单应性矩阵的初始估计矩阵和内在值/异常值(inliers/outliers)的掩码。
    不管方法是否具有鲁棒性,使用Levenberg-Marquardt方法进一步精确计算单应性矩阵(如果方法具有鲁棒性仅使用内在值(inline))来减少再投影误差。
    RANSAC几乎可以处理任意比例的异常值,但是它需要一个阈值来区分内在值还是异常值。LMeDS不需要任何阈值,但是只有在内在值比例大于50%的情况下才能准确计算。如果没有太多异常值,噪声有比较小的情况下使用默认方法即可
    函数用来查找初始的内在和外在矩阵,透视变换矩阵确定了一个比例.无论何时如果不能估计H矩阵则函数将返回一个空矩阵

    Mat cv::findHomography  (   InputArray  srcPoints,
                                InputArray  dstPoints,
                                int     method = 0,
                                double  ransacReprojThreshold = 3,
                                OutputArray     mask = noArray(),
                                const int   maxIters = 2000,
                                const double    confidence = 0.995 
                            )
    

    srcPoints:原平面对应点,可以是CV_32FC2或vector类型的矩阵。
    dstPoints:目标平面对应点,可以是CV_32FC2或vector类型的矩阵
    method:用于计算矩阵的方法,可选方法上面已经介绍过有默认值0,CV_RANSAC和CV_LMEDS
    ransacReprojThreshold:有默认值3,区分内在值还是异常值的阈值点,只在RANSAC方法有用,当||dstPoints-convertPointsHomogeneous(H*srcPoints)||>ransacReprojThreshold,这个点就会被认为是异常值(outlier).如果srcPoints和dstPoints是以像素为单位,则参数的取值范围一般在1-10之间。
    mask:可选参数,有默认值noArray(),通过鲁棒性方法(RANSAC或LMEDS)设置输出掩码。
    函数另一种定义形式如下:

    Mat cv::findHomography  (   InputArray  srcPoints,
                                InputArray  dstPoints,
                                OutputArray     mask,
                                int     method = 0,
                                double  ransacReprojThreshold = 3 
                            )   
    

    求得的透视矩阵是一个3x3的变换矩阵。

    perspectiveTransform()
    函数能够进行向量透视矩阵变换。

    void cv::perspectiveTransform   (   InputArray  src,
                                        OutputArray     dst,
                                        InputArray  m 
                                    )
    

    src:双通道或三通道浮点型原图像或数组,每个元素都是二维或三维可被转换的向量。
    dst:目标数组或图像,与原图像有相同的尺寸和类型
    m:变换矩阵,为3x3或4x4的浮点型矩阵

    3.示例代码

    #include <iostream>
    #include <stdio.h>
    #include <opencv2\core\core.hpp>
    #include <opencv2\highgui\highgui.hpp>
    #include <opencv2\imgproc\imgproc.hpp>
    #include <opencv2\nonfree\features2d.hpp>
    #include <opencv2\calib3d\calib3d.hpp>
    
    using namespace std;
    using namespace cv;
    
    int main()
    {
        Mat image_object = imread("match_src.jpg", IMREAD_GRAYSCALE);
        Mat image_scene = imread("match_dst.jpg", IMREAD_GRAYSCALE);
    
        //判断图像是否加载成功
        if (image_object.empty() || image_scene.empty())
        {
            cout << "图像加载失败";
            return -1;
        }
        else
            cout << "图像加载成功..." << endl << endl;
    
        //检测特征点
        const int minHessian = 700;
        SurfFeatureDetector detector(minHessian);
        vector<KeyPoint>keypoints_object, keypoints_scene;
        detector.detect(image_object, keypoints_object);
        detector.detect(image_scene, keypoints_scene);
    
        //计算特征点描述子
        SurfDescriptorExtractor extractor;
        Mat descriptors_object, descriptors_scene;
        extractor.compute(image_object, keypoints_object, descriptors_object);
        extractor.compute(image_scene, keypoints_scene, descriptors_scene);
    
        //使用FLANN进行特征点匹配
        FlannBasedMatcher matcher;
        vector<DMatch>matches;
        matcher.match(descriptors_object, descriptors_scene, matches);
    
        //计算匹配点之间最大和最小距离
        double max_dist = 0;
        double min_dist = 100;
        for (int i = 0; i < descriptors_object.rows; i++)
        {
            double dist = matches[i].distance;
            if (dist < min_dist)
            {
                min_dist = dist;
            }
            else if (dist > max_dist)
            {
                max_dist = dist;
            }
        }
        printf("Max dist: %f \n", max_dist);
        printf("Min dist: %f \n", min_dist);
    
        //绘制“好”的匹配点
        vector<DMatch>good_matches;
        for (int i = 0; i < descriptors_object.rows; i++)
        {
            if (matches[i].distance<2*min_dist)
            {
                good_matches.push_back(matches[i]);
            }
        }
        Mat image_matches;
        drawMatches(image_object, keypoints_object, image_scene, keypoints_scene, good_matches, image_matches,
            Scalar::all(-1), Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
    
        //定位“好”的匹配点
        vector<Point2f> obj;
        vector<Point2f> scene;
        for (int i = 0; i < good_matches.size(); i++)
        {
            //DMathch类型中queryIdx是指match中第一个数组的索引,keyPoint类型中pt指的是当前点坐标
            obj.push_back(keypoints_object[good_matches[i].queryIdx].pt);
            scene.push_back(keypoints_scene[good_matches[i].trainIdx].pt);
        }
    
        Mat H = findHomography(obj, scene, CV_RANSAC);
        vector<Point2f> obj_corners(4), scene_corners(4);
        obj_corners[0] = cvPoint(0, 0);
        obj_corners[1] = cvPoint(image_object.cols, 0);
        obj_corners[2] = cvPoint(image_object.cols, image_object.rows);
        obj_corners[3] = cvPoint(0, image_object.rows);
    
        perspectiveTransform(obj_corners, scene_corners, H);
    
        //绘制角点之间的直线
        line(image_matches, scene_corners[0] + Point2f(image_object.cols, 0),
            scene_corners[1] + Point2f(image_object.cols, 0), Scalar(0, 0, 255), 2);
        line(image_matches, scene_corners[1] + Point2f(image_object.cols, 0),
            scene_corners[2] + Point2f(image_object.cols, 0), Scalar(0, 0, 255), 2);
        line(image_matches, scene_corners[2] + Point2f(image_object.cols, 0),
            scene_corners[3] + Point2f(image_object.cols, 0), Scalar(0, 0, 255), 2);
        line(image_matches, scene_corners[3] + Point2f(image_object.cols, 0),
            scene_corners[0] + Point2f(image_object.cols, 0), Scalar(0, 0, 255), 2);
    
        //输出图像
        namedWindow("匹配图像", WINDOW_AUTOSIZE);
        imshow("匹配图像", image_matches);
        waitKey(0);
    
        return 0;
    }

    程序说明
    在定位匹配点中用到了DMatch的queryIdx、trainIdx成员变量和keyPoint的成员变量pt,做个说明:
    DMatch有三个构造函数,其中一组如下:

    cv::DMatch::DMatch  (   int     _queryIdx,  //在对描述子匹配时,第一组特征点的索引
                            int     _trainIdx,  //在对描述子匹配时,第二组特征点的索引
                            int     _imgIdx,    //多个图像中图像的索引
                            float   _distance   //两个特征向量间的欧氏距离,越小表明匹配度越高
                        )
    

    对于keyPoint类有两种构造形式如下:

    cv::KeyPoint::KeyPoint  (   Point2f     _pt,
                                float   _size,
                                float   _angle = -1,
                                float   _response = 0,
                                int     _octave = 0,
                                int     _class_id = -1 
                            )
    cv::KeyPoint::KeyPoint  (   float   x,
                                float   y,
                                float   _size,
                                float   _angle = -1,
                                float   _response = 0,
                                int     _octave = 0,
                                int     _class_id = -1 
                            )
    

    两种形式在本质上是一样的,只是第一种形式中的特征点坐标pt在第二种形式中以x和y的形式给出。
    pt关键点坐标
    size是关键点邻域直径
    angle特征点方向,范围为[0,360),负值表示不使用
    response关键点检测器对于关键点的响应程度
    octave关键点位于图像金字塔的层
    class_id用于聚类的id

    运行结果

    展开全文
  • 图像匹配算法

    千次阅读 2018-12-02 14:46:02
    图像匹配算法分为3类:基于灰度的匹配算法、基于特征的匹配算法、基于关系的匹配算法 (1)基于灰度的模板匹配算法:模板匹配(Blocking Matching)是根据已知模板图像到另一幅图像中寻找与模板图像相似的子图像。...

    图像匹配算法分为3类:基于灰度的匹配算法、基于特征的匹配算法、基于关系的匹配算法

    (1)基于灰度的模板匹配算法:模板匹配(Blocking Matching)是根据已知模板图像到另一幅图像中寻找与模板图像相似的子图像。基于灰度的匹配算法也称作相关匹配算法,用空间二维滑动模板进行匹配,不同匹配算法主要体现在相关准则的选择方面,常见的基于模板的匹配算法可以参考下面的链接:

    参考:http://blog.csdn.net/hujingshuang/article/details/47759579

    (2)基于特征的匹配算法:首先提取图像的特征,再生成特征描述子,最后根据描述子的相似程度对两幅图像的特征之间进行匹配。图像的特征主要可以分为点、线(边缘)、区域(面)等特征,也可以分为局部特征和全局特征。

    区域(面)特征提取比较麻烦,耗时,因此主要用点特征和边缘特征。

    点特征包括:Harris 、Moravec、KLT、SIFT、SURF 、BRIEF、SUSAN、FAST、CENSUS、FREAK(点击打开链接)、BRISK(点击打开链接)、ORB、光流法(点击打开链接)、A-KAZE等。

    边缘特征包括:LoG算子、Robert算子、Sobel算子、Prewitt算子、Canny算子等。

     光流法:

    (3)基于关系的匹配算法:建立语义的网络,是人工智能领域在图像处理中的应用,但还没有突破性的进展。

     

    立体匹配:左右相机的匹配,用基于灰度的模板匹配方法,对所有的像素点匹配。

    跟踪匹配:前后帧的匹配,用基于特征的匹配算法,对特征点进行匹配,然后根据几个匹配的特征点计算出相机的位姿。

    转载自:https://blog.csdn.net/kinbosong/article/details/70184485

    展开全文
  • 加几个参数调节) 这里还要说明一个问题,有些人询问二郎为啥校正后图像会被截去很多,这里有几个原因: 1)相机畸变较大,两个相机的摆放位置偏差较大,截去较多是正常现象,不影响后期的匹配和距离计算。...
  • Matlab图像匹配与Retinex图像增强

    千次阅读 多人点赞 2018-04-02 17:22:25
    基于向量相关的图像匹配的Matlab实现 close all;clear all;clc; reource_p=imread('1.jpg');%含模板的图像 reource_p_sub=imread('2.jpg'); %模板图像 if size(reource_p,3)==3 reo...
  • 基于OpenCV的图像匹配----模板匹配(一)

    万次阅读 多人点赞 2019-04-27 10:32:16
    原图像:我们期望找到与模板图像匹配的图像 模板图像:将于模板图像进行比较的图像 一次移动一个像素(从左到右,从上到下)。在每个位置,计算相似度度量,以便它表示在该位置处的匹配的“好”还是“坏”。 ...
  • 请问各位大神,图像匹配,模板匹配有哪些较新或较热的研究方向,如果侧重工业检测方面,图像匹配是不是要简单些
  • 图像匹配 一些基本算法

    万次阅读 多人点赞 2018-08-26 14:28:06
     本文主要介绍几种基于灰度的图像匹配算法:平均绝对差算法(MAD)、绝对误差和算法(SAD)、误差平方和算法(SSD)、平均误差平方和算法(MSD)、归一化积相关算法(NCC)、序贯相似性检测算法(SSDA)、hadamard...
  • 数字图像处理学习(2)—— 直方图均衡与图像匹配1. 直方图均衡(Histogram Equalization)1.1 直方图均衡化概念1.2 直方图均衡实现简单思路1.3 直方图均衡实现代码2.4 结果展示2. 图像匹配(图像规定化)2.1 图像...
  • 图像匹配论文总结(一)

    千次阅读 2019-11-21 10:55:42
    论文总结一、Image Registration Methods二...(1)图像匹配应用: different viewpoint different time different sensor scene to model registration(目标模板图像与实时图像匹配) (2)步骤: Feature det...
  • 图像基础6 图像匹配--欧氏距离匹配

    千次阅读 2017-07-29 21:39:22
    一、 强噪声图像匹配上一节里,使用差分算法可以在弱噪声的情况下,有较好的匹配效果。在强噪声时,欧氏距离匹配方法相对于上面的方法会有更好的效果。程序:# -*- coding: utf-8 -*- import cv2 import numpy as ...
  • 图像匹配之距离变换匹配法

    千次阅读 2017-08-02 17:14:17
    图像匹配之距离变换匹配法 (重点)  基于距离变换的靶图像匹配 距离变换是一种常见的二值图像处理算法,用来计算图像中任意位置到最近边缘点的距离,常见的距离测度函数有切削距离,街区距离和欧式距。切削...
  • ORB图像匹配

    千次阅读 2014-03-30 16:52:29
    最近在看图像匹配方面的资料,图像匹配的主要步骤是: 1.提取特征点:在两张待匹配的图像中寻找最容易识别的像素点,如角点或者纹理丰富的物体边缘点。 2.特征点描述子:对于检测出的特征点,用一些数学上的特征对...
  • 图像匹配之归一化积相关灰度匹配

    千次阅读 2015-09-11 20:28:36
    图像匹配之最简单的归一化积相关灰度匹配,我的代码
  • 图像匹配几种常见算法与实践

    千次阅读 2020-08-07 19:05:18
    奇技 · 指南本文主要内容1.模版匹配2.特征匹配3.深度学习去找目标图像匹配的应用及背景图像匹配是指通过一定的匹配算法在两幅或多幅图像之间识别同名点。应用:遥感(制图更新),计算机视觉...
  • 图像匹配的方法主要分为基于灰度值相关和基于特征提取。 基于像素匹配: 基于灰度值相关的方法直接对原图和模板图像进行操作,通过区域属性(灰度信息或频域分析等)的比较来反映他们之间的相似性。基于灰度的...
  • SFM中的图像匹配问题

    千次阅读 2018-08-11 21:09:30
    1.SFM中图像匹配中问题描述 在slam中或者sfm中都会遇到图像匹配的问题,slam是实时的,所以基本上就是两两帧之间的在做匹配,而sfm是离线模式,给你一推照片,自己去在里面找到匹配的对象。所以在这个问题上,图像...
  • 图像匹配matlab程序设计:1. 概念解释,2.数字图像匹配算法设计:⑴基于灰度的归一化匹配算法⑵基于灰度的快速模板匹配算法。三.相应matlab程序设计:1.数字图像匹配相关函数 2.数字图像匹配函数:(1) 基于灰度的...
  • OpenCV图像匹配算法之brisk

    千次阅读 2015-01-09 10:28:32
    OpenCV图像匹配算法之brisk
  • OpenCV图像匹配算法之freak

    千次阅读 2015-01-09 10:32:19
    OpenCV图像匹配算法之freak
  • 数据集-图像匹配

    千次阅读 2018-10-17 08:12:21
    CALVIN research group ...图像匹配的数据集 这个数据集是在论文看到: CODE: Coherence Based Decision Boundaries for Feature Correspondence 论文内容: 适用:较宽基线的匹配 模型: 测试: ...
  • 根据图像匹配实现鼠标自动点击

    千次阅读 2019-07-31 09:58:28
    今天做自动化时碰到IE里面套用Google,无法获得句柄和URL,只能用图像匹配的思想来完成自动点击,本程序用到了几个包和包在安装过程中遇到的麻烦再其他博客都写到了。 pip install Pillow pip install opencv_python...
  • 图像匹配之序贯相似性检测法匹配

    千次阅读 2014-04-17 15:41:14
    图像匹配计算量大的原因在于搜索窗口za
  • 基于深度学习的图像匹配技术

    千次阅读 2019-08-04 22:02:29
    基于深度学习的图像匹配技术专题- [patch based matching6]-将匹配进行到底 https://blog.csdn.net/aaron121211/article/details/79236536 基于深度学习的图像匹配技术专题- [patch based matching5]-手把手教你...
  • opencv图像匹配算法

    千次阅读 2016-04-08 14:37:40
    opencv图像匹配算法 刚安装好OpenCV2.4.9版本,将sample中的matching_to_many_images.cpp例子拿来跑一跑。结果编译运行之后出现了一个bug,FeatureDetector::create( detectorType )返回值总为空,detectorType 值...
  • Opencv下利用SIFT、SURF、ORB三种特征点实现图像匹配

    万次阅读 多人点赞 2017-01-13 14:23:13
    Opencv下利用SIFT、SURF、ORB三种特征点实现图像匹配视频项目中要用到拼接,这里记录一下SIFT、SURF、ORB三种特征点。 本文不做过多的理论解释,只是利用opencv简单实现三种特征点匹配算法的验证(改进的部分暂未...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 181,738
精华内容 72,695
关键字:

图像匹配