2008-08-25 103 views
77

我想比較一個應用程序(可能是一個網頁)的屏幕截圖與以前拍攝的截圖,以確定應用程序是否正確顯示其本身。我不希望進行完全匹配比較,因爲方面可能略有不同(對於Web應用程序,取決於瀏覽器,某些元素可能位於稍微不同的位置)。它應該給出屏幕截圖有多相似的度量。如何測量兩個圖像之間的相似度?

有沒有圖書館/工具已經這樣做?你將如何實現它?

+1

有這等類似的問題的一些很好的答案: http://stackoverflow.com/questions/75891/算法尋找類似圖像 – blak 2012-07-02 20:16:10

+1

和更多在這裏:http://stackoverflow.com/questions/189943/how-can-i-quantify-difference-between-two-images – Anoyz 2015-06-09 11:35:23

+0

根據近期更新答案的時間機器學習方面的進步,更具體地說是「深度學習」。 – jldupont 2016-07-21 14:19:19

回答

61

這完全取決於你想要算法的智能程度。

例如,這裏有一些問題:

  • 裁剪的圖像與一個未裁剪圖像
  • 圖像與文本添加與另一個不
  • 鏡像圖像

最簡單和最簡單的算法我已經看到了這只是做以下步驟,在每個圖像:

  1. 規模小東西,像64×64或32x32,無視寬高比,請使用組合縮放算法而不是最近像素
  2. 縮放顏色範圍,以使最暗的顏色變爲黑色,最亮的是白色
  3. 旋轉並且使得lighest顏色是左上,然後右上接下來更暗,左下是下一較粗翻轉圖像(儘可能當然)

編輯組合縮放算法是一種在將10個像素縮小到1個像素時將使用將所有這10個像素的顏色合併爲一個的函數來執行此操作的算法。可以用像平均值,平均值或更復雜的算法(如雙三次樣條)來完成。

然後計算兩個圖像之間的像素之間的平均距離。

要在數據庫中查找可能的匹配項,請將像素顏色作爲單個列存儲在數據庫中,爲其中一堆(但不是全部,除非使用非常小的圖像)編制索引並執行查詢每個像素值的範圍,即。每幅圖像中小圖像中的像素在要查找的圖像的-5和+5之間。

這很容易實現,運行速度相當快,但當然不會處理最高級的差異。爲此你需要更先進的算法。

2

那麼,不要直接回答你的問題,但我已經看到了這種情況。微軟最近推出了一款名爲PhotoSynth的工具,它可以做很多類似的工作,以確定大量圖片中的重疊區域(可能具有不同的縱橫比)。

我想知道他們的博客是否有任何可用的庫或代碼片段。

+0

這項技術。已經停產。 – 2017-04-11 20:17:16

8

你需要pattern recognition。爲了確定兩幅圖像之間的小差異,Hopfield nets工作得很好,而且很容易實現。不過,我不知道任何可用的實現。

4

我想知道如果可以通過從另一個圖像中減去一個圖像來獲得某些東西,然後將得到的圖像壓縮爲jpeg gif,文件大小作爲相似度的度量。

如果你有兩個相同的圖片,你會得到一個白框,這將壓縮真的很好。圖像越不同,代表的圖像越複雜,因此可壓縮性越差。

可能不是一個理想的測試,而且可能比需要的慢得多,但它可能工作作爲一個快速和骯髒的實現。

3

你可能看的開源工具findimagedupes的代碼,但它似乎在Perl被寫,所以我不能說這將是多麼容易解析...

讀findimagedupes我喜歡的頁面,我看到有一個C++ implementation of the same algorithm。據推測這將更容易理解。

,看來你也可以使用gqview

+0

PixiePlus鏈接帶我到一個網站讓我知道:「Superdrol是高效類固醇」:D – 2017-05-06 00:51:43

2

對Vaibhav的注擴大,hugin是一個開源的「autostitcher」,這應該對這個問題的一些見解。

0

那麼一個真正的基礎級別的使用方法可以檢查每個像素的顏色並將其與第二個圖像上相應的像素顏色進行比較 - 但這可能是一個非常緩慢的解決方案。

27

測量這種方法的「經典」方法是將圖像分解成一些規範數量的節(比如10x10網格),然後計算每個單元格內RGB值的直方圖並比較相應的直方圖。這種類型的算法因其簡單性和對縮放和(小!)平移的不變性而被優選。

20

使用歸一化的顏色直方圖。 (閱讀應用here的章節),它們通常用於圖像檢索/匹配系統,是匹配圖像的標準方式,非常可靠,相對快速並且非常容易實現。

本質上,顏色直方圖將捕獲圖像的顏色分佈。然後可以將其與另一個圖像進行比較以查看顏色分佈是否匹配。

這種類型的匹配的相當resiliant縮放(一旦直方圖是歸一化),和旋轉/移位/移動等

避免像素的逐像素比較彷彿圖像旋轉/略微錯開它可能會導致一個很大的差異被報道。

直方圖可以直接生成自己(假設你可以訪問像素值),但如果你不喜歡它,OpenCV庫是做這類東西的好資源。 Here是一個powerpoint演示文稿,向您展示如何使用OpenCV創建直方圖。

11

不要像MPEG這樣的視頻編碼算法計算視頻的每個幀之間的差異,以便他們可以對delta編碼進行編碼?您可以研究視頻編碼算法如何計算這些幀差異。

看看這個開源圖像搜索應用程序http://www.semanticmetadata.net/lire/。它描述了幾個圖像相似度算法,其中三個來自MPEG-7標準:ScalableColor,ColorLayout,EdgeHistogram和Auto Color Correlogram。

0

如果這是您偶爾會做的事情,並且不需要自動化,您可以在支持圖層的圖像編輯器(例如Photoshop或Paint Shop Pro)(可能是GIMP或Paint.Net)中執行此操作,但我不確定這些)。打開兩個屏幕截圖,並將其中一個作爲一個圖層。將圖層混合模式更改爲差異,兩者之間的所有內容都將變爲黑色。您可以移動頂層以最小化任何對齊差異。

12

您可以使用純粹的數學方法O(n^2),但只有在確定沒有偏移或類似情況時纔有用。 (儘管如果你有幾個具有均勻着色的物體,它仍然可以很好地工作。)

無論如何,這個想法是計算兩個矩陣的歸一化點積。 C = sum(Pij*Qij)^2/(sum(Pij^2)*sum(Qij^2))

該公式實際上是矩陣(奇怪)之間角度的「餘弦」。 相似度越大(可以說Pij=Qij),C將爲1,如果它們完全不同,則假定每i,j Qij = 1(避免零分),Pij = 255,則對於大小nxn,則更大的n將是更接近零,我們會得到。 (粗略計算:C=1/n^2)。

5

紅寶石解決方案可以found here

自述:

Phashion圍繞pHash庫一個Ruby包裝,「知覺哈希」,檢測重複和近似重複的多媒體文件

2

有用於基於內容的圖像檢索的軟件,它可以(部分)滿足您的需求。所有參考文獻和解釋都鏈接到項目網站,並且還有一個簡短的教科書(Kindle):LIRE

3

如何測量兩個圖像之間的相似性完全取決於您想要測量的內容,例如:對比度,亮度,形式,噪音......然後選擇最適合您的相似度量度。你可以選擇MAD(平均絕對差值),MSD(均方差),這對於測量亮度是有好處的......這裏還有可用值CR(相關係數)可以很好地表示兩幅圖像之間的相關性。您還可以從基於直方圖的相似性度量SDH(差異圖像直方圖的標準差)或多模態相似性度量如MI(互信息)或NMI(標準化互信息)中選擇。

由於這種相似性措施的成本很高,建議在對這些措施應用這些措施之前對圖像進行縮放。

0

您可以使用Siamese Network查看這兩個圖像是否相似或不相似,請看tutorial。本教程對相似圖像進行聚類,而您可以使用L2距離來測量兩幅圖像的相似度。

相關問題