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

时间:2015-06-19 12:01:49

标签: python opencv image-processing feature-detection

我目前正在做一个基于本文所述方法的项目: Camera calibration from a single night sky image

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

  

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

upsampled image after gradient function applied after energy-function applied segmented image

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

非常感谢,如果你们中的任何人能为此提供一些启示。

谢谢和问候。

1 个答案:

答案 0 :(得分:4)

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

由于您似乎有非算法背景,我建议您阅读breadth-first search(请记住,图像是一种非常特殊的图形,其中每个边都是一个像素,连接到相邻的图像), recursionfloodfill

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

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