2010-11-04 54 views
3

如何比較兩幅圖像並確定它們是否100%相似,或只是改變了顏色或裁剪?如何比較兩張圖像來檢測重複項和裁剪重複項?

+0

您是否在談論人工染色的確切副本?或者你的意思是同一件事的兩張不同的照片。這可能會在方法上產生重大影響。 – Pace 2010-11-04 12:16:46

+0

我只是在尋找數字修改過的拷貝,包括彩色拷貝。沒有校驗和的方法可能會在這裏工作... – LamonteCristo 2010-11-04 19:49:44

回答

2

以下是一個相當簡單的方法來解決這個問題,並且對於從不同角度拍攝的同一主題的兩張不同照片將無法很好地工作,但是如果您有兩張您想要的相同圖像的副本校驗。

兩個相同圖像的情況很簡單 - 只是通過像素陣列循環通過RGB值從另一個減去。如果差異小於一個小公差,那麼像素是相同的。因此,只要您發現像素差異大於容差,就會知道圖像不同。

您可以允許一定數量或百分比的差異以允許壓縮文物引起的差異。

要檢查顏色的變化,您可以查看HLS(色調,亮度和飽和度)值。如果像素具有相同的L值,但具有不同的H值,那麼它就是不同的顏色(我認爲)。

裁剪更困難,因爲您必須嘗試在較大的圖像中找到較小圖像的位置。

+0

這是非常有趣和有益的。我必須確定如何針對每種圖像格式進行處理。 – LamonteCristo 2010-11-04 19:53:27

3

好,抽象地說,你需要定義一個相似度函數,它比較兩張圖片。爲了確定如果圖像是「100%相似」(等於),可以執行以下操作:

  • 比較圖像的尺寸
  • 如果圖像尺寸是相同的簡單地從彼此
  • 減去像素
  • if (sum(abs(pixel_1_i - pixel_2_j))/num_pixels < threshold) return true

對於圖像是不同顏色的情況下,或裁剪

  • 申請一封DGE檢測器,用於兩個圖像
  • 計算的互相關(在頻域中,FFT)
  • 找到最高峯
  • 發生在所確定的位置的(較小的)邊緣映射
  • 計算絕對誤差
  • if (error < threshold) return true

BTW:這種做法不會,如果你的圖像縮放或旋轉工作。

進一步研究:

  • cross-correlation:FFT(快速傅立葉變換,link1link2FFT in C#),零填充(所需FFT如果輸入信號具有不同的尺寸)
  • 邊緣檢測: Sobel,Canny(這些是非常常見的圖像處理濾波器,它們應該可在C#庫中得到,就像FFT一樣)
+0

這應該是在像素的循環內,或者可以在沒有循環遍歷所有像素的情況下工作「if(sum(abs(pixel_1_i - pixel_2_j))/ num_pixels Josh 2012-10-06 21:22:34

+0

您所引用的這一行應該是絕對差異的總和,因此對所有像素執行此操作是有意義的。如果您必須將其與其他圖像進行比較,則可以模糊圖像並將其縮小。 – bjoernz 2012-10-07 18:08:58

+0

你能幫我用C#代碼嗎? – Josh 2012-10-10 11:59:42