2010-03-31 186 views
8

任務:我們在我們裝配線的末端安裝了攝像頭,其中 捕獲生產物品的圖像。舉個例子說,我們 產生票(其上有一些文字和圖片)。所以每張 產生的票都被拍成照片並保存到磁盤上作爲圖像。現在我 想檢查這些保存的圖像的異常(即比較 他們的圖像(模板),這是OK)。因此,如果在我們的組裝線上出現問題 (包含缺失圖片,污點等),我的 應用程序應該找到它(因爲它的圖像與我的 模板相差太多)。比較圖像以找出差異

問:什麼是最簡單的方法來比較圖片,並找到他們之間的差異?我是否需要編寫自己的方法,或者我可以使用現有的方法嗎?如果我只是設置一個容差值 (即圖像可以不同於1%),將會很好,將兩個圖像放在一個函數中,並獲得返回值true或false :)

工具:C#或VB。 NET,Emgu.CV(OpenCV的.NET包裝)或類似的東西

回答

2

我支持d建議看看AForge Imaging library,因爲它對這類工作有很多真正有用的功能。

有幾種方法可以使用:

  1. 簡單的減法(模板圖像 - 電流),看看有多少像素是不同的。您可能想要對結果進行閾值設置,即只包含10或更多(例如)不同的像素。
  2. 如果票據可以在視野內移動,那麼物品1)將不起作用,除非您可以先查找票證。例如,如果票據在黑色背景上是白色的,那麼您可以在圖片上設置一個閾值,這會讓您知道票據的位置。
  3. 我之前使用過的另一種技術是「模型查找」或「模式匹配」,但我只知道包含這些函數的商業庫Matrox Imaging Library(或MIL),因爲它們不是微不足道的。

此外,您還需要確保知道票的哪些部分更重要。例如,我猜想一個缺失的標誌或水印是一個大問題。但是一些區域可能有可變的文本,比如序列號,所以你會期望它們有所不同。基本上你可能需要將圖像的某些區域與其他區域區別開來。

1

我不知道細節,但我知道在高吞吐量是必不可少的工業環境中,有時候使用神經網絡來完成。它們將數百萬位(相機像素)變成1(好或壞)。 也許這會幫助你進行搜索。

3

我對OpenCV並不瞭解,但對圖像處理有點不瞭解。

要走的路要看拍攝新照片的頻率。一個簡單的方法是計算一個你'好'的模板和你實際產品的圖像的差異圖片。

如果圖像是100%相同的,您的結果圖像應該是空的。如果存在殘餘像素,則可以將這些像素計數,並將其作爲偏離標準的度量。

但是,您必須匹配其中一個圖像的方向(以及可能的比例)以對齊邊界,否則此方法將無法使用。

如果您有時間限制,您可能需要在處理圖像之前減少圖像中的信息(例如,使用邊緣檢測和/或將其轉換爲灰度甚至單色位圖(如果產品的功能足夠重要)

1

肯定有應用程序和庫已經做了你想做的事情,但我不知道任何手段。很明顯,我們可以將這兩個圖像進行散列並進行比較,但是期望的結果是完全相同,並且不會爲光線差異或類似情況留下任何餘地。

假設你已經控制了圖像中的物體,等同定向和定位相同,有一件事你可能做的是通過每幅圖像的像素遊行,並得到各的HSV值,就像這樣:

Color color1 = Image1.GetPixel(i,j); 
Color color2 = Image2.GetPIxel(i,j); 
float hue1 = color1.GetHue(); 
float sat1 = color1.GetSaturation(); 
float bright1 = color1.GetBrightness(); 
float hue2 = color2.GetHue(); 
float sat2 = color2.GetSaturation(); 
float bright2 = color2.GetBrightness(); 

並與這些值做一些比較。這可以讓你比較它們,我認爲,比使用RGB值更可靠,特別是因爲你想在你的比較中包含一些容差。


編輯:

只是爲了好玩,我寫了上面使用我的想法有點示例應用程序。基本上,它總計了H,S和V值相差一定數量(我選擇0.1作爲我的值)的像素數量,然後如果H,S或V計數器超過38400或2%像素(0.02 * 1600 * 1200)。在最糟糕的情況下,比較兩張相同的圖像需要大約2秒。當我比較一幅被改變的圖像超過2%的值時,通常會花費幾分之一秒。

很明顯,如果每秒都會產生大量圖像,這可能會太慢,但我認爲這很有趣。

+0

散列是一個不錯的主意,但由於每個圖像的像素數量很大(想到1600 * 1200字節或灰度爲1.875 MB),整個圖像上的像素逐像素分析不會產生最佳性能 – sum1stolemyname 2010-03-31 14:51:27

+0

似乎就像它取決於所用算法的速度一樣,因爲任何預計能夠識別1-2%的差異的算法都必須遍歷整個文件。 也許做一個快速減去圖像,然後總結餘下的。這將盡可能快地完成,同時仍然檢查整個圖像。 – tloflin 2010-03-31 16:16:40

1

This guy here爲同樣的問題寫了一個簡單的Java代碼。我想,將其轉換爲C#並不難。它工作得很好,也可以找到一個更新更強的版本。