引言:在利用显微镜观测量物体的长度时,其精度非常高,然而,其行程却有限。一个测量较长物体的长度时,一种方法是在物体的左侧开始拍摄图像,然后移动相机(或者物体),再拍图像,直到拍摄到物体的右侧为止。对于其中拍摄的相邻的图像,如下图所示(图片由余师兄提供),需要计算它们的运动距离。

模板匹配:对于上面的图像,可以明显看出其往右移了,但对于精密测量来讲,求其移动的距离并精确到像素级非常重要。方法是在右图像上移动左图像,并比较其重叠区域的相似度程度,当其足够相似时,则认为找到了左右图像的关系。
一般的,相似度程度可以由SSD(误差平方和)或NCC(归一化积相关)来表征,当然,还有很多其它的方式可以表征,如SAD,但是个人认为SSD和NCC的性能更好,且其为线性函数,可以进行频域实现。
对于SSD,其评价函数为:

H(p,q)=∑U∑U(f(x,y)−g(i,j))2N(p,q)

H(p,q)=\frac{\sum_U\sum _U(f(x,y)-g(i,j))^2}{N(p,q)}
其中的 ff和gg为需要匹配的图像, UU为ff和 gg在位置(p,q)(p,q)时的重叠区域, ff和gg的下标 (x,y)(x,y)和 (i,j)(i,j)不同,是因为重叠区域 UU在ff和 gg的位置不同引起的,N(p,q)N(p,q)表示重叠区域 UU的点的个数。上式可以化简为:

H(p,q)=∑U∑Uf(x,y)2+∑U∑Ug(i,j)2−2∑U∑Uf(x,y)g(i,j)N(p,q)

H(p,q)=\frac{\sum_U\sum _Uf(x,y)^2+\sum_U\sum _Ug(i,j)^2-2\sum_U\sum _Uf(x,y)g(i,j)}{N(p,q)}
对于 ∑U∑Uf(x,y)2\sum_U\sum _Uf(x,y)^2 和 ∑U∑Ug(x,y)2\sum_U\sum _Ug(x,y)^2,可以用如下Matlab程序实现:

function result = ImageAllCumSum(curr)
[m, n] = size(curr);
result = zeros(m*2-1, n*2-1);
result(1:m, 1:n) = cumsum(cumsum(curr, 1), 2);
result(1:m, n:2*n-1) = flip(cumsum(cumsum(flip(curr, 2), 1), 2), 2);
result(m:2*m-1, 1:n) =  flip(cumsum(cumsum(flip(curr, 1), 1), 2), 1);
result(m:2*m-1, n:2*n-1) = rot90(cumsum(cumsum(rot90(curr, 2), 1), 2), 2);

计算ff和gg的平方和只需输入

result = ImageAllCumSum(f.*f);

而对于N(p,q)N(p,q)可以以如下方式实现:

function result = ImageAllSize(curr)
[m, n] = size(curr);
resultTemp = ones(m, n);
result = ImageAllCumSum(resultTemp);

对于∑U∑Uf(x,y)g(i,j)\sum_U\sum _Uf(x,y)g(i,j),利用卷积进行计算将十分便利。程序如下:

function result = ImageAllConvolution(prev, curr)
prevFFT = ImageAllFFT(rot90(prev, 2));
currFFT = ImageAllFFT(curr);
result = ifft2(currFFT.*prevFFT);function result = ImageAllFFT(curr)
[m, n] = size(curr);
result = zeros(m*2-1, n*2-1);
result(1:m,1:n) = curr;
result = fft2(result);

对于计算上述ff和gg的模板匹配为:

function result = ImageAllFftSsd(prev, curr)
convRes = ImageAllConvolution(prev, curr);
squareCumSumPrev = ImageAllCumSum(rot90(prev.*prev, 2));
squareCumSumCurr = ImageAllCumSum(curr.*curr);
sizeImage = ImageAllSize(prev);
result = (squareCumSumPrev + squareCumSumCurr - 2*real(convRes))./sizeImage;

对于NCC,其评价函数为:

H(p,q)=∑U∑U(f(x,y)−f−(x,y))(g(x,y)−g−(x,y))∑U∑U(f(x,y)−f−(x,y))2∑U∑U(g(x,y)−g−(x,y))2−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−√

H(p,q)=\frac{\sum_U\sum _U(f(x,y)-\overset{-}f(x,y))(g(x,y)-\overset{-}g(x,y))}{\sqrt{\sum_U\sum _U(f(x,y)-\overset{-}f(x,y))^2\sum_U\sum _U(g(x,y)-\overset{-}g(x,y))^2}}
其中的 ff和gg为需要匹配的图像, UU为ff和 gg在位置(p,q)(p,q)时的重叠区域, ff和gg的下标 (x,y)(x,y)和 (i,j)(i,j)不同,是因为重叠区域 UU在ff和 gg的位置不同引起的,f−(x,y)\overset{-}f(x,y)和 g−(x,y)\overset{-}g(x,y)表示重叠区域 UU内ff和 gg的均值。上式可以化简为:

H(p,q)=∑U∑Uf(x,y)g(x,y)−∑U∑Uf−(x,y)g−(i,j)∑U∑U(f(x,y)2−f−(x,y)2)∑U∑U(g(x,y)2−g−(x,y)2)−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−√

H(p,q)=\frac{\sum_U\sum _Uf(x,y)g(x,y)-\sum_U\sum _U\overset{-}f(x,y)\overset{-}g(i,j)}{\sqrt{\sum_U\sum _U(f(x,y)^2-\overset{-}f(x,y)^2)\sum_U\sum _U(g(x,y)^2-\overset{-}g(x,y)^2)}}
NCC可以用如下Matlab程序实现:

function result = ImageAllFftNcc(prev, curr)
convRes = ImageAllConvolution(prev, curr);
sizeRes = ImageAllSize(curr);
CumSumPrev = ImageAllCumSum(rot90(prev, 2));
CumSumCurr = ImageAllCumSum(curr);
squareCumSumPrev = ImageAllCumSum(rot90(prev.*prev, 2));
squareCumSumCurr = ImageAllCumSum(curr.*curr);
result = (convRes - CumSumPrev.*CumSumCurr./sizeRes);
resultDonominator = sqrt((squareCumSumPrev - CumSumPrev.*CumSumPrev./sizeRes) .* ...
(squareCumSumCurr - CumSumCurr.*CumSumCurr./sizeRes));
result = result./resultDonominator;

以下为程序的Demo:

im1 = rgb2gray(im2double(imread('1.jpg')));
im2 = rgb2gray(im2double(imread('2.jpg')));
SSD = ImageAllFftSsd(im1, im2);
SSD = SSD(11:end-10, 11:end-10);
[x, y] = meshgrid(1:size(SSD, 2), 1:size(SSD, 1));
surf(x, y, SSD);
NCC = ImageAllFftNnc(im1, im2);
NCC = NCC(11:end-10, 11:end-10);
[x, y] = meshgrid(1:size(NCC, 2), 1:size(NCC, 1));
surf(x, y, NCC);

Matlab模板匹配实现图像运动估计(频域实现)相关推荐

  1. matlab 图像模板匹配,基于MATLAB模板匹配的车牌识别系统

    一.课题名称[Q1321814823] 基于MATLAB模板匹配的车牌识别系统 二.课题背景 随着汽车数量的增加,城市交通状况日益受到人们的重视,如何进行有效的交通管理更是成为了人们关注的焦点.针对此 ...

  2. 5.过滤器作为模板——模板匹配、Matlab模板匹配实战_2

    目录 模板匹配 模板匹配实战 模板匹配 让我们继续探索使用过滤器作为模板的想法,我们想在二维空间中找到什么. 模板是你给我的东西,你说我想让你找到类似这样的东西,我们要通过过滤来做. 我想这是Chri ...

  3. 【字符识别】基于matlab模板匹配(区域生长法)字母+数字识别【含Matlab源码 1214期】

    ⛄一.手写大写字母识别技术简介 0 引言 在高校教学过程中,考试是最为普遍的一种教学评估.综合练习的教学手段,随着科技进步,考试阅卷的方式也发生了巨大的变革.传统的阅卷方式主要以人工阅卷为主, 存在效 ...

  4. 一种基于模板匹配的图像配准方法

    01 前言 如下图所示,有时候参考图像与浮动图像的灰度区别很大,但是它们又有某一个小区域比较相似,这种情况下直接通过特征点匹配或形变优化来配准的效果并不理想. 这个时候我们可以尝试使用模板匹配的方法来 ...

  5. OpenCV—python 模板匹配与图像特征匹配

    文章目录 一.理论介绍与算法 二.算法代码 单目标匹配 多目标匹配 三 多尺度模板匹配 一.理论介绍与算法 模板匹配是在一幅图像中寻找一个特定目标的方法之一,这种方法的原理非常简单,遍历图像中的每一个 ...

  6. 基于Matlab模板匹配方法的车牌识别系统设计

    本系统针对家庭小型车蓝底白字车牌进行识别 背景 近年来,随着交通现代化的发展要求,汽车牌照自动识别技术已经越来越受到人们的重视.车牌自动识别技术中车牌定位.字符切割.字符识别及后处理是其关键技术.由于 ...

  7. 【MATLAB】数字图像处理--图像的频域处理-相位谱重构

    效果 %% clc clear alldir = 'image/56.jpg';img = imread(dir); imggray = rgb2gray(img);%灰度处理 imgf = fft2 ...

  8. NCC多尺寸模板匹配MATLAB

    NCC多尺寸模板匹配MATLAB 模板匹配 NCC 运行结果 具体代码 总结 模板匹配 模板匹配首先给出一份模板,通过对于目标图像中的检索,找到目标图像中区域与模板最为契合的部分. 再本次程序中,流程 ...

  9. opencv 模板匹配,在图像中寻找物体

    使用模板匹配在图像中寻找物体 模板匹配 模板匹配就是用来在大图中找小图,也就是说在一副图像中寻找另外一张模板图像的位置: opencv中用 cv.matchTemplate() 实现模板匹配. 模板匹 ...

最新文章

  1. Tensorflow pipeline是什么?
  2. C语言 | 一维数组
  3. VNC 远程控制工具软件
  4. 程序员爬取 3 万条评论,《长安十二时辰》槽点大揭秘!
  5. 关于使用_bstr_t的一个坑
  6. 2021年最新的Java面试题,精选100题,大厂必备
  7. Linux上安装Oracle 10g 装后感
  8. Python中lambda的用法及其与def的区别解析
  9. 数控技术 - 直线插补 - 数字积分法(DDA)
  10. App设计者开发APP要注意的21个雷区(上)
  11. 富文本编辑器:ckeditor(使用ckeditor4-vue)
  12. 哈希(Hash)算法
  13. 用百度ai的人流量统计(动态版)来统计固定场景的人流
  14. GA遗传算法及相关代码
  15. 人体的神经元有多少个,人体的神经元有多少支
  16. 记录一下Android开发中遇到的问题和解决方案
  17. 异常处理 - [C++]
  18. McAfee防火墙注意防止远程桌面被阻止
  19. Cura15.04.6 安装闪退及汉化解决
  20. 威学一百_威学一百安卓版下载|威学一百app下载_v1.0.3_9ht安卓下载

热门文章

  1. 图文翻译-免费图文翻译-批量图文翻译软件
  2. Fastone api provided for SMIC
  3. 多路继电器控制4G远程手机APP
  4. 恒生金锐软件面试总结
  5. 顶级数据科学家谈数据素养
  6. 原谅你的无知——反驳《BCH首次区块奖励减半或将遭遇安全性问题》
  7. win7 android 编译环境搭建,在Win7下配置Android开发环境
  8. 那些重出江湖的大佬们――柳传志etc.
  9. 自动化测试--20验证码识别
  10. mutt配置文件_mutt+msmtp 邮件客户端配置