OpenCV/图像处理技术,用于查找图像中亮点的中心
OpenCV / Image Processing techniques to find the centers of bright spots in an image
我目前正在根据本文描述的方法做一个项目:
Camera calibration from a single night sky image
作为计算机视觉的初学者,我不太明白如何实现论文中使用的方法来找到图像中所有亮点(发光体)的中心,特别是4.1节中的段落:
The surrounding patch of size 15 × 15 pixels (Figure 1(a)), is upsampled by a given factor (Figure 1(c)) and the corresponding gradient map is calculated (Figure 1(d)). Starting from the brightest region, the gray value threshold is decreased, until an energy function is maximized. The energy function is defined as the sum of the border gradients and normalized by the border length (Figure 1(e)). This leads to a segmented star image shown in Figure 1(f). The segmentation ensures that the weighted centre of gravity algorithm [11] gives a robust estimation.
根据我的理解,我认为我可以对上采样图像执行拉普拉斯/索贝尔梯度函数,但之后我不太确定如何执行能量函数部分并生成分割图像。此外,我还想了解如何使用 openCV 或其他 python 库实现加权重心算法以找到亮点的中心。
如果你们中的任何人能提供一些线索,我们将不胜感激。
感谢和问候。
要带走的主要内容是在此上下文中使用的 energy function
是用于最大化问题的 any 函数。这里,能量函数是 gradients/derivatives/differences 的总和(即本例中的 "detected borders likelihood")。
由于你似乎没有算法背景,我建议你继续阅读 breadth-first search (remember an image is a very specific type of graph, where every edge is a pixel, connected to adjacent ones), recursion, and floodfill。
- Up/downscale 图片
- 运行 水平和垂直 Sobel 滤波器。将生成的图像组合成
grad_img
= max_per_pixel(sobel_horiz,sobel_vert).
- 对于每个 15x15 像素块,找到最亮点。这就是明星的
seed
- 从包含
seed
的 1x1 region
开始。继续向 region
添加相邻像素(推荐广度优先遍历)。通过 grad_img
中像素值的总和计算能量,像素坐标为 region
的 边界。如果能量高于前一次迭代的能量,则将新像素添加到 region
。如果不是,则拒绝该像素。
- 找到闭合轮廓或像素集合的重心不是一项艰巨的任务。要么通过它的数学定义(所有区域内像素的 x 和 y 坐标的总和,除以面积),要么通过使用图像力矩(cv::moments example)来完成。
我的解决方案与他们的解决方案有点不同。他们实际上 运行 一种填充所有亮度像素 [threshold;255] 的 floodfill 算法,计算能量函数,降低阈值,冲洗并重复,当它们最大化能量函数时停止。请注意,他们的算法效率非常低,因为与我的提议中的 1 个泛洪相比,他们为每个预先检测到的恒星有效地进行了多达 255 个泛洪,这在实践中可能是一个性能问题。
我目前正在根据本文描述的方法做一个项目: Camera calibration from a single night sky image
作为计算机视觉的初学者,我不太明白如何实现论文中使用的方法来找到图像中所有亮点(发光体)的中心,特别是4.1节中的段落:
The surrounding patch of size 15 × 15 pixels (Figure 1(a)), is upsampled by a given factor (Figure 1(c)) and the corresponding gradient map is calculated (Figure 1(d)). Starting from the brightest region, the gray value threshold is decreased, until an energy function is maximized. The energy function is defined as the sum of the border gradients and normalized by the border length (Figure 1(e)). This leads to a segmented star image shown in Figure 1(f). The segmentation ensures that the weighted centre of gravity algorithm [11] gives a robust estimation.
根据我的理解,我认为我可以对上采样图像执行拉普拉斯/索贝尔梯度函数,但之后我不太确定如何执行能量函数部分并生成分割图像。此外,我还想了解如何使用 openCV 或其他 python 库实现加权重心算法以找到亮点的中心。
如果你们中的任何人能提供一些线索,我们将不胜感激。
感谢和问候。
要带走的主要内容是在此上下文中使用的 energy function
是用于最大化问题的 any 函数。这里,能量函数是 gradients/derivatives/differences 的总和(即本例中的 "detected borders likelihood")。
由于你似乎没有算法背景,我建议你继续阅读 breadth-first search (remember an image is a very specific type of graph, where every edge is a pixel, connected to adjacent ones), recursion, and floodfill。
- Up/downscale 图片
- 运行 水平和垂直 Sobel 滤波器。将生成的图像组合成
grad_img
= max_per_pixel(sobel_horiz,sobel_vert). - 对于每个 15x15 像素块,找到最亮点。这就是明星的
seed
- 从包含
seed
的 1x1region
开始。继续向region
添加相邻像素(推荐广度优先遍历)。通过grad_img
中像素值的总和计算能量,像素坐标为region
的 边界。如果能量高于前一次迭代的能量,则将新像素添加到region
。如果不是,则拒绝该像素。 - 找到闭合轮廓或像素集合的重心不是一项艰巨的任务。要么通过它的数学定义(所有区域内像素的 x 和 y 坐标的总和,除以面积),要么通过使用图像力矩(cv::moments example)来完成。
我的解决方案与他们的解决方案有点不同。他们实际上 运行 一种填充所有亮度像素 [threshold;255] 的 floodfill 算法,计算能量函数,降低阈值,冲洗并重复,当它们最大化能量函数时停止。请注意,他们的算法效率非常低,因为与我的提议中的 1 个泛洪相比,他们为每个预先检测到的恒星有效地进行了多达 255 个泛洪,这在实践中可能是一个性能问题。