FFT图像测量相似

问题描述:

好吧,我正在写一个小型的Java应用程序,接受两个图像作为输入,比较它们,然后给出一个量化输出作为相似性度量(例如50%相似)。FFT图像测量相似

我的理解FFT是测量两幅图像相似度的好方法。但是我不能因为上帝的爱而弄清楚如何编码/实现它。

到目前为止,我已经实现了另一个函数,它基本上给了我两个直方图(每个图像一个)。我现在需要的只是编写一种方法,将FFT图像并给我一个可量化的结果。

任何人都可以帮我解决这个问题吗?我真的很想看到一些示例代码,如果不是正确的方向,至少有一点。非常感谢提前。

有许多很好的网站,其代码为一维数组的值。您只需在图像上逐行应用此fft。之后,您会对结果进行分栏。

现在你需要一个度量来从转换后的图像中得到,我的建议是尝试max-norm(L_inf)。那就是max_ {x,y} {fft2d(imag1)[x,y] - fft2d(imag2)[x,y]}。

+0

谢谢我会研究一下。有人告诉我查看JavaCV。你知道这可能会有帮助吗? – Flynn 2011-04-04 15:24:39

在你尝试编码2DFT之前,你应该完全理解它背后的数学。 flolo是正确的,你可以通过首先对行和列进行一维FFT然后合并结果来计算它,但我没有理由相信L_inf范数是将它们转换为度量的最佳方式,因为它完全跳过通常的组合步骤来创建完整的2DFT。看看页面底部的http://fourier.eng.hmc.edu/e101/lectures/Image_Processing/node6.html

也就是说,可能有更好的方法来比较不需要比较2D信息数组的图像。例如,PCA(主成分分析,它只是在对图像进行平均中心处理后对你的图像进行SVD​​ {奇异值分解},尽管我会首先看一下它的*文章)会给你一个一维向量,然后你可以直接应用一些L_p规范来进行比较,尽管在这种情况下,我会使用类似sum(min(a_i/b_i,b_i/a_i))/ length(a)的东西,其中a和b是从变换中获得的1D向量。

相似性不是一个确切的术语。例如:如果你有圆和椭圆是否相似?它们都是圆形的物体,所以从这个意义上说,它们是 - 但是如果我们想过滤掉圆圈,它们就不是。您必须定义一个度量(或度量 - 例如圆度,强度分布,大小,方向,物体数量,欧拉数等),然后计算每个图像的尺寸。两幅图像的相似度将是两个计算值之间的(某种)距离。这可能是欧氏距离(用于两个实际测量)或某种误差函数(用于强度分布的RMS)。

你将不得不选择其将应您的措施留不变(类似于原来的旋转图像?如果是的话,简单的傅里叶变换是不恰当的)。如果你不得不这样做,我会阅读有关image stitching。如果您只需要区分BLOB-s,首先尝试计算一些简单的度量(我推荐计算矩 - 面积,方向;请参阅K-means clusteing),或轮廓距离质心中心的一维傅里叶变换(即更难一点)。

+0

如果你想使用直方图作为相似性度量,我认为RMSD可能是一个很好的度量相似度。但我认为直方图不是太强大的措施。 – WebMonster 2011-04-04 15:55:09

+0

我拥有的图像领域严格限制在同一个角度的汽车图像。只有不同的照明,就方向和比例而言,变化非常小。 我也知道,直方图是非常一般的,因为白色房间可以具有与雪景相同的直方图。这些只是我的程序的附加功能。 据我的理解,FFT提供了一个像样的图像相似度量,所以我想知道如何实现它并获得相似性度量,最好是以某种方式从FFT结果中导出的百分比形式 – Flynn 2011-04-04 17:21:26

如果你只是想检查,如果它是可能的一个形象是另一对类似股票摄影的DRM然后检查可能的区域内的标准化调色板的比例快速编辑。如果它们在THRESHOLD中匹配NUMBER_OF_TEST_COLORS中的任何一个TEST_REGIONS,那么你就有一个“嫌疑犯”......你仍然需要一个人来检查嫌疑犯。但是,这是一种快速和肮脏的方式来找到许多图像大小调整器,水平/垂直鳍状肢,背景颜色转换器,文件格式转换器,以及其他细微变化......当然,“将颜色标准化”为量化调色板本身就是一门艺术。为了实用性,我建议将图像量化为最接近的“网页安全”颜色。

与数学家相比,我是一个蓝领垃圾人,但是垃圾男人很实用!我通过这种方法将相似的图像分组和搜索彩色应用程序进行了很好的成功。