OpenCV /图像处理技术,用于查找图像中亮点的中心

Law*_*ceH 5 python opencv image-processing feature-detection

我目前正在做一个基于本文所述方法的项目: 从单个夜空图像中进行摄像机校准

作为计算机视觉的初学者,我不太明白如何实现本文中使用的方法来找到图像中所有亮点(灯具)的中心,特别是4.1节中的段落:

大小为15×15像素的周围斑块(图1(a))由给定因子(图1(c))上采样,并计算相应的梯度图(图1(d)).从最亮区域开始,降低灰度值阈值,直到能量函数最大化.能量函数定义为边界梯度的总和,并通过边界长度归一化(图1(e)).这导致图1(f)中所示的分段星形图像.分割确保加权重心算法[11]给出稳健的估计.

上采样图像 应用渐变功能后 在能量函数应用分段图像之后

根据我的理解,我认为我可以对上采样图像执行拉普拉斯/索贝尔梯度函数,但之后我不太确定如何执行能量函数部分并生成分割图像.另外我还想了解如何使用openCV或其他python库实现加权重心算法来找到亮点的中心.

非常感谢,如果你们中的任何一个人可以为此提供一些灯光.

感谢致敬.

Boy*_*nov 5

energy function在此上下文中要带走的主要内容是用于最大化问题的任何函数。在这里,能量函数是梯度/导数/差异的总和(即在这种情况下“检测到的边界可能性”)。

由于您似乎具有非算法背景,我建议您阅读广度优先搜索(请记住,图像是一种非常特殊的图形类型,其中每条边都是一个像素,与相邻的边相连)、递归洪水填充.

  1. 放大/缩小图像
  2. 运行水平和垂直 Sobel 过滤器。将结果图像合并为grad_img= max_per_pixel(sobel_horiz,sobel_vert)。
  3. 对于每个 15x15 像素块,找到最亮的点。这是seed明星的。
  4. 从 1x1 开始,region其中包含seed. 继续添加相邻像素region(推荐广度优先遍历)。通过像素值的总和计算能量grad_img,像素坐标为 的边界region。如果能量高于前一次迭代的能量,则将新像素添加到region。如果不是,则拒绝该像素。
  5. 找到闭合轮廓或像素集合的重心并不是一项艰巨的任务。要么通过其数学定义(所有区域内像素的 x 和 y 坐标之和,除以面积),要么通过使用图像矩(cv::moments示例)来完成。

我的解决方案与他们的解决方案有点不同。他们实际上运行了一种填充算法,填充所有亮度像素 [阈值;255],计算能量函数,降低阈值,冲洗和重复,当它们最大化能量函数时停止。请注意,他们的算法效率非常低,因为与我的建议中的 1 个洪水填充相比,他们为每个预先检测到的恒星有效地进行了多达 255 个洪水填充,这在实践中可能是一个性能问题。