归一化交叉相关Normalization cross correlation (NCC)

相关系数,图像匹配

NCC正如其名字,是用来描述两个目标的相关程度的,也就是说可以用来刻画目标间的相似性。一般NCC也会被用来进行图像匹配,即在一个图像中搜索与一小块已知区域的NCC最高的区域作为对应匹配,然后对准整幅图像。

假设两幅图像,那么其NCC可如下计算:

其中表示点乘运算。

比如下面两幅图像,我们想对齐

part1.jpg

part2.jpg

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

templete.jpg

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

region.jpg

最终对齐的结果如下

result.jpg
  1. function NCC 

  2. close all 

  3. part2 =imread('part1.png'); 

  4. part1 = imread('part2.png'); 


  5. imshow(part2);title('part2') 

  6. figure, imshow(part1);title('part1'); 

  7. % 选取template和搜索区域region. Note:template的大小必须小于region 

  8. figure, 

  9. [sub_part2,rect_part2]=imcrop(part2);% template 

  10. [sub_part1,rect_part1]=imcrop(part1);% region 


  11. figure, imshow(sub_part2) 

  12. figure, imshow(sub_part1); 


  13. [x,y,z] = normcorr2(double(sub_part2(:,:,1)),double(sub_part1(:,:,1))); 

  14. figure,surf(x,y,z),shading flat 

  15. %% 寻找偏置 

  16. [~,imax]=max(z(:));% 

  17. [yoffset,xoffset]=ind2sub(size(z),imax(1)); 

  18. %% 图像对齐 

  19. % 配对点在第一幅图像中到边界的距离 


  20. rect_part1=floor(rect_part1); 

  21. left1=rect_part1(1)+xoffset; 

  22. right1=size(part1,2)-left1; 

  23. up1=rect_part1(2)+yoffset; 

  24. down1 = size(part1,1)-left1; 

  25. % 配对点在第二幅图像中到边界的距离 

  26. rect_part2=floor(rect_part2); 

  27. left2=rect_part2(1); 

  28. right2=size(part2,2)-left2; 

  29. up2=rect_part2(2); 

  30. down2 = size(part2,1)-up2; 


  31. img=zeros(max(up1,up2)+max(down1,down2)+1,max(left1,left2)+max(right1,right2)+1,size(part1,3)); 

  32. sx=max(left1,left2)+1; 

  33. sy=max(up1,up2)+1; 

  34. img(sy-up1+1:sy-up1+size(part1,1),sx-left1+1:sx-left1+size(part1,2),:)=part1; 

  35. img(sy-up2+1:sy-up2+size(part2,1),sx-left2+1:sx-left2+size(part2,2),:)=part2; 

  36. imshow(uint8(img)); 

  37. end 




  38. function [x,y,z]=normcorr2(I1,I2) 

  39. % I1,I2是单通道图像,即矩阵 

  40. % I1 is template 

  41. % I2 is the region where match pairs are searched 

  42. [m1,n1]=size(I1); 

  43. [m2,n2]=size(I2); 

  44. z=conv2(I2,rot90(I1,2),'valid'); 

  45. im2=cumsum(I2.^2,1); 

  46. im2=cumsum(im2,2); 

  47. sum1=sum(sum(I1.^2,1),2); 

  48. % nz=zeros(m2-m1+1,n2-n1+1); 

  49. wrapIm2=zeros(1+m2,1+n2); 

  50. wrapIm2(2:end,2:end)=im2; 

  51. 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; 

  52. nz=sqrt(nz); 

  53. z=z./nz; 

  54. [x,y]=meshgrid(1:n2-n1+1,1:m2-m1+1); 

  55. end 

1477398865849.jpg

1477398880386.jpg

1477398892560.jpg

1477398906100.jpg

1477398924878.jpg

有些文献在计算卷积的时候,总说要把矩阵逆排序之后再对应相乘,包括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)的更多相关文章

  1. 交叉验证(Cross Validation)简介

    参考    交叉验证      交叉验证 (Cross Validation)刘建平 一.训练集 vs. 测试集 在模式识别(pattern recognition)与机器学习(machine lea ...

  2. 关于交叉熵(cross entropy),你了解哪些

    二分~多分~Softmax~理预 一.简介 在二分类问题中,你可以根据神经网络节点的输出,通过一个激活函数如Sigmoid,将其转换为属于某一类的概率,为了给出具体的分类结果,你可以取0.5作为阈值, ...

  3. S折交叉验证(S-fold cross validation)

    S折交叉验证(S-fold cross validation) 觉得有用的话,欢迎一起讨论相互学习~Follow Me 仅为个人观点,欢迎讨论 参考文献 https://blog.csdn.net/a ...

  4. 几种交叉验证(cross validation)方式的比较

    模型评价的目的:通过模型评价,我们知道当前训练模型的好坏,泛化能力如何?从而知道是否可以应用在解决问题上,如果不行,那又是哪里出了问题? train_test_split 在分类问题中,我们通常通过对 ...

  5. 【机器学习基础】交叉熵(cross entropy)损失函数是凸函数吗?

    之所以会有这个问题,是因为在学习 logistic regression 时,<统计机器学习>一书说它的负对数似然函数是凸函数,而 logistic regression 的负对数似然函数 ...

  6. 关于交叉熵损失函数Cross Entropy Loss

    1.说在前面 最近在学习object detection的论文,又遇到交叉熵.高斯混合模型等之类的知识,发现自己没有搞明白这些概念,也从来没有认真总结归纳过,所以觉得自己应该沉下心,对以前的知识做一个 ...

  7. 交叉验证(cross validation)

    转自:http://www.vanjor.org/blog/2010/10/cross-validation/ 交叉验证(Cross-Validation): 有时亦称循环估计, 是一种统计学上将数据 ...

  8. 【深度学习】批归一化(Batch Normalization)

    BN是由Google于2015年提出,这是一个深度神经网络训练的技巧,它不仅可以加快了模型的收敛速度,而且更重要的是在一定程度缓解了深层网络中"梯度弥散"的问题,从而使得训练深层网 ...

  9. TensorFlow 实战(一)—— 交叉熵(cross entropy)的定义

    对多分类问题(multi-class),通常使用 cross-entropy 作为 loss function.cross entropy 最早是信息论(information theory)中的概念 ...

随机推荐

  1. sphinx 配置文件全解析

    sphinx的配置文件是在配置的时候最容易出错的了: 我们先要明白几个概念: source:数据源,数据是从什么地方来的. index:索引,当有数据源之后,从数据源处构建索引.索引实际上就是相当于一 ...

  2. 如何扩大LVM 逻辑分区的大小?

    参考: (http://blog.csdn.net/t0nsha/article/details/7296851) LVM (Logical volume management) 执行 df 指令查看 ...

  3. JS 工厂模式

    1.什么是工厂模式 工厂模式是面向对象的设计模式,作用在于创建一个对象,mixin模式也是面向对象的设计模式,作用在于继承. 工厂模式定义一个接口,让实现这个接口的类来决定实例化哪个类,也就是说通过一 ...

  4. 浅谈Android下的Bitmap之大Bitmap加载

    引言 我们常常提到的“Android程序优化”,通常指的是性能和内存的优化,即:更快的响应速度,更低的内存占用.Android程序的性能和内存问题,大部分都和图片紧密相关,而图片的加载在很多情况下很用 ...

  5. druid 配置

    连接池配置,以及相关配置 <bean id="logFilter" class="com.alibaba.druid.filter.logging.Slf4jLog ...

  6. 如何修改Xampp中MySQL的root密码?

    MySQL 的“root”用户默认状态是没有密码的,所以在 PHP 中您可以使用 mysql_connect("localhost","root"," ...

  7. cookie中文乱码

    在学习当中碰到cookie中文乱码问题,问题原因:cookie对中文不太支持,将中文放入cookie中会报错误. 解决办法: 1.编码 将中文进行编码再放入cookie中: String userna ...

  8. UVa2521

    理解:max 记录的是有大牌的个数 mid 是有中断 而造成的不确定  我理解是一个间断点以下的 数和一个间断点抵消 在前面没有间断的情况下 才能确定这张牌稳赢 #include<iostrea ...

  9. 号外!GNOME 3.22 正式发布喽!!!

    导读 经过半年的努力开发,别名为“卡尔斯鲁厄”的 GNOME 3.22 正式发布了!“GNOME Software 可以安装和更新 Flatpak 软件包,GNOME Builder 则可以创建它们, ...

  10. sujection重构

    def create @subjection = @subject.subjections.new if params[:video_or_show_id].length == 20 show = S ...