C++ 相关系数的计算以及在图像配准领域应用演示

佚名 / 2023-06-28 / 原文

相关系数(皮尔逊相关系数)公式如下

 

 

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

// 计算平均值
double mean(vector<double> v) {
    double sum = 0;
    for (int i = 0; i < v.size(); i++) {
        sum += v[i];
    }
    return sum / v.size();
}

// 计算协方差
double covariance(vector<double> x, vector<double> y) {
    double x_mean = mean(x);
    double y_mean = mean(y);
    double sum = 0;
    for (int i = 0; i < x.size(); i++) {
        sum += (x[i] - x_mean) * (y[i] - y_mean);
    }
    return sum / x.size();
}

// 计算相关系数
double correlation(vector<double> x, vector<double> y) {
    double cov = covariance(x, y);
    double x_std = sqrt(covariance(x, x));
    double y_std = sqrt(covariance(y, y));
    return cov / (x_std * y_std);
}


int main() {
    vector<double> x1 = { 2, 3, 4, 5, 6 };
    vector<double> y1 = { 2, 3, 4, 5, 6 };
    cout << "x1: ";
    for (int i = 0; i < x1.size(); i++) {
        cout << x1[i] << " ";
    }
    cout << endl;

    cout << "y1: ";
    for (int i = 0; i < y1.size(); i++) {
        cout << y1[i] << " ";
    }
    cout << endl;
    cout << "x1-y1相关系数: " << correlation(x1, y1) << "\r\n" << endl;


    vector<double> x2 = { 2, 3, 4, 5, 6 };
    vector<double> y2 = { 20, 30, 40, 50, 60 };
    cout << "x2: ";
    for (int i = 0; i < x2.size(); i++) {
        cout << x2[i] << " ";
    }
    cout << endl;

    cout << "y2: ";
    for (int i = 0; i < y2.size(); i++) {
        cout << y2[i] << " ";
    }
    cout << endl;
    cout << "x2-y2相关系数: " << correlation(x2, y2) << "\r\n" << endl;

    vector<double> x3 = { 2, 3, 4, 5, 6 };
    vector<double> y3 = { 2, 3, 5, 6, 7 };
    cout << "x3: ";
    for (int i = 0; i < x1.size(); i++) {
        cout << x3[i] << " ";
    }
    cout << endl;

    cout << "y3: ";
    for (int i = 0; i < y3.size(); i++) {
        cout << y3[i] << " ";
    }
    cout << endl;
    cout << "x3-y3相关系数: " << correlation(x3, y3) << "\r\n" << endl;

    vector<double> x4 = { 2, 3, 4, 5, 6 };
    vector<double> y4 = { 6, 2, 5, 3, 4 };
    cout << "x4: ";
    for (int i = 0; i < x4.size(); i++) {
        cout << x4[i] << " ";
    }
    cout << endl;

    cout << "y4: ";
    for (int i = 0; i < y4.size(); i++) {
        cout << y4[i] << " ";
    }
    cout << endl;
    cout << "x4-y4相关系数: " << correlation(x4, y4) << "\r\n" << endl;

    vector<double> x5 = { 2, 3, 4, 5, 6 };
    vector<double> y5 = { 7, 6, 5, 4, 3 };
    cout << "x5: ";
    for (int i = 0; i < x5.size(); i++) {
        cout << x5[i] << " ";
    }
    cout << endl;

    cout << "y5: ";
    for (int i = 0; i < y5.size(); i++) {
        cout << y5[i] << " ";
    }
    cout << endl;
    cout << "x5-y5相关系数: " << correlation(x5, y5) << "\r\n" << endl;

    return 0;
}
View Code

 

 

相关系数越接近+1则两个向量同方向接近,相关系数越接近-1则两个向量反方向接近。该系数的应用举例 ---图像配准

 

 原始图像[ 10 12 15 20 30 40 50 30 15 10] 总共10个长度的像素,裁剪图像[ 20 30 40 50]总共4个长度的像素,在原始图像前补4 -1 个0,让裁剪图像依次从左到右得到 10 +4 -1 个长度的系数向量。在这个系数向量中找到最大的系数

 

 

本文引用

相关系数——皮尔逊相关系数的公式及其理解_胤风的博客-CSDN博客