图像匹配算法NCC(Normalized Cross Correlation)的python实现

背景

相关系数其实就是皮尔森系数,一般是在概率中判断两个随机变量的相关性,公式为:
在这里插入图片描述
其中,Cov(X,Y)表示的是随机变量X,Y的协方差。D(X)与D(Y)则分别表示随机变量X,Y的方差。皮尔森系数的值域为[-1,1],系数越接近1表明这两个随机变量越相关,越接近-1表明这两个随机变量越不相关。讲到这里,突然想起概率中讲的一句话: 独 立 一 定 不 相 关 , 不 相 关 不 一 定 独 立 \color{#FF3030}{独立一定不相关,不相关不一定独立}

然而也可以利用皮尔森系数计算两张图片的相关性。

代码

import numpy as np
import cv2

im1 = '1.png'
im2 = '0.png'
img1 = cv2.imread(im1)
img2 = cv2.imread(im2)

# 图片2的标准差
print(np.std(img2))
# 相关系数,这里使用的是有偏估计
print(np.mean(np.multiply((img1-np.mean(img1)),(img2-np.mean(img2))))/(np.std(img1)*np.std(img2)))
输出结果

在这里插入图片描述

Reference

1.NCC(Normalized Cross Correlation)归一化互相关原理和C++代码实现
2.图像配准】基于灰度的模板匹配算法(一):MAD、SAD、SSD、MSD、NCC、SSDA、SATD算法

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
NCC(Normalized Cross Correlation图像匹配算法是一种常用的图像匹配方法,它可以在两幅图像中匹配出相似的区域,具体实现方式是通过计算两幅图像的归一化互相关函数(Normalized Cross-Correlation),得到匹配区域的相似度。 以下是NCC图像匹配算法的基本流程: 1. 对待匹配的两幅图像进行预处理,如灰度化、降噪等操作。 2. 在其中一幅图像上选择一个目标区域,通常是一个特征点或者一个物体。 3. 在另一幅图像中搜索与目标区域最相似的区域,通常使用滑动窗口的方式进行搜索。 4. 计算两个区域的归一化互相关函数,得到它们之间的相似度,相似度越高则表示匹配效果越好。 5. 重复步骤3和4,直到找到最佳匹配区域。 下面是一个简单的NCC图像匹配算法C++实现代码,仅供参考: ``` #include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main() { Mat img1 = imread("image1.jpg", IMREAD_GRAYSCALE); Mat img2 = imread("image2.jpg", IMREAD_GRAYSCALE); // 预处理:灰度化、归一化 Mat norm_img1, norm_img2; normalize(img1, norm_img1, 0, 255, NORM_MINMAX, CV_8U); normalize(img2, norm_img2, 0, 255, NORM_MINMAX, CV_8U); // 选择目标区域 Rect roi(100, 100, 50, 50); Mat target = norm_img1(roi); // 搜索最佳匹配 double max_sim = 0; Point max_loc; for (int y = 0; y < norm_img2.rows - roi.height; y++) { for (int x = 0; x < norm_img2.cols - roi.width; x++) { Mat search = norm_img2(Rect(x, y, roi.width, roi.height)); Scalar sim = mean(target.mul(search)) / sqrt(mean(target.mul(target))) / sqrt(mean(search.mul(search))); if (sim > max_sim) { max_sim = sim; max_loc = Point(x, y); } } } // 显示结果 rectangle(img1, roi, Scalar(255), 1); rectangle(img2, Rect(max_loc.x, max_loc.y, roi.width, roi.height), Scalar(255), 1); imshow("img1", img1); imshow("img2", img2); waitKey(0); return 0; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还是少年呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值