dm-script 中零均值归一化互相关的计算
Calculations of zero mean normalized cross-correlation in dm-script
现在我正在尝试制作一个 dm 脚本来计算两个图像之间的零均值归一化互相关 (ZNCC)。在ZNCC的计算中,已知使用FFT和积分图像是非常有效的方案。所以我制作了以下测试脚本来计算积分图像。然而,在我看来,这种计算对于相机图像的典型图像尺寸来说不够快。你有什么好的想法来提高积分图像计算的计算速度吗?或者,有人知道一些用于快速 ZNCC 计算的脚本吗?我可以采纳你的意见吗?
Image integralImg( Image &inputImg ){
Number nx, ny
Number iu, iv, tmpval, fval, integ_pre1, integ_pre2, integ_pre3
Image integImg := inputImg.ImageClone()
integImg.SetName("Integral Image of " + inputImg.GetName())
inputImg.GetSize(nx, ny)
fval = inputImg.GetPixel(0, 0)
integImg.SetPixel(0, 0, fval)
FOR(iu = 1 ; iu < nx ; iu++){
fval = inputImg.GetPixel(iu, 0)
integ_pre1 = integImg.GetPixel(iu - 1, 0)
integImg.SetPixel(iu, 0, fval + integ_pre1)
}
FOR(iv = 1 ; iv < ny ; iv++){
fval = inputImg.GetPixel(0, iv)
integ_pre2 = integImg.GetPixel(0, iv - 1)
integImg.SetPixel(0, iv, fval + integ_pre2)
}
FOR(iv = 1 ; iv < ny ; iv++){
FOR(iu = 1 ; iu < nx ; iu++){
fval = inputImg.GetPixel(iu,iv)
integ_pre1 = integImg.GetPixel(iu - 1, iv)
integ_pre2 = integImg.GetPixel(iu, iv - 1)
integ_pre3 = integImg.GetPixel(iu - 1, iv - 1)
integImg.SetPixel(iu, iv, fval + integ_pre1 + integ_pre2 - integ_pre3)
}
}
Return integImg
}
//
Number nx = 1024
Number ny = 1024
Image IMG := RealImage("test",4,nx,ny)
IMG = Random()
//
Image intIMG
intIMG := integralImg( IMG )
intIMG.ShowImage()
你能不能只用命令
RealImage CrossCorrelate( RealImage source1, RealImage source2 )
?
如果不是,你能给我解释一下,ZNCC 到底有什么不同吗?
(请注意,您可以通过 img -= mean(img)
)
轻松地将每个源图像移动到零平均值
现在我正在尝试制作一个 dm 脚本来计算两个图像之间的零均值归一化互相关 (ZNCC)。在ZNCC的计算中,已知使用FFT和积分图像是非常有效的方案。所以我制作了以下测试脚本来计算积分图像。然而,在我看来,这种计算对于相机图像的典型图像尺寸来说不够快。你有什么好的想法来提高积分图像计算的计算速度吗?或者,有人知道一些用于快速 ZNCC 计算的脚本吗?我可以采纳你的意见吗?
Image integralImg( Image &inputImg ){
Number nx, ny
Number iu, iv, tmpval, fval, integ_pre1, integ_pre2, integ_pre3
Image integImg := inputImg.ImageClone()
integImg.SetName("Integral Image of " + inputImg.GetName())
inputImg.GetSize(nx, ny)
fval = inputImg.GetPixel(0, 0)
integImg.SetPixel(0, 0, fval)
FOR(iu = 1 ; iu < nx ; iu++){
fval = inputImg.GetPixel(iu, 0)
integ_pre1 = integImg.GetPixel(iu - 1, 0)
integImg.SetPixel(iu, 0, fval + integ_pre1)
}
FOR(iv = 1 ; iv < ny ; iv++){
fval = inputImg.GetPixel(0, iv)
integ_pre2 = integImg.GetPixel(0, iv - 1)
integImg.SetPixel(0, iv, fval + integ_pre2)
}
FOR(iv = 1 ; iv < ny ; iv++){
FOR(iu = 1 ; iu < nx ; iu++){
fval = inputImg.GetPixel(iu,iv)
integ_pre1 = integImg.GetPixel(iu - 1, iv)
integ_pre2 = integImg.GetPixel(iu, iv - 1)
integ_pre3 = integImg.GetPixel(iu - 1, iv - 1)
integImg.SetPixel(iu, iv, fval + integ_pre1 + integ_pre2 - integ_pre3)
}
}
Return integImg
}
//
Number nx = 1024
Number ny = 1024
Image IMG := RealImage("test",4,nx,ny)
IMG = Random()
//
Image intIMG
intIMG := integralImg( IMG )
intIMG.ShowImage()
你能不能只用命令
RealImage CrossCorrelate( RealImage source1, RealImage source2 )
?
如果不是,你能给我解释一下,ZNCC 到底有什么不同吗?
(请注意,您可以通过 img -= mean(img)
)