1. NCC概述
基于Normalized cross correlation(NCC)用来比较两幅图像的相似程度已经是一个常见的图像处理手段。在工业生产环节检测、监控领域对对象检测与识别均有应用。NCC算法可以有效降低光照对图像比较结果的影响。而且NCC最终结果在-1到1之间,所以特别容易量化比较结果,只要给出一个阈值就可以判断结果的好与坏。
2. NCC原理
NCC匹配算法是一种经典的匹配算法。通过计算模板图像和搜索图像的互相关值确定匹配的程度。互相关值最大时的位置决定了模板图像在搜索图像中的位置。假设搜索图像S的尺寸为M x M,模板T的尺寸为N x N,其中M> N,M,N代表图像像素大小。模板T在图像S上平移,模板所覆盖的子图记作Si,j,(i,j)为子图左上角顶点在搜索图S中的坐标。在实际匹配应用中,搜索图和模板的相似性通过度量函数来度量,则归一化积相关匹配度量定义为:
假设图像refer是标准模板图像,target 是目标图像,M x N表示图像大小,用于检测是否有其它对象在目标图像中,通过每个像素移动窗口计算窗口下模板图像与目标图像之间的NCC值可以判断窗口子图像是否相同,NCC计算公式如下:
其中:
mxn表示窗口大小,这样的计算复杂度就为0(m x n x M x N)。从上面公式就可以看出其中均值和平方和可以通过积分图预计算得到,对于模板和目标图像大小-致的应用场景来说,
其中根据积分图像可以提前计算出任意窗口大小和与平方和
其中μf, μr,分别表示带检测图像与参考模板图像的窗口均值。
上述两个计算实现了窗口半径无关的常量时间计算,唯一缺少的是 下面计算公式
也可以通过各自的积分图计算预先得到。这样就完成了整个预计算生成。依靠索引表查找计算结果,NCC就可以实现线性时间的复杂度计算,而且时间消耗近似常量跟窗口半径大小无关,完全可以满足实时对象检测工业环境工作条件。
3. 算法步骤
为了减小计算量,我们首先要把输入的图像转换为灰度图像,在灰度图像的基础上完成整个NCC计算检测。
把彩色图像转换为灰度图像
(1)预计算模板图像和目标图像的积分图
(2)根据输入的窗口半径大小使用积分图完成NCC计算
(3)根据阈值得到匹配或者不匹配区域。
(4)输出结果
4. 实验内容
4.1 实验代码
import numpy as np
import cv2
im1 = 'C:/picture/1.jpg'
im2 = 'C:/picture/2.jpg'
img1 = cv2.imread(im1, cv2.CV_8UC1)
img2 = cv2.imread(im2, cv2.CV_8UC1)
rows, cols = img1.shape
print(img1.shape)
def translaton(image, shape):
step = round((shape[0]-1)/2)
print(step)
shifted = []
for i in range(0, step+1):
for j in range(0, step+1):
if i==0 and j==0:
M1 = np.float32([[1, 0, i], [0, 1, j]])
shifted.append(cv2.warpAffine(image, M1, (image.shape[1], image.shape[0])))
elif i==0 and j!=0:
M1 = np.float32([[1, 0, i], [0, 1, j]])
M2 = np.float32(