使用Python量化图像中的锐边

时间:2014-12-30 21:05:10

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

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

我听说锋利的边缘导致图像的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()完成了这项工作。这个问题可以考虑回答。但我保持开放,以防有人知道更加可靠的区分图纸和照片的方式。

1 个答案:

答案 0 :(得分:1)

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

一种可能的策略:从相关图像构建image pyramid。然后,对生成的图像集执行edge detection操作。强金属边缘应出现在金字塔中的所有(或大多数)刻度上。

鉴于您描述的情景,我认为与照片金字塔相比,图纸在更大的尺度上表现出更多的高频能量(即边缘)。如果需要,可以使用Contours来显示各种比例的边缘。

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

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