ncc匹配(一,理论)

本文介绍了NCC(NormalizedCrossCorrelation)在图像匹配中的原理,包括其基于概率论的相关性计算方法。作者通过C#代码展示了灰度NCC的应用,并提到OpenCV中的直方图梯度(HOG)可以弥补NCC在旋转不变性的不足。
摘要由CSDN通过智能技术生成

前头从来没用过ncc,基于形状匹配搞定后,又翻了翻learning opencv,他并不推荐ncc,而是力推emd,这也是当初我没考虑用ncc的原因。

当初看到ncc公式很复杂,也就忘了。

我的第一个匹配,是最笨的,花了好几秒才有结果,就是模板在图像中实实在在的足行足列找。

后来改进了一下,模板中使用隔行隔列,速度有所上升,但还是慢。

这也是我估计ncc慢的原因。

但opencv有出彩的地方,我一直记不住,就是利用直方图,进行ncc匹配。

闲来无事,研究一下ncc,他的匹配原理是概率论里的相关性。

我们定义,学习模板和图像中任意一个和模板宽高相同的扣图是两个变量的函数,即,学习模板是变量a的函数,图像中任意一个和模板宽高相同的扣图是变量b的函数。

定义,Z(a,b)是变量a和b的协方差。

定义,D(a)是学习模板的方差,D(b)是图像中任意一个和模板宽高相同的扣图的方差。

那么概率论给出了,变量a和变量b的相关性函数:

p=Z(a,b)/sqrt(D(a)*D(b)),sqrt是平方根的意思。条件是方差不为零。

如果学习模板T里的灰度全为零D(a)=0,或者图像中任意一个和模板宽高相同的扣图S灰度全为零D(b)=0,则分母为零,就会异常。

p=1,变量a和b线性相关,我们称为模板T和S匹配。p=0,则变量a和b不相关,模板T和S匹配不匹配。1>=p>0,就是匹配得分情况。

变量a和b不相关,即独立,独立p=0。书中给出了证明:我抄下来了:

协方差=期望(a-期望a)(b-期望b),因为独立,所以

协方差=期望(a-期望a)期望(b-期望b),因为期望(a-期望a)=0,期望(b-期望b)=0,所以

p=Z(a,b)/sqrt(D(a)*D(b))=0/sqrt(D(a)*D(b))=0,证毕

若线性相关(隐含了缩放也可匹配),即a=c*b+x,表示a和b是线性关系。p=1如何证明?我学着证明了一下:

协方差=期望(a-期望a)(b-期望b)=E(a-Ea)(b-Eb)=E(c*b+x-E(c*b+x))(b-Eb)

=E(c*b+x-E(c*b)-x)(b-Eb)==E(c*b-E(c*b))(b-Eb)=c*E(b-Eb)(b-Eb)

而E(b-Eb)(b-Eb)就是b的方差=D(b)

p=Z(a,b)/sqrt(D(a)*D(b))=c*E(b-Eb)(b-Eb)/sqrt(D(a)*D(b))=c*D(b)/sqrt(D(a)*D(b))

因为d(a)=期望(a-期望a)(a-期望a)=E(a-Ea)(a-Ea)

=E(c*b+x-E(c*b+x))(c*b+x-E(c*b+x))

=c*c*E(b-Eb)(b-Eb)=c*c*D(b)

所以:p=c*D(b)/sqrt(D(a)*D(b))中D(a)被上面公式替换,

p=c*D(b)/sqrt(c*c*D(b)*D(b))=c*D(b)/(c*D(b))=1

证毕。

下面是验证灰度ncc匹配的c#代码:

 //下面比对学习到的roiImage备用ncc和匹配到的roiImage备用ncc2两幅图像
              // 下面使用灰度法ncc202402011731
              //   没有考虑旋转
              double 学习凸包的中心x = 0; 
              double pipei凸包的中心x = 0;
              for (int i = 0; i < roiwforncc * roihforncc; i++)
              {
                  学习凸包的中心x += roiImage备用ncc[i];
                  pipei凸包的中心x += roiImage备用ncc2[i];
              }
              学习凸包的中心x = 学习凸包的中心x /(roiwforncc * roihforncc);
              pipei凸包的中心x = pipei凸包的中心x / (roiwforncc * roihforncc);
              double aa = 0;
              double bb = 0;
              double cc = 0;
              for (int i = 0; i < roiwforncc * roihforncc; i++)
              {
                  aa += (roiImage备用ncc[i] - 学习凸包的中心x) * (roiImage备用ncc2[i] - pipei凸包的中心x);
                  bb += (roiImage备用ncc[i] - 学习凸包的中心x) * (roiImage备用ncc[i] - 学习凸包的中心x);
                  cc += (roiImage备用ncc2[i] - pipei凸包的中心x) * (roiImage备用ncc2[i] - pipei凸包的中心x);
              }
              double p = 0;
              p = aa / Math.Sqrt(bb * cc);

下一篇给出验证前面直方图梯度角度(hog)的ncc代码,补充ncc对旋转的不足

opencv中的直方图ncc就不验证了,公式有,自己写一下。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NCC(Normalized Cross Correlation)匹配是一种常用的图像匹配方法,它可以用于在两幅图像中找到相似的区域。在实际应用中,NCC匹配的计算量较大,因此需要加速算法的实现。其中,积分图是一种有效的加速方法,可以将NCC匹配的计算复杂度从O(n^2)降低到O(n),其中n是图像大小。 Matlab中可以使用积分图函数`integralImage`来生成积分图,同时使用`normxcorr2`函数进行NCC匹配。具体步骤如下: 1.将待匹配的模板图像和目标图像都转换为灰度图像。 2.使用`integralImage`函数分别生成模板图像和目标图像的积分图。 3.计算模板图像的平均值和标准差,用于归一化处理。 4.使用`normxcorr2`函数进行NCC匹配,得到匹配结果。 下面是一个简单的示例代码: ```matlab % 读入图像 template = rgb2gray(imread('template.jpg')); target = rgb2gray(imread('target.jpg')); % 生成积分图 integ_template = integralImage(template); integ_target = integralImage(target); % 计算模板图像的平均值和标准差 mean_template = mean(template(:)); std_template = std(template(:)); % 归一化处理 norm_template = (template - mean_template) / std_template; % NCC匹配 corr = normxcorr2(norm_template, target); % 显示匹配结果 figure; imshow(target); hold on; [x,y] = find(corr == max(corr(:))); rectangle('Position',[y(1)-size(template,2)/2,x(1)-size(template,1)/2,size(template,2),size(template,1)],'EdgeColor','r','LineWidth',2); ``` 其中,`rectangle`函数用于在目标图像上绘制匹配结果的矩形框。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值