ncc匹配(三,opencv相关性匹配ncc与数学相关性匹配对比解惑)

opencv关于ncc说,,完全匹配p=1,完全不匹配p=-1,p=0表示无关联。

数学书概率论中说,|p|=1,是线性相关,p=0,不相关。

我在程序中验证后,发现,数学书更准确。

第一,线性相关就是匹配相关。

第二,p=-1,也是完全匹配。怎么得到值是-1,或逼近-1的值呢?

学习模板不变,匹配到的图像,计算p=1;

然后,灰度翻转匹配到的图像(黑白相反),

即    roiImage备用ncc3[i * roiwforncc + j] =(byte)(255-
                        globgaospydoutimgN精细for90[i * localww1per4 + j + tihuan]);

公式不变,ncc的结果p=-1出现,

也就是说,0,40,80,255,0这一串数和255-0,255-40,255-80,255-255,255-0

匹配结果是p=-1,也就是说,黑白颠倒,而形状一样,0,40,80,255,0这一串数和0,40,80,255,0自然p=1.

第三,线性相关比匹配表达的意思更准确,线性相关表达了比例缩放(尺度变化)并不影响结果,而匹配,我们首先直观的理解是,不带比例缩放的。

不信你看,相关的两幅图,模板和匹配结果图像,都是长m,宽n。

实际缩放1/4,仍然可以用这个公式匹配,怎么做呢?

a,变换到0-255的直方图

b,w*h的模板,和缩放图像1/2*w*1/2*h(比如我们用模板隔行隔列取图),他们的直方图是一致的。

c,在直方图基础上,样本数是256,均值各算各,公式仍可以保证正确匹配。

下面是测试代码:

//roiImage直方图ncc4, roiImage直方图ncc都使用原图
             
              double[] 百分比直方图=new double[256];
         double      junzhi = 0;
        double       junzhiM = 0;
              for (int i = 0; i < roiwforncc * roihforncc; i++)
              {               
                  百分比直方图[roiImage直方图ncc[i]]++;
                 
              }
          
              for (int h = 0; h < 256; h++)
              {


                  junzhi += 百分比直方图[h] * 百分比直方图[h] / (roiwforncc * roihforncc);
              }
             
              double[] 百分比直方图m = new double[256];
              //应该做插值或高斯平滑,否则竖线或横线刚好在隔行隔列上,就干掉了,先试一试,再试一试202402031211
              for (int i = 0; i < roiwforncc; i+=2)
                  for (int j = 0; j <  roihforncc; j+=2)
              {
                  int temp = j * roiwforncc + i;
                
                  百分比直方图m[roiImage直方图ncc4[temp]]++;
                 
              }
           
         
              for (int h = 0; h < 256; h++)
              {

                  junzhiM += 百分比直方图m[h] * 4 * 百分比直方图m[h] / (roiwforncc * roihforncc);
              }
              double aa1 = 0;
              double bb1 = 0;
              double cc1 = 0;
           
              for (int i = 0; i < 256; i++)
              {

                  aa1 += (百分比直方图[i] - junzhi) * (百分比直方图m[i] - junzhiM);
                  bb1 += (百分比直方图[i] - junzhi) * (百分比直方图[i] - junzhi);
                  cc1 += (百分比直方图m[i] - junzhiM) * (百分比直方图m[i] - junzhiM);
              }
              double p1 = 0;
              p1 = aa1 / Math.Sqrt(bb1 * cc1);

最后,要解释一下,线性相关公式中有1/(m*n)在求和西格玛之前,为什么没有了,其实是协方差分子和方差分母都有这个系数,消掉了。

你可能感兴趣的:(机器视觉,算法)