【问题标题】:Efficient 2D edge detection in PythonPython 中的高效 2D 边缘检测
【发布时间】:2011-10-28 09:35:37
【问题描述】:

我知道这个问题以前已经解决了,但是我很难找到任何描述用于处理此类数据的算法的文献。我基本上是在对一组 2D 数据进行一些边缘查找。我希望能够在眼图上找到几个点(通常用于验证高速通信系统),并且由于我没有图像处理方面的经验,我正在努力编写有效的方法。

正如您可能看到的,这些图表之所以如此命名,是因为它们类似于人眼。根据信号和被测系统的不同,它们的厚度、斜率和噪声会有很大差异。通常进行的测量是抖动(交叉区域的水平厚度)和眼高(在宽度的某个指定百分比或最大可能点处测量)。我知道这最好通过图像处理而不是更线性的方法来完成,因为到目前为止我的尝试需要几秒钟才能找到第一个交叉点的左侧。关于我应该如何在 Python 中解决这个问题的任何想法?我已经在使用 NumPy 进行一些处理了。

这里有一些example data,它被格式化为一个带有相关 x 轴数据的一维数组。对于这个特定的例子,它应该每 666 个点 (2 * int((1.0 / 2.5e9) / 1.2e-12)) 拆分一次,因为信号的速率是 2.5 GB/s,点之间的时间是1.2 ps。

谢谢!

【问题讨论】:

  • 您的数据粘贴不太好...
  • 假设您拥有用于生成图表的原始数据,那么直接使用该数据可能比分析渲染图表更成功。
  • 我拥有的数据量相当庞大,规模 > 300,000 点。用任何方法分析都需要很长时间,但我认为将其视为 2D 图像比将其视为一堆数字更容易
  • 既然 2D 图像只不过是一堆数字,我不会这么自信。
  • 将其转储到图像中只不过是一种巧妙的舍入方式(由图形分辨率定义一个单位)。

标签: python image-processing numpy scipy


【解决方案1】:

你试过OpenCV(开放计算机视觉)吗?它被广泛使用并具有 Python 绑定。

不要成为 PITA,但您确定使用数值方法不会更好吗?我见过的用于眼图分析的所有工具都采用数值方法;我还没有看到一个分析图像本身的。

您说您的算法在该数据集上非常缓慢——我的下一个问题是为什么。你在看一个过采样的数据集吗? (我猜你是。)如果是这样,你是否尝试过先抽取信号?这至少会为您的算法提供更少的样本。

【讨论】:

  • 我必须有尽可能准确的测量值。抖动需要在 1 ps 以内(实际上我目前正在插值以获得更精确的结果,而不仅仅是最近的离散点),并且由于这些实际上是模拟的眼图,因此我必须输入的数据量非常大得到准确的测量结果。
  • 我应该指出,如果您正在查看来自已进行 A/D 转换的模拟信号的一组样本,则在样本之间进行插值不会使您的测量更加准确。这就是我们首先对信号进行过采样的原因。此外,300,000 个数据点在 DSP 世界中并不算多。这相当于以 44.1 kHz 采样大约 7 秒的音频。
  • 对我来说不到一纳秒。虽然它在 DSP 世界中并不多,但它需要处理大量数据。我相信如果我能快速将这些数据转换成内存中的图像(这些是用matplotlib生成的,速度明显慢),那么处理起来应该相对容易。
  • 并编辑我的最后一条评论,我移动了一个小数位。对我来说大约是 360 纳秒。我通常使用 > 3 GHz 的信号。
【解决方案2】:

只是沿着你的路线走一会儿,如果你将这些图像读入内存,就像它们一样,做两个洪水填充(开始中心和左边缘中间)不是很容易,包括所有“白色“ 数据。如果填充例程记录了每列的最大和最小高度,以及最大水平范围,那么您就拥有了所需的一切。

换句话说,我认为你想多了。当边缘不清楚时,边缘检测用于复杂的“自然”场景。在这里你的边缘非常明显,你不需要增强它们。

【讨论】:

    猜你喜欢
    • 2021-03-01
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多