【发布时间】:2020-04-15 09:46:48
【问题描述】:
假设我有一个图像,我想找到一个形状为 3x3 的子数组,其中包含与其他子数组相比的最大总和。
如何在 python 中有效地执行此操作(尽可能快地运行)?如果你能提供一个示例代码那就太好了。
我的具体问题: 我想在此热图中提取 blob 中心的位置
我不想只获得最大值,因为这会导致坐标不是很精确。斑点的真实中心实际上可能在 2 个像素之间。因此,最好在多点之间进行加权平均以获得亚像素精度。例如,如果有 2 个点 (x1,y1) 和 (x2,y2) 的值分别为 200 和 100。那么平均坐标将为 x=(200*x1+100*x2)/300 y=(200*y1+100*y2)/300
我的一个解决方案是进行卷积操作。但我认为它不够有效,因为它需要乘法到内核(只包含一个)。我正在寻找一个快速的实现,所以我不能自己循环,因为我不确定它是否会很快。
我想每隔几毫秒对 50 张图像执行此算法。 (图像作为一批进来)。具体来说,将这些图像视为输出热图的机器学习模型的输出。为了从这些热图中获取坐标,我需要在高强度坐标之间进行某种加权平均。我的想法是在图像上对 3x3 区域进行加权平均。我也愿意接受其他更快或更优雅的方法。
【问题讨论】:
-
你已经标记了convolution,所以你显然已经尝试过卷积/过滤。结果如何?您是否能够确定 blob 的范围(可能是边界框?)?这些斑点总是大小相同吗?每张图像只有一个斑点吗?我会尽可能减少搜索区域(或尽可能快地完成)并找到 blob 的加权质心。
-
OpenCV 或 tensorflow 中的普通卷积实现需要对内核进行乘法运算。它会起作用,但不是最快的。我想要一个不需要做任何乘法的实现,因为只有总和就足够了。另外我认为对于这个问题,也许有比卷积更好的技术,所以我在这里问它。如果您能够在没有内核的情况下实现卷积(并且运行速度很快),那么我也想使用它。 blob 的大小始终相同。理想情况下,应该有一个 blob,但模型可能会输出 2 个 blob(错误)。
-
加载图像,转换为灰度,Otsu的阈值,执行变形关闭,找到轮廓并选择最大的轮廓区域
-
试试
ndimage.center_of_mass怎么样? -
@Alex 看起来可以在 3x3 裁剪的图像周围使用,但不应该在整个图像上使用,因为它会很昂贵(至少理论上,实际上从未尝试过)
标签: image opencv sum 2d convolution