寻找“3x3形状的子数组具有最大总和”与使用未归一化的3x3盒式滤波器过滤后查找图像的最大值相同。因此,问题归结为有效地查找图像的最大值,您假设它是底层连续平滑信号的(可能是“嘈杂的”)离散样本 - 因此您希望找到亚像素位置。
你真的需要将问题分成两个部分:
1. 找到图像最大值的像素位置m =(xm,ym)。这仅需要访问图像中的每个像素,并对每个像素进行一次比较,因此它是O(N),因此只要您在本机图像分辨率下操作,就是最优的。在OpenCv中,可以使用
minMaxLoc函数完成。
2. 应用您正在使用的图像模型,在m的邻域中找到其(亚像素插值)最大值。
为了澄清第二点:您可以编写
我不想只得到最大点,因为这会导致坐标不太精确。实际上,斑点的真正中心可能在两个像素之间。
尽管这种说法直观上是有道理的,但为了能够计算,需要将其表述得更加精确。也就是说,您需要数学地表达出您对图像所做的假设,从而使您能够在像素采样位置之间搜索“真正”的最大值。
这样假设的一个简单示例是二次平滑性。在这种情况下,您假设在“真正”最大位置的小区域(例如3x3或5x5)内,图像信号z
可以很好地近似为二次函数:
z = A00 dx^2 + A01 dx dy + A11 dy^2 + A02 dx + A12 dy + A22
where:
dx = x - xm; dy = y - ym
这个假设是有道理的,如果基础信号至少是三阶连续可微的话,因为泰勒级数定理。从几何上讲,这意味着你假设(希望?)信号在其最大值附近看起来像一个二次曲面(一个抛物面或一个椭球体)。
然后,你可以对
m
周围的每个像素计算上述方程,用实际的图像值替换
z
,从而获得未知系数Aij的线性系统,方程数量与邻居像素数量相同(即使是3x3的邻域也会产生超约束系统)。在最小二乘意义下解决该系统可以得到“最优”的系数Aij。根据这个模型预测的理论最大值是第一偏导数为零的地方:
del z / del dx = 2 A00 dx + A01 dy = 0
del z / del dy = A01 dx + 2 A11 dy = 0
这是一个包含两个未知数
(dx, dy)
的线性系统,解决它可以得到最大值的估计位置,并通过上述
z
方程式预测最大值处的图像值。就计算成本而言,与遍历甚至中等大小的图像相比,所有这些模型估计都非常快速。
ndimage.center_of_mass
怎么样? - Alex