我想比較一個應用程序(可能是一個網頁)的屏幕截圖與以前拍攝的截圖,以確定應用程序是否正確顯示其本身。我不希望進行完全匹配比較,因爲方面可能略有不同(對於Web應用程序,取決於瀏覽器,某些元素可能位於稍微不同的位置)。它應該給出屏幕截圖有多相似的度量。如何測量兩個圖像之間的相似度?
有沒有圖書館/工具已經這樣做?你將如何實現它?
我想比較一個應用程序(可能是一個網頁)的屏幕截圖與以前拍攝的截圖,以確定應用程序是否正確顯示其本身。我不希望進行完全匹配比較,因爲方面可能略有不同(對於Web應用程序,取決於瀏覽器,某些元素可能位於稍微不同的位置)。它應該給出屏幕截圖有多相似的度量。如何測量兩個圖像之間的相似度?
有沒有圖書館/工具已經這樣做?你將如何實現它?
這完全取決於你想要算法的智能程度。
例如,這裏有一些問題:
最簡單和最簡單的算法我已經看到了這只是做以下步驟,在每個圖像:
編輯甲組合縮放算法是一種在將10個像素縮小到1個像素時將使用將所有這10個像素的顏色合併爲一個的函數來執行此操作的算法。可以用像平均值,平均值或更復雜的算法(如雙三次樣條)來完成。
然後計算兩個圖像之間的像素之間的平均距離。
要在數據庫中查找可能的匹配項,請將像素顏色作爲單個列存儲在數據庫中,爲其中一堆(但不是全部,除非使用非常小的圖像)編制索引並執行查詢每個像素值的範圍,即。每幅圖像中小圖像中的像素在要查找的圖像的-5和+5之間。
這很容易實現,運行速度相當快,但當然不會處理最高級的差異。爲此你需要更先進的算法。
那麼,不要直接回答你的問題,但我已經看到了這種情況。微軟最近推出了一款名爲PhotoSynth的工具,它可以做很多類似的工作,以確定大量圖片中的重疊區域(可能具有不同的縱橫比)。
我想知道他們的博客是否有任何可用的庫或代碼片段。
這項技術。已經停產。 – 2017-04-11 20:17:16
你需要pattern recognition。爲了確定兩幅圖像之間的小差異,Hopfield nets工作得很好,而且很容易實現。不過,我不知道任何可用的實現。
我想知道如果可以通過從另一個圖像中減去一個圖像來獲得某些東西,然後將得到的圖像壓縮爲jpeg gif,文件大小作爲相似度的度量。
如果你有兩個相同的圖片,你會得到一個白框,這將壓縮真的很好。圖像越不同,代表的圖像越複雜,因此可壓縮性越差。
可能不是一個理想的測試,而且可能比需要的慢得多,但它可能工作作爲一個快速和骯髒的實現。
你可能看的開源工具findimagedupes的代碼,但它似乎在Perl被寫,所以我不能說這將是多麼容易解析...
讀findimagedupes我喜歡的頁面,我看到有一個C++ implementation of the same algorithm。據推測這將更容易理解。
,看來你也可以使用gqview。
PixiePlus鏈接帶我到一個網站讓我知道:「Superdrol是高效類固醇」:D – 2017-05-06 00:51:43
對Vaibhav的注擴大,hugin是一個開源的「autostitcher」,這應該對這個問題的一些見解。
那麼一個真正的基礎級別的使用方法可以檢查每個像素的顏色並將其與第二個圖像上相應的像素顏色進行比較 - 但這可能是一個非常緩慢的解決方案。
測量這種方法的「經典」方法是將圖像分解成一些規範數量的節(比如10x10網格),然後計算每個單元格內RGB值的直方圖並比較相應的直方圖。這種類型的算法因其簡單性和對縮放和(小!)平移的不變性而被優選。
不要像MPEG這樣的視頻編碼算法計算視頻的每個幀之間的差異,以便他們可以對delta編碼進行編碼?您可以研究視頻編碼算法如何計算這些幀差異。
看看這個開源圖像搜索應用程序http://www.semanticmetadata.net/lire/。它描述了幾個圖像相似度算法,其中三個來自MPEG-7標準:ScalableColor,ColorLayout,EdgeHistogram和Auto Color Correlogram。
如果這是您偶爾會做的事情,並且不需要自動化,您可以在支持圖層的圖像編輯器(例如Photoshop或Paint Shop Pro)(可能是GIMP或Paint.Net)中執行此操作,但我不確定這些)。打開兩個屏幕截圖,並將其中一個作爲一個圖層。將圖層混合模式更改爲差異,兩者之間的所有內容都將變爲黑色。您可以移動頂層以最小化任何對齊差異。
您可以使用純粹的數學方法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
)。
有用於基於內容的圖像檢索的軟件,它可以(部分)滿足您的需求。所有參考文獻和解釋都鏈接到項目網站,並且還有一個簡短的教科書(Kindle):LIRE
如何測量兩個圖像之間的相似性完全取決於您想要測量的內容,例如:對比度,亮度,形式,噪音......然後選擇最適合您的相似度量度。你可以選擇MAD(平均絕對差值),MSD(均方差),這對於測量亮度是有好處的......這裏還有可用值CR(相關係數)可以很好地表示兩幅圖像之間的相關性。您還可以從基於直方圖的相似性度量SDH(差異圖像直方圖的標準差)或多模態相似性度量如MI(互信息)或NMI(標準化互信息)中選擇。
由於這種相似性措施的成本很高,建議在對這些措施應用這些措施之前對圖像進行縮放。
您可以使用Siamese Network查看這兩個圖像是否相似或不相似,請看tutorial。本教程對相似圖像進行聚類,而您可以使用L2
距離來測量兩幅圖像的相似度。
Beyond Compare具有逐像素比較的圖像,例如,
有這等類似的問題的一些很好的答案: http://stackoverflow.com/questions/75891/算法尋找類似圖像 – blak 2012-07-02 20:16:10
和更多在這裏:http://stackoverflow.com/questions/189943/how-can-i-quantify-difference-between-two-images – Anoyz 2015-06-09 11:35:23
根據近期更新答案的時間機器學習方面的進步,更具體地說是「深度學習」。 – jldupont 2016-07-21 14:19:19