2013-08-28 46 views
3

我正在尋找一種算法或庫,可以發現兩個圖像之間的差異(如在「查找錯誤」遊戲中)並輸出包含這些更改的邊界框的協調。我可以使用Python,C或幾乎任何其他語言的算法。是否有算法來檢測兩個圖像之間的差異?

+0

取決於差異。最簡單的方法是從另一個圖像中減去一個圖像,並找到所有非零像素。 –

回答

2

有很多,適合不同的目的。您可以通過查看OpenCV開始,該免費計算機視覺庫具有C,C++中的API,並且還綁定到Python和許多其他語言。它可以輕鬆進行減法,並且還具有邊界或分組點集的功能。

除了簡單的圖像相減,OpenCV解決的具體用途之一是motion detection or object tracking

您可以在Signal Processing stackexchange站點中詢問更具體的與圖像相關的算法相關問題。

1

通過裁剪原始圖像將兩幅圖像「解析」爲多幅較小的圖像。 每個「子圖像」的大小將是您掃描操作的「分辨率」。例如,如果原始圖像爲100像素×100像素,則可以將分辨率設置爲10 x 10,並且每個原始圖像都有一百個10 x 10的子圖像。將子圖像保存到磁盤。

接下來,比較每一對子圖像文件,每個原始圖像一個。如果存在文件大小或數據差異,則可以將該「座標」標記爲在原始圖像上具有差異。

該算法假定您不在尋找各個像素差異的座標。

3

如果你只是想顯示差異,那麼你可以使用下面的代碼。

FastBitmap original = new FastBitmap(bitmap); 
FastBitmap overlay = new FastBitmap(processedBitmap); 

//Subtract the original with overlay and just see the differences. 
Subtract sub = new Subtract(overlay); 
sub.applyInPlace(original); 

// Show the results 
JOptionPane.showMessageDialog(null, original.toIcon()); 

要比較兩張圖片,可以使用Catalano Framework中的ObjectiveFideliy類。 Catalano Framework在Java中,所以你可以在另一個LGPL項目中移植這個類。

FastBitmap original = new FastBitmap(bitmap); 
FastBitmap reconstructed = new FastBitmap(processedBitmap); 

ObjectiveFidelity of = new ObjectiveFidelity(original, reconstructed); 

int error = of.getTotalError(); 
double errorRMS = of.getErrorRMS(); 
double snr = of.getSignalToNoiseRatioRMS(); 

//Show the results 

聲明:我是這個框架的作者,但我認爲這會有所幫助。

+0

經過測試,將Android上的圖像與此進行比較,效果很好,但看起來像ObjectiveFidelity的方法名稱已更改,您是否可以更新答案以反映此更改? – TouchBoarder

0

Imagemagick的比較(命令行)功能基本上可以做到這一點,因爲您可以閱讀關於/查看here的示例。但是,一個約束是,兩個圖像必須具有相同的大小,並且沒有被翻譯/旋轉/縮放。如果它們的大小/方向/比例不一樣,則需要首先處理。 OpenCV包含一些算法。你可以找到一個很好的OpenCV函數教程,你可以使用它來糾正圖像here

相關問題