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)在求和西格玛之前,为什么没有了,其实是协方差分子和方差分母都有这个系数,消掉了。