归一化交叉相关Normalization cross correlation (NCC)
归一化交叉相关Normalization cross correlation (NCC)
NCC正如其名字,是用来描述两个目标的相关程度的,也就是说可以用来刻画目标间的相似性。一般NCC也会被用来进行图像匹配,即在一个图像中搜索与一小块已知区域的NCC最高的区域作为对应匹配,然后对准整幅图像。
假设两幅图像
,那么其NCC可如下计算:

其中
表示点乘运算。
比如下面两幅图像,我们想对齐


首先在一幅图像中选取两个图像都有的区域作为templete

然后在另一幅图像中选取包含templete的区域

最终对齐的结果如下

- function NCC
- close all
- part2 =imread('part1.png');
- part1 = imread('part2.png');
- imshow(part2);title('part2')
- figure, imshow(part1);title('part1');
- % 选取template和搜索区域region. Note:template的大小必须小于region
- figure,
- [sub_part2,rect_part2]=imcrop(part2);% template
- [sub_part1,rect_part1]=imcrop(part1);% region
- figure, imshow(sub_part2)
- figure, imshow(sub_part1);
- [x,y,z] = normcorr2(double(sub_part2(:,:,1)),double(sub_part1(:,:,1)));
- figure,surf(x,y,z),shading flat
- %% 寻找偏置
- [~,imax]=max(z(:));%
- [yoffset,xoffset]=ind2sub(size(z),imax(1));
- %% 图像对齐
- % 配对点在第一幅图像中到边界的距离
- rect_part1=floor(rect_part1);
- left1=rect_part1(1)+xoffset;
- right1=size(part1,2)-left1;
- up1=rect_part1(2)+yoffset;
- down1 = size(part1,1)-left1;
- % 配对点在第二幅图像中到边界的距离
- rect_part2=floor(rect_part2);
- left2=rect_part2(1);
- right2=size(part2,2)-left2;
- up2=rect_part2(2);
- down2 = size(part2,1)-up2;
- img=zeros(max(up1,up2)+max(down1,down2)+1,max(left1,left2)+max(right1,right2)+1,size(part1,3));
- sx=max(left1,left2)+1;
- sy=max(up1,up2)+1;
- img(sy-up1+1:sy-up1+size(part1,1),sx-left1+1:sx-left1+size(part1,2),:)=part1;
- img(sy-up2+1:sy-up2+size(part2,1),sx-left2+1:sx-left2+size(part2,2),:)=part2;
- imshow(uint8(img));
- end
- function [x,y,z]=normcorr2(I1,I2)
- % I1,I2是单通道图像,即矩阵
- % I1 is template
- % I2 is the region where match pairs are searched
- [m1,n1]=size(I1);
- [m2,n2]=size(I2);
- z=conv2(I2,rot90(I1,2),'valid');
- im2=cumsum(I2.^2,1);
- im2=cumsum(im2,2);
- sum1=sum(sum(I1.^2,1),2);
- % nz=zeros(m2-m1+1,n2-n1+1);
- wrapIm2=zeros(1+m2,1+n2);
- wrapIm2(2:end,2:end)=im2;
- nz=(wrapIm2(m1+1:m2+1,n1+1:n2+1)+wrapIm2(1:m2-m1+1,1:n2-n1+1)-wrapIm2(1:m2-m1+1,n1+1:n2+1)-wrapIm2(m1+1:m2+1,1:n2-n1+1))*sum1;
- nz=sqrt(nz);
- z=z./nz;
- [x,y]=meshgrid(1:n2-n1+1,1:m2-m1+1);
- end





有些文献在计算卷积的时候,总说要把矩阵逆排序之后再对应相乘,包括conv2这个函数也是这么计算的。但实际上我们有一个templete和region,直接就是对应位置乘积之后作为卷积结果,也只有这样才能保证在匹配的位置处NCC系数最大,所以在代码里,我先对templete进行了逆序操作,在使用conv2卷积。
另外matlab2016添加了image registration 工具箱,里面可以直接计算NCC系数了,具体参见
http://cn.mathworks.com/help/images/examples/registering-an-image-using-normalized-cross-correlation.html.
归一化交叉相关Normalization cross correlation (NCC)的更多相关文章
- 交叉验证(Cross Validation)简介
参考 交叉验证 交叉验证 (Cross Validation)刘建平 一.训练集 vs. 测试集 在模式识别(pattern recognition)与机器学习(machine lea ...
- 关于交叉熵(cross entropy),你了解哪些
二分~多分~Softmax~理预 一.简介 在二分类问题中,你可以根据神经网络节点的输出,通过一个激活函数如Sigmoid,将其转换为属于某一类的概率,为了给出具体的分类结果,你可以取0.5作为阈值, ...
- S折交叉验证(S-fold cross validation)
S折交叉验证(S-fold cross validation) 觉得有用的话,欢迎一起讨论相互学习~Follow Me 仅为个人观点,欢迎讨论 参考文献 https://blog.csdn.net/a ...
- 几种交叉验证(cross validation)方式的比较
模型评价的目的:通过模型评价,我们知道当前训练模型的好坏,泛化能力如何?从而知道是否可以应用在解决问题上,如果不行,那又是哪里出了问题? train_test_split 在分类问题中,我们通常通过对 ...
- 【机器学习基础】交叉熵(cross entropy)损失函数是凸函数吗?
之所以会有这个问题,是因为在学习 logistic regression 时,<统计机器学习>一书说它的负对数似然函数是凸函数,而 logistic regression 的负对数似然函数 ...
- 关于交叉熵损失函数Cross Entropy Loss
1.说在前面 最近在学习object detection的论文,又遇到交叉熵.高斯混合模型等之类的知识,发现自己没有搞明白这些概念,也从来没有认真总结归纳过,所以觉得自己应该沉下心,对以前的知识做一个 ...
- 交叉验证(cross validation)
转自:http://www.vanjor.org/blog/2010/10/cross-validation/ 交叉验证(Cross-Validation): 有时亦称循环估计, 是一种统计学上将数据 ...
- 【深度学习】批归一化(Batch Normalization)
BN是由Google于2015年提出,这是一个深度神经网络训练的技巧,它不仅可以加快了模型的收敛速度,而且更重要的是在一定程度缓解了深层网络中"梯度弥散"的问题,从而使得训练深层网 ...
- TensorFlow 实战(一)—— 交叉熵(cross entropy)的定义
对多分类问题(multi-class),通常使用 cross-entropy 作为 loss function.cross entropy 最早是信息论(information theory)中的概念 ...
随机推荐
- 20145212&20145204信息安全系统实验五
一.实验步骤 1.阅读理解源码 进入/arm2410cl/exp/basic/07_httpd目录,使用 vim编辑器或其他编辑器阅读理解源代码. 2.编译应用程序 运行 make 产生可执行文件 h ...
- [nosql之缓存memcache]安装篇LInux for Windows
首先呢在PHP开发的过程中会用到很多缓存服务,从而提升访问质量或者临时存储一些数据. 优点 结构简单,读取速度快,易于维护.还有一些特性memcache redis mongodb都可以用来做为缓存用 ...
- 一次性事务和CTE插入数据的比较
有时要构造一些数据来做测试数据,像下面这样: IF OBJECT_ID(N'T14') IS NOT NULL BEGIN DROP TABLE T14 END GO CREATE TABLE T14 ...
- Mongodb启动命令mongod参数说明
Mongodb启动命令mongod参数说明 mongod的主要参数有: 基本配置 ----------------------------------------------------------- ...
- mysqldump
$ mysqldump -uroot -p ott_cibn_cms2_staging > /opt/app/ruby/ott-cibn-cms-2.0/current/public/db.sq ...
- Fedora中允许mysql远程访问的几种方式
Fedora中允许mysql远程访问,可以使用以下两种方式:a.改表. mysql>use mysql; mysql>update user set host = '%' where us ...
- VS2013编译Qt5.6.0静态库
获取qt5.6.0源码包 直接去www.qt.io下载就好了,这里就不详细说了. 这里是我已经编译好的** 链接:http://pan.baidu.com/s/1pLb6wVT 密码: ak7y ** ...
- servlet 之 response 回复 字节流 字符流
重定向 设置状态吗为302 添加响应头Location(告诉他重定向到哪里去) //response.setStatus(302); //添加响应头Locatio ...
- 将csv文件读入数据库
USE LHJTest create table #temp6//创建临时表 ( A nvarchar(max) NOT NULL, B nvarchar(max), C nvarchar(max ...
- Java JVM类加载机制
虚拟机的类加载机制是:JVM把描述类的数据从.class文件加载到内存,并对数据进行校验.解析.初始化,最终形成可以被JVM直接使用的Java类型. 加载.连接(验证.准备.解析).初始化.使用.卸载 ...