为了区分图纸和照片,我想量化图像中的所有锐边。这些边缘是我们正在处理的图纸的典型特征,而它们很少出现在我们的照片中。
我听说锋利的边缘导致图像的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()完成了这项工作。这个问题可以考虑回答。但我保持开放,以防有人知道更加可靠的区分图纸和照片的方式。
答案 0 :(得分:1)
如果您发现2D FFT方法不能令人满意,您可以考虑使用opencv来解决此问题,因为该工具包是高度开发的,并提供了许多适合您所描述问题的工具。
一种可能的策略:从相关图像构建image pyramid。然后,对生成的图像集执行edge detection操作。强金属边缘应出现在金字塔中的所有(或大多数)刻度上。
鉴于您描述的情景,我认为与照片金字塔相比,图纸在更大的尺度上表现出更多的高频能量(即边缘)。如果需要,可以使用Contours来显示各种比例的边缘。
或者,您可以考虑使用wavelet解决方案。特别是,Haar小波可用于突出两种图像之间的能量差异。具有强高频分量的图像将在差分系数中表现出更高的值。因此,期望您的绘图将在差分系数中捕获更多信号是合理的。您的区分过程可能只是比较差分系数的大小。这种思路导致了一种简单的图像分类方案: