2009-12-21 63 views

回答

1

這取決於您是否在按位模式進行「精確」匹配或僅進行近似(模糊)圖像匹配。如果你正在做一個精確的匹配,只需將位圖作爲一個通用的2D數據數組搜索。

一個簡單但非常容易實現的精確匹配可以在N * M時間中進行,其中N是乾草堆中的像素數量,M是針中的像素數量。由於Haystack的大小是(S,T),Needle Bitmap的大小是(U,V),所以可以在Haystack上迭代Y = [0,T-V)。對於每個位置,您可以查看與Needle [{X,Y},{X + U,Y + V})大小相同的2D子陣列,並將其與Needle [{0,0},{ U,V})座標。

+0

我想做一個模糊匹配...我相信這是可用的我正在使用的AForge框架? – Ropstah 2009-12-21 19:30:34

+0

我真的不知道從模糊邏輯上的兩個位圖到哪裏去:) – Ropstah 2009-12-21 19:33:14

+0

那麼,與模糊匹配,你想縮放/旋轉/允許歪斜? – Adisak 2009-12-21 19:51:45

0

你可以通過Image Registration來做到這一點,雖然我不知道一個(好的).NET庫可以直接用於這個。

如果你願意使用C++,Insight Toolkit有很多工具可以幫助你做到這一點,包括你的「乾草堆」不能精確匹配「針」(即:「模糊」搜索/匹配)。

0

我決不是圖像處理方面的專家。只是在這裏想出一個想法:)

說你看你的針的像素線。這一行可以爲計算給定行的校驗和提供一個基礎,所以我們稱之爲指紋。現在,您可以搜索乾草堆中的所有水平線,以獲得相同長度的子集,並使用相同的校驗和。一旦你找到你的橫向候選人,你可以檢查每個垂直匹配。

這個算法的問題顯然是它的速度。在你的水平指紋上有很多匹配的情況下(例如,如果你選擇了最上面的一行,它將全部是黑色的 - 在乾草堆中顯示出很多模式),這是O(可怕的),所以不知何故你必須選擇一個具有很好,不同行爲的指紋。

我敢肯定有很多更好的方法來做到這一點,但我想我會分享我的想法:)

好運

1

你可能想看看「edge detection」通用這是你正在嘗試做的事。

這兩個鏈接看起來有用,但更多處理色彩重合比圖像處理:

  1. Codeproject: Edge Detection
  2. Edge Detection in C#

的你想要做什麼的要點是:

  1. 將「查找」圖像切割成最小尺寸
  2. 反轉的「查找」圖像,並確保該邊緣作爲清潔(具有高梯度)儘可能
  3. 掃描「目標」圖像並檢測所有邊緣
  4. 細分「目標」圖像劃分爲段「找到「大小(加上一些錯誤),並只採取邊緣數量較多的區域
  5. 」目標「中的Foreach部分XOR部分上的」查找「圖像(根據需要遞增)並查看結果閾值低於您檢測到的閾值

所以基本知識是你剪輯你的「查找」圖像,在對其進行垂直(對於異或),找到目標圖像中的所有邊,然後將XOR映射應用於這些區域並找到最高匹配百分比。

或者,如果圖像足夠小,則可以「滑動」應用相同的技術,反轉查找圖像,並將其滑過「目標」圖像尋找匹配。

這些技術的主要問題是什麼構成了「匹配」,它通常不會是100%的匹配,並且當發生這種情況時你必須有一些代碼來處理。

如果你需要這樣做,我建議找一個已經做到這一點的庫,比如裏德所建議的。如果你想推出自己的,花一些時間在維基百科和Codeproject上看圖像操作庫。