好的我正在编写一个小型Java应用程序,它接受两个图像作为输入,比较它们,然后给出一个定量输出作为相似性的度量(例如50%相似)。
据我所知,FFT是测量两幅图像相似度的好方法。但我不能为上帝的爱弄清楚如何编码/实现它。
到目前为止,我已经实现了另一个功能,它基本上给了我两个直方图(每个图像一个)。我现在需要的只是编写一种方法来对图像进行FFT处理并给出可量化的结果。
任何人都可以帮我解决这个问题吗?我真的很想看到一些示例代码,如果不是至少在正确的方向上的一点。非常感谢提前。
答案 0 :(得分:2)
相似性不是一个确切的术语。例如:如果你有圆圈,那么它们的椭圆是相似的吗?它们都是圆形物体,所以从这个意义上说它们是 - 但如果我们想要过滤掉圆圈,那么它们就不是。您必须定义一个度量(或度量 - 例如圆度,强度分布,大小,方向,对象数,欧拉数等),而不是为每个图像计算它。两个图像的相似性将是两个计算值之间的(某种)距离。这可能是欧氏距离(对于两个实际测量),或某种误差函数(强度分布的RMS)。
你必须选择你的测量保持不变的变换(旋转的图像是否与原始图像类似?如果是,简单的傅里叶变换是不合适的。)
测量图像的相似性很难,如果你必须这样做,我会读到image stitching。如果你只是需要区分BLOB-s,首先尝试计算一些简单的测量(我建议计算矩 - 面积,方向;读K-means clusteing),或者1D傅里叶变换的轮廓距中心的距离质量(这有点困难)。
答案 1 :(得分:1)
在尝试编写2DFT代码之前,您应该完全理解它背后的数学运算。 flolo是正确的,您可以通过首先对行和列进行一维FFT然后组合结果来计算它,但我没有理由相信L_inf规范是将它们转换为度量的最佳方法,因为它完全跳过通常的组合步骤来创建完整的2DFT。请查看页面底部的http://fourier.eng.hmc.edu/e101/lectures/Image_Processing/node6.html。
也就是说,可能有更好的方法来比较不需要比较2D信息阵列的图像。例如,PCA(主成分分析,这只是在你的图像上运行SVD {奇异值分解}之后的问题,尽管我先看一下维基百科上的文章)会给你一个1D向量,你可以然后应用一些L_p规范直接进行比较,虽然在这种情况下,我会使用像sum(min(a_i / b_i,b_i / a_i))/ length(a),其中a和b是你从变换得到的1D向量。
答案 2 :(得分:0)
在一维数组中,有很多很好的网站都有fft代码。您只需在图像上逐行应用此fft。之后你会对结果进行逐列fft。
现在你需要一个度量来从得到的变换图像中得到,我的建议是尝试max-norm(L_inf)。那就是max_ {x,y} {fft2d(imag1)[x,y] - fft2d(imag2)[x,y]}。
答案 3 :(得分:0)
如果您只是想检查一张图像是否可能是另一张图像是快速编辑另一张图像,例如股票摄影的DRM,那么请检查可能区域内标准化调色板的百分比。如果他们在THRESHOLD中匹配图像中的多个TEST_REGIONS中的任何一个中的NUMBER_OF_TEST_COLORS,那么您有一个“可疑”......您仍然需要人来检查嫌疑人。但这是一种快速而肮脏的方法,可以找到许多图像重新定尺寸,水平/垂直鳍状肢,背景颜色变换器,文件格式转换器和其他细微变化...当然“将颜色标准化”到量化调色板对自己来说是一门艺术。我建议将图像量化为最接近的“网页安全”颜色以实现实用性。
与数学家相比,我是一个蓝领垃圾人,但垃圾男人很实用!在将相似图像分组和按颜色应用搜索时,我已经取得了很好的成功。