gpt4 book ai didi

c++ - 边缘检测/角度

转载 作者:行者123 更新时间:2023-11-30 02:52:33 26 4
gpt4 key购买 nike

我可以成功对图像进行阈值处理并找到图像的边缘。我正在努力尝试的是准确地提取黑色边缘的 Angular 。

我目前正在使用黑色边缘的极端点,并使用atan2函数计算 Angular ,但是由于混叠,根据您选择的点, Angular 可能会有一定程度的变化。是否有可靠的可编程方法来选择要计算 Angular 点?

示例图片:

例如,Gimp Measure工具 Angular 为3.12°,

最佳答案

如果您正在编写自己的库,那么为该问题创建一个健壮的解决方案将使您能够开发几个独立的代码块,也可以将它们拼在一起以解决其他问题。我假设您想在任意旋转,变化的光照条件下,存在图像噪声,非线性枕形/桶形失真等情况下找到棋盘格的角。

尽管有简单的基于内核的技术可以将整个像素查找为边缘像素,但是在处理填充的多边形时,您将希望使用能够找到具有亚像素精度的边缘的算法,以便执行精确的线拟合。即使从暗色正方形到白色正方形的渐变跨越了几个像素,在某些子像素点仍会找到“真”边缘,而很有可能不会通过手动单击找到该点。

我尝试在此较早的SO帖子中提供边缘发现的简单摘要:
what is the relationship between image edges and gradient?

对于像您这样的问题,一个可靠的解决方案是沿着子像素精度在暗光过渡中找到边缘点,然后将线拟合到边缘点并使用线角。如果您要处理真实的相机图像,并且图像中存在未经校正的径向变形,则可能存在一些测量精度方面的潜在问题,但我们将忽略这些问题。

如果要找到边缘的精确拟合,那么最好在垂直于该边缘的方向上扫描子像素边缘。前提是我们首先要对边缘方向进行一些合理的估计。我们可以首先找到边缘方向的粗略估计,然后执行精确的线拟合。

以下算法似乎有太多步骤,但我的目的是指出如何提供可靠的解决方案。

  • 对黑色像素执行一些腐 eclipse 迭代,以将黑盒彼此分开。
  • 运行连接的组件算法(blob-finding算法)以找到侵 eclipse 的黑色正方形。
  • 标识每个受腐 eclipse 正方形的中心(x,y)点以及定义长轴和短轴的(x,y)端点。
  • 维护结构中每个正方形的数据,该结构具有以像素为单位的总面积,长轴和短轴的中心(x,y)点,(x,y)点等。
  • 根据需要,消除所有太小的组件( Blob )。例如,您将要排除所有“盐和胡椒粉”噪声 Blob 。您可能还会暂时忽略被图像边缘切掉的棋盘格,我们稍后可以返回。

  • 然后,您将遍历 Blob 列表,并对每个 Blob 进行以下操作:
  • 确定大致垂直于棋盘方格边缘的方向。如何完成此操作部分取决于您在运行连接的组件算法时所计算的数据。在通用图像处理库中,标准的连接组件算法将为每个单独的 Blob 确定数十个属性和测量值:面积,圆度,主轴方向,短轴方向,长轴和短轴的端点等。矩形图形,计算最上面,最左边,最右边和最下面的点就足够了,因为它们将定义四个角。
  • 沿大致垂直于边缘的方向生成边缘扫描。这些必须在原始的,未经修改的图像上执行。这通常假设您已实现双线性插值,以找到子像素(x,y)点的灰度值,例如(100.35,25.72),因为您的扫描线不会完全落在整个像素上。
  • 使用子像素边缘点查找技术。通常,您将在扫描方向上对边缘点进行曲线拟合,然后以最大梯度找到实值(x,y)点。那是边缘点。
  • 将所有子像素边缘点存储在列表/数组/集合中。
  • 生成适合边缘点的线。这些可以使用Hough,RANSAC,最小二乘法或其他技术。
  • 从四个线拟合的每个线方程中,计算线 Angular 。

  • 该算法为每个黑色棋盘格独立地找到 Angular 。对于这个应用程序来说,这可能是过高的选择,但是如果您正在开发一个库,则可能会为您提供有关实现哪些子算法以及如何构造它们的一些想法。例如,该算法将依赖于以下技术的实现:
  • 图像形态(例如,腐 eclipse ,膨胀,关闭,打开等)
  • 实现形态
  • 的内核操作
  • 阈值化以对图像进行二值化-Otsu方法值得检查
  • 连接组件算法(又名blob查找或OpenCV轮廓函数)
  • Blob的数据结构
  • Blob数据的矩计算
  • 双线性插值以查找子像素(x,y)值
  • 一种线性射线扫描技术,用于沿特定方向(也将依赖于双线性插值)查找(x,y)灰度值
  • 曲线拟合技术和方法,用于确定最陡切线以找到边缘点。
  • 稳健的线拟合技术:霍夫(Hough),RANSAC和/或最小二乘
  • 线方程的数据结构,相关函数

  • 这就是说,如果您愿意为精度略有损失而感到满意,并且您知道图像没有受到径向畸变等的影响,并且只需要查找由定义的平行线的 Angular 所有棋盘格边缘,那么您可以尝试..
  • 简单的基于核的边缘点发现技术(高斯平滑图像上的拉普拉斯算子)
  • 霍夫线适合边缘点
  • 选择投票数最多的两条线,应该是一组水平的线,另一组垂直的线

  • 还有其他一些技术不太准确,但更易于实现:
  • 使用基于内核的角落查找运算符
  • 查找角点之间的 Angular 。

  • 等等等等。在开发库并创建独立功能的强大实现时,可以将它们串在一起以创建特定于应用程序的解决方案,您可能会发现,健壮的解决方案依赖于比您想象的更多的步骤,但是它还会更清楚每个增量步骤的故障模式,以及如何解决该故障模式。

    关于c++ - 边缘检测/角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18787155/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com