【问题标题】:Quantifying sharp edges in an images with Python使用 Python 量化图像中的锐边
【发布时间】:2015-02-27 00:52:57
【问题描述】:

为了区分图纸和照片,我想量化图像中的所有锐边。这种边缘是我们正在处理的图纸的典型特征,而它们在我们的照片中很少出现。

我听说锐利的边缘会在图像的 2D FT 频谱中产生高频。我可以用这段代码产生这样的光谱:

from PIL import Image
img = Image.open('test.jpg')

import numpy as np
img = img.convert('L')
img_as_np = np.asarray(img)
freq = np.fft.fft2(img_as_np)

我们打算使用示例图像来找到区分高频和低频的“正确”阈值。但是,上面的代码产生了一个矩阵(带有复数),我不知道如何从那里得到实际频率。任何数学天才可以帮助我,请:-)?

更新:我刚刚发现了以下函数:

np.abs(freq)

这似乎将复数转换为正浮点数。这些是我正在寻找的频率吗?这是一种在图像中寻找锐利边缘的工作方法吗?

更新 2:是的,np.abs() 完成了这项工作。这个问题可以被认为是答案。但我将其保持打开状态,以防有人知道区分图纸和照片的更可靠方法。

【问题讨论】:

  • 高频也来自具有大量细节或噪点的照片。我希望您的训练图像具有代表性。
  • 感谢您的警告!我将它与颜色分布分析结合使用。因此,它只是最终有助于检测正确图像类型的几个因素之一。

标签: python image-processing numpy fft edge-detection


【解决方案1】:

如果您发现 2D FFT 方法不令人满意,您可以考虑使用 opencv 解决此问题,因为该工具包已高度开发并提供了许多适合您描述的问题的工具。

一个潜在的策略:从有问题的图像构造一个image pyramid。然后,对生成的图像集执行edge detection 操作。棱角分明的边缘应该出现在金字塔的所有(或大部分)尺度上。

鉴于您描述的场景,与照片金字塔相比,我希望这些图纸在更大的尺度上表现出更多的高频能量(即边缘)。如果需要,Contours 可用于可视化各种比例的边缘。

或者,您可以考虑使用wavelet 解决方案。特别是,可以使用 Haar 小波来突出显示两种图像之间的能量差异。具有强高频分量的图像将表现出更高的差分系数值。因此,可以合理地预期您的绘图将在差分系数中捕获更多信号。您的鉴别过程可能只是比较差分系数的大小。这种思路引出了一个简单的图像分类方案:

  1. 收集两组图像:一组图纸和一组照片。
  2. 对每个图像执行 1 级或 2 级离散小波分解。
  3. 对于每个图像,丢弃水平和垂直平均值,留下差分分量。将差分分量的绝对值求和以构成该图像的描述符。
  4. 对每个群体的描述符进行分组,并执行一些基本统计。如果人口差异很大,您可以使用简单的距离度量来对未知图像进行分类:图像描述符更接近绘图描述符均值还是照片描述符均值?
  5. 如果人口没有那么整齐地区分,还有很多其他分类器可以使用,(linear discriminantsneural networks 等)

【讨论】:

  • 感谢您指出另一种方法。由于到目前为止 FFT 工作得相当好,我实际上并没有详细检查这一点。然而,我接受它作为答案,因为我认为它真的很有意义,opencv 无疑是一个很好的工具。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
  • 2013-12-17
  • 2019-03-13
  • 1970-01-01
  • 2011-11-09
相关资源
最近更新 更多