一、概述

  在图像处理相关的问题中,图像对准是一类典型的问题,也就是要将两幅图严丝合缝地对应起来。通常来讲,两幅图大小不一,一个是模板,一个是母图,也就是要在母图中搜寻定位到与模板图最为接近的区域。
  实现的方式有很多,惯常使用的是基于准则匹配的方法和基于特征匹配的方法。基于准则匹配,就是直接地对图的灰度值矩阵进行计算操作,以特定的准则遍历整个母图,找到与目标图(模板图)最相近的子区域;基于特征匹配,就是先提取出图像特征,再基于特征进行操作。这里对基于准则匹配的图像对准基本方法做简单介绍。

二、匹配准则

  常见的匹配准则有SAD、MAD、SSD、MSD、NCC。前四种是基于两个矩阵的向量差做运算,NCC是计算两个矩阵的相关系数。事实上,矩阵是一个高阶向量(二阶张量),对两个矩阵向量作差,就得到差向量,对差向量做分析运算,便可在一定程度上获得两个矩阵间的差异性信息。
设A=(aij)A=\left( a_{ij} \right)A=(aij​),B=(bij)B=\left( b_{ij} \right)B=(bij​),i=1,2,...,Mi=1,2,...,Mi=1,2,...,M,j=1,2,...,Nj=1,2,...,Nj=1,2,...,N.则差向量D=A−B=(aij−bij)\begin{equation} \begin{aligned} D&=A-B\\&=\left( a_{ij}-b_{ij} \right) \end{aligned} \end{equation}D​=A−B=(aij​−bij​)​​​

(1) SAD

  SAD,绝对误差算法(Sum of Absolute Differences),它是差向量D中各元素的绝对值之和,也就是L1范数,是两个向量间的曼哈顿距离。表达式为SAD=∑i=1M∑j=1N∣aij−bij∣\begin{equation} \begin{aligned}SAD=\sum_{i=1}^{M}{\sum_{j=1}^{N}{\left| a_{ij}-b_{ij} \right|}}\end{aligned} \end{equation}SAD=i=1∑M​j=1∑N​∣aij​−bij​∣​​​

(2) MAD

  MAD,平均绝对误差算法(Mean Absolute Differences),它是在SAD基础上进一步求平均值。表达式为MAD=1M×N∑i=1M∑j=1N∣aij−bij∣\begin{equation} \begin{aligned}MAD=\frac{1}{M\times N}\sum_{i=1}^{M}{\sum_{j=1}^{N}{\left| a_{ij}-b_{ij} \right|}}\end{aligned} \end{equation}MAD=M×N1​i=1∑M​j=1∑N​∣aij​−bij​∣​​​

(3) SSD

  SSD,误差平方和算法(Sum of Squared Differences),它是差向量D中各元素的平方和。表达式为SSD=∑i=1M∑j=1N(aij−bij)2\begin{equation} \begin{aligned}SSD=\sum_{i=1}^{M}{\sum_{j=1}^{N}{\left( a_{ij}-b_{ij} \right)^{2}}}\end{aligned} \end{equation}SSD=i=1∑M​j=1∑N​(aij​−bij​)2​​​

(4) MSD

  MSD,平均误差平方和算法(Mean Square Differences),它是在SSD的基础上进一步求平均值。表达式为MSD=1M×N∑i=1M∑j=1N(aij−bij)2\begin{equation} \begin{aligned}MSD=\frac{1}{M\times N}\sum_{i=1}^{M}{\sum_{j=1}^{N}{\left( a_{ij}-b_{ij} \right)^{2}}}\end{aligned} \end{equation}MSD=M×N1​i=1∑M​j=1∑N​(aij​−bij​)2​​​

(5) NCC

  NCC,归一化互相关算法(Normalized Cross Correlation)。若将两个矩阵看做两个随机变量,那么NCC就是两个变量之间的皮尔逊相关系数。同时,它也是两个矩阵向量在各自中心化之后彼此间空间夹角的余弦值。它的表达式为NCC=∑i=1M∑j=1N(aij−E(A))(bij−E(B))∑i=1M∑j=1N(aij−E(A))2⋅∑i=1M∑j=1N(bij−E(B))2\begin{equation} \begin{aligned}NCC=\frac{\sum_{i=1}^{M}{\sum_{j=1}^{N}{\left( a_{ij}-E(A) \right)\left( b_{ij}-E(B) \right)}}}{\sqrt{\sum_{i=1}^{M}{\sum_{j=1}^{N}{\left( a_{ij}-E(A) \right)^{2}}}}\cdot\sqrt{\sum_{i=1}^{M}{\sum_{j=1}^{N}{\left( b_{ij}-E(B) \right)^{2}}}}}\end{aligned} \end{equation}NCC=∑i=1M​∑j=1N​(aij​−E(A))2​⋅∑i=1M​∑j=1N​(bij​−E(B))2​∑i=1M​∑j=1N​(aij​−E(A))(bij​−E(B))​​​​
  易知,ncc值的范围为 [−1,1][−1,1][−1,1],越接近1,两个矩阵越相关;越接近-1,两个矩阵越不相关。

等同于皮尔逊相关系数
  皮尔逊相关系数,用以衡量两个变量间的线性相关性。它的表达式为Pearson=Cov(X,Y)D(X)⋅D(Y)=E(X−EX)(Y−EY)D(X)⋅D(Y)\begin{equation} \begin{aligned} Pearson&=\frac{Cov\left( X,Y \right)}{\sqrt{D\left( X \right)}\cdot\sqrt{D\left( Y \right)}}\\&=\frac{E\left( X-EX \right)\left( Y-EY \right)}{\sqrt{D\left( X \right)}\cdot\sqrt{D\left( Y \right)}} \end{aligned} \end{equation}Pearson​=D(X)​⋅D(Y)​Cov(X,Y)​=D(X)​⋅D(Y)​E(X−EX)(Y−EY)​​​​  将两个矩阵看做两个随机变量代入,有Pearson=1M×N∑i=1M∑j=1N(aij−E(A))(bij−E(B))∑i=1M∑j=1N(aij−E(A))2M×N⋅∑i=1M∑j=1N(bij−E(B))2M×N=∑i=1M∑j=1N(aij−E(A))(bij−E(B))∑i=1M∑j=1N(aij−E(A))2∑i=1M∑j=1N(bij−E(B))2=NCC\begin{equation} \begin{aligned} Pearson&=\frac{\frac{1}{M\times N}\sum_{i=1}^{M}{\sum_{j=1}^{N}{\left( a_{ij}-E(A) \right)\left( b_{ij}-E(B) \right)}}}{\sqrt{\frac{\sum_{i=1}^{M}{\sum_{j=1}^{N}{\left( a_{ij}-E(A) \right)^{2}}}}{M\times N}}\cdot\sqrt{\frac{\sum_{i=1}^{M}{\sum_{j=1}^{N}{\left( b_{ij}-E(B) \right)^{2}}}}{M\times N}}}\\&=\frac{\sum_{i=1}^{M}{\sum_{j=1}^{N}{\left( a_{ij}-E(A) \right)\left( b_{ij}-E(B) \right)}}}{\sqrt{\sum_{i=1}^{M}{\sum_{j=1}^{N}{\left( a_{ij}-E(A) \right)^{2}}}} \sqrt{\sum_{i=1}^{M}{\sum_{j=1}^{N}{\left( b_{ij}-E(B) \right)^{2}}}}}\\&=NCC \end{aligned} \end{equation}Pearson​=M×N∑i=1M​∑j=1N​(aij​−E(A))2​​⋅M×N∑i=1M​∑j=1N​(bij​−E(B))2​​M×N1​∑i=1M​∑j=1N​(aij​−E(A))(bij​−E(B))​=∑i=1M​∑j=1N​(aij​−E(A))2​∑i=1M​∑j=1N​(bij​−E(B))2​∑i=1M​∑j=1N​(aij​−E(A))(bij​−E(B))​=NCC​​​

等同于余弦距离
  余弦距离即空间向量夹角的余弦值,通常用以衡量两个向量间的差异度。它的表达式为cosθ=<X,Y>∣X∣⋅∣Y∣\begin{equation} \begin{aligned}cos\theta=\frac{<X,Y>}{\left| X \right|\cdot\left| Y \right|}\end{aligned} \end{equation}cosθ=∣X∣⋅∣Y∣<X,Y>​​​​  将两个矩阵向量去中心化后代入,有cosθ=<A−E(A),B−E(B)>∣A−E(A)∣⋅∣B−E(B)∣=∑i=1M∑j=1N(aij−E(A))(bij−E(B))∑i=1M∑j=1N(aij−E(A))2∑i=1M∑j=1N(bij−E(B))2=NCC\begin{equation} \begin{aligned} cos\theta&=\frac{<A-E(A),B-E(B)>}{\left| A-E(A) \right|\cdot\left| B-E(B) \right|}\\&=\frac{\sum_{i=1}^{M}{\sum_{j=1}^{N}{\left( a_{ij}-E(A) \right)\left( b_{ij}-E(B) \right)}}}{\sqrt{\sum_{i=1}^{M}{\sum_{j=1}^{N}{\left( a_{ij}-E(A) \right)^{2}}}}\sqrt{\sum_{i=1}^{M}{\sum_{j=1}^{N}{\left( b_{ij}-E(B) \right)^{2}}}}}\\&=NCC \end{aligned} \end{equation}cosθ​=∣A−E(A)∣⋅∣B−E(B)∣<A−E(A),B−E(B)>​=∑i=1M​∑j=1N​(aij​−E(A))2​∑i=1M​∑j=1N​(bij​−E(B))2​∑i=1M​∑j=1N​(aij​−E(A))(bij​−E(B))​=NCC​​​

三、matlab实现

(1) SAD

clear all;
close all; clc;%1.读取图片
img_A_dir = '.\data\lena.bmp';  %待寻母图
img_A_raw = imread(img_A_dir);
[r1,c1,d1] = size(img_A_raw);
if d1==3 %灰度化img_A = rgb2gray(img_A_raw);
elseimg_A = img_A_raw;
endimg_B_dir = '.\data\refer.bmp';  %模板图
img_B_raw = imread(img_B_dir);
[r2,c2,d2] = size(img_B_raw);
if d2==3img_B = rgb2gray(img_B_raw);
elseimg_B = img_B_raw;
end%2.计算SAD矩阵
msad = zeros(r1-r2,c1-c2);for i = 1:r1-r2for j = 1:c1-c2temp = img_A(i:i+r2-1,j:j+c2-1);        msad(i,j) = msad(i,j) + sum(sum(abs(temp - img_B)));    end
end%3.定位匹配位置
min_sad = min(min(msad));
[x,y] = find(msad == min_sad);
x = x(1); %定位到的第一个位置
y = y(1);%4.保存结果图
getImg = img_A_raw(x:x+r2-1,y:y+c2-1,1:3);
imwrite(getImg,'.\output\SAD_match.bmp');fprintf('\n Done. \n');
在这里插入代码片

(2) MAD

clear all;
close all; clc;%1.读取图片
img_A_dir = '.\data\lena.bmp';  %待寻母图
img_A_raw = imread(img_A_dir);
[r1,c1,d1] = size(img_A_raw);
if d1==3 %灰度化img_A = rgb2gray(img_A_raw);
elseimg_A = img_A_raw;
endimg_B_dir = '.\data\refer.bmp';  %模板图
img_B_raw = imread(img_B_dir);
[r2,c2,d2] = size(img_B_raw);
if d2==3img_B = rgb2gray(img_B_raw);
elseimg_B = img_B_raw;
end%2.计算MAD矩阵
mmad = zeros(r1-r2,c1-c2);for i = 1:r1-r2for j = 1:c1-c2temp = img_A(i:i+r2-1,j:j+c2-1);        mmad(i,j) = mmad(i,j) + sum(sum(abs(temp - img_B)))/(r2*c2);    end
end%3.定位匹配位置
min_mad = min(min(mmad));
[x,y] = find(mmad == min_mad);
x = x(1); %定位到的第一个位置
y = y(1);%4.保存结果图
getImg = img_A_raw(x:x+r2-1,y:y+c2-1,1:3);
imwrite(getImg,'.\output\MAD_match.bmp');fprintf('\n Done. \n');

(3) SSD

clear all;
close all; clc;%1.读取图片
img_A_dir = '.\data\lena.bmp';  %待寻母图
img_A_raw = imread(img_A_dir);
[r1,c1,d1] = size(img_A_raw);
if d1==3 %灰度化img_A = rgb2gray(img_A_raw);
elseimg_A = img_A_raw;
endimg_B_dir = '.\data\refer.bmp';  %模板图
img_B_raw = imread(img_B_dir);
[r2,c2,d2] = size(img_B_raw);
if d2==3img_B = rgb2gray(img_B_raw);
elseimg_B = img_B_raw;
end%2.计算SSD矩阵
mssd = zeros(r1-r2,c1-c2);for i = 1:r1-r2for j = 1:c1-c2temp = img_A(i:i+r2-1,j:j+c2-1);        mssd(i,j) = mssd(i,j) + sum(sum((temp - img_B).^2));    end
end%3.定位匹配位置
min_ssd = min(min(mssd));
[x,y] = find(mssd == min_ssd);
x = x(1); %定位到的第一个位置
y = y(1);%4.保存结果图
getImg = img_A_raw(x:x+r2-1,y:y+c2-1,1:3);
imwrite(getImg,'.\output\SSD_match.bmp');fprintf('\n Done. \n');

(4) MSD

clear all;
close all; clc;%1.读取图片
img_A_dir = '.\data\lena.bmp';  %待寻母图
img_A_raw = imread(img_A_dir);
[r1,c1,d1] = size(img_A_raw);
if d1==3 %灰度化img_A = rgb2gray(img_A_raw);
elseimg_A = img_A_raw;
endimg_B_dir = '.\data\refer.bmp';  %模板图
img_B_raw = imread(img_B_dir);
[r2,c2,d2] = size(img_B_raw);
if d2==3img_B = rgb2gray(img_B_raw);
elseimg_B = img_B_raw;
end%2.计算MSD矩阵
mmsd = zeros(r1-r2,c1-c2);for i = 1:r1-r2for j = 1:c1-c2temp = img_A(i:i+r2-1,j:j+c2-1);        mmsd(i,j) = mmsd(i,j) + sum(sum((temp - img_B).^2))/(r2*c2);    end
end%3.定位匹配位置
min_msd = min(min(mmsd));
[x,y] = find(mmsd == min_msd);
x = x(1); %定位到的第一个位置
y = y(1);%4.保存结果图
getImg = img_A_raw(x:x+r2-1,y:y+c2-1,1:3);
imwrite(getImg,'.\output\MSD_match.bmp');fprintf('\n Done. \n');

(5) NCC

clear all;
close all; clc;%1.读取图片
img_A_dir = '.\data\lena.bmp';  %待寻母图
img_A_raw = imread(img_A_dir);
[r1,c1,d1] = size(img_A_raw);
if d1==3 %灰度化img_A = rgb2gray(img_A_raw);
elseimg_A = img_A_raw;
endimg_B_dir = '.\data\refer.bmp';  %模板图
img_B_raw = imread(img_B_dir);
[r2,c2,d2] = size(img_B_raw);
if d2==3img_B = rgb2gray(img_B_raw);
elseimg_B = img_B_raw;
end%2.计算NCC矩阵
mNCC = zeros(r1-r2,c1-c2);for i = 1:r1-r2for j = 1:c1-c2temp = img_A(i:i+r2-1,j:j+c2-1);   mean_temp = mean(temp(:)); %temp均值mean_B = mean(img_B(:));  %img_B均值      inp = sum(sum((temp - mean_temp).*(img_B - mean_B))); %两向量内积        mod1 = sqrt(sum(sum((temp - mean_temp).^2))); %模长1mod2 = sqrt(sum(sum((img_B - mean_B).^2))); %模长2        ncc = inp / (mod1*mod2);       mNCC(i,j) = mNCC(i,j) + ncc;                             end
end%3.定位匹配位置
max_ncc = max(max(mNCC)); %最大ncc值
[x,y] = find(mNCC == max_ncc);
x = x(1); %定位到的第一个位置
y = y(1);%4.保存结果图
getImg = img_A_raw(x:x+r2-1,y:y+c2-1,1:3);
imwrite(getImg,'.\output\NCC_match.bmp');fprintf('\n Done. \n');

代码和数据打包:
https://download.csdn.net/download/Albert201605/87356041?spm=1001.2014.3001.5503

本文pdf下载:
https://download.csdn.net/download/Albert201605/87362510?spm=1001.2014.3001.5503

End.

参考:
https://www.freesion.com/article/7622115606/

基于准则匹配的图像对准相关推荐

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

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

  2. 基于等照度线和窗口匹配的图像修补算法

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 一.关于图像修补 图像修补的目的是基于已有的图像信息或数据库内信息,对缺失区域进行合理地修复.在 ...

  3. 基于模板匹配的目标跟踪法

    基于灰度图像处理的方法是依据图像中灰度模式来实现目标提取.假设运动物体为刚性目标,在 t 时刻(x,y)像素处的灰度值为 (f x,y,t),而 t 时刻参考图像(x,y)像素处的灰度值为 运动目标检 ...

  4. 【图像修复】基于criminis算法实现图像修复附matlab代码

    1 内容介绍 该算法出自Criminisi的论文 Region Filling and Object Removal by Exemplar-Based Image Inpainting 该算法只要思 ...

  5. CVPR | 让合成图像更真实,上交大提出基于域验证的图像和谐化

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 近日,计算机视觉顶会 CVPR 2020 接收论文结果公布,从 6 ...

  6. 重磅直播 | PointDSC:基于特征匹配的点云配准方法(CVPR2021)

    大家好,本公众号现已开启线上视频公开课,主讲人通过B站直播间,对3D视觉领域相关知识点进行讲解,并在微信群内完成答疑. 本期由香港科技大学计算机系白旭阳博士分享,分享的主题为<基于特征匹配的鲁棒 ...

  7. 读“基于深度学习的图像风格迁移研究综述”有感

    前言 关于传统非参数的图像风格迁移方法和现如今基于深度学习的图像风格迁移方法. 基于深度学习的图像风格迁移方法:基于图像迭代和模型迭代的两种方法的优缺点. 基于深度学习的图像风格迁移方法的存在问题及其 ...

  8. Nature科学报告:根据大脑思维意图来生成对应匹配的图像

    点击上面"脑机接口社区"关注我们 更多技术干货第一时间送达 导读 脑机接口可以进行主动通信并执行一组预定义的命令,例如键入字母或移动光标.但是,到目前为止,他们还无法根据大脑信号推 ...

  9. HALCON基于形状匹配详解

    HALCON基于形状的模板匹配详细说明 很早就想总结一下前段时间学习HALCON的心得,但由于其他的事情总是抽不出时间.去年有过一段时间的集中学习,做了许多的练习和实验,并对基于HDevelop的形状 ...

最新文章

  1. Android 之 ProgressDialog用法介绍(矩形进度条 和 圆形 进度条)
  2. 《研磨设计模式》chap15 组合模式(1)简介
  3. excel数据透视表列名更改
  4. java中错误的源文件,关于Java源文件结构规则,说法错误的是()A.版权信息必须在java文件的开头B.package语句在imports...
  5. Spring入门(1)
  6. adb查看activity的堆栈信息
  7. 模糊逻辑学习--建立Mamdani系统(GUI)
  8. 测试显卡风扇的软件,让噪音远离,显卡风扇转速调节
  9. 关于python的自省机制
  10. 2018年软件测试行业状态报告
  11. 俄罗斯大炼自主「熊芯」!斥资3万亿卢布,8年实现28nm量产
  12. 超分辨率技术AI人工智能老照片修复自动人像脑补照片高清重建人脸模糊图片变清晰软件
  13. HTML标签marquee实现滚动效果/跑马灯/弹幕等
  14. 电话程控交换机 配置
  15. centos 7+ssr傻瓜式安装(仅供学习使用)
  16. 叠片式过滤器原理概述
  17. 操作系统实验:存储管理(C++)
  18. jboss下ejb简介
  19. 怎么进行ai抠图?快来了解下这个好方法
  20. 图片在线收款发货系统源码

热门文章

  1. 7-1 汽车加油问题
  2. 手把手教大家搭建微信公众号查题功能
  3. 图片文字识别软件有哪些?这几款软件亲测非常好用
  4. IDEA中SVN项目不同颜色含义
  5. 生最困难的不是努力,而是做出正确的抉择
  6. React —— Descriptions(根据自己需求判断要显示哪些)
  7. openoffice将word转pdf中文乱码或消失的坑
  8. 全新 Amazon RDS for MySQL 和 PostgreSQL 多可用区 (Multi-AZ) 部署选项
  9. 新玺配资:市场情绪回暖 主流热点崛起
  10. 自动分析黑名单及白名单的iptables脚本