我正在使用C ++创建一个程序来查找数组中峰的子像素位置。目前,我在3x3窗口内找到最大值,使得每个窗口中的中心像素大于其8个邻居中的每一个。
是否有众所周知的方法来确定峰值到子像素精度的位置?
我已经阅读了关于通过泰勒扩展到二次项来表示数组并将其导数归零以找到偏移量,但它似乎有点重量级......
答案 0 :(得分:1)
如果这对你来说似乎是“重量级”,那么一切都是重量级的。一般来说,您需要插值算法从离散表示到某些连续表示并找到峰值。使用“图像处理”意味着2D中的功能。我可以建议使用一些基本插值(线性,双线性,立方等)并找到导数变为0的峰值。
答案 1 :(得分:0)
谢谢@Ross。这是我写作的代码片段,以防其他人在寻找相同的东西。
//
// By approximating with Taylor expansion to quadratic terms, the peak should
// lie at offset [ix,iy] from as calculated by:
//
// [ix] = - [d2I/dx2 d2I/dxy]^-1 . [dI/dx]
// [iy] [d2I/dxy d2I/dy2] [dI/dy]
//
//
// Assume 'arr' is our array of values (i.e. image) and [x,y] is the location of
// of a peak pixel in the array. The interpolated location of the peak is given
// by the point [x+ix][y+iy].
//
float dx = (arr[x+1][y] - arr[x-1][y]) / 2.f;
float dy = (arr[x][y+1] - arr[x][y-1]) / 2.f;
float dxx = (arr[x+1][y] + arr[x-1][y] - 2 * arr[x][y]);
float dyy = (arr[x][y+1] + arr[x][y-1] - 2 * arr[x][y]);
float dxy = (arr[x+1][y+1] - arr[x+1][y-1] - arr[x-1][y+1] + arr[x-1][y-1]) / 4.f;
float det = 1.f/(dxx*dyy - dxy*dxy);
float ix = x - (dyy*dx - dxy*dy) * det;
float iy = y - (dxx*dy - dxy*dx) * det;