2011-09-18 28 views
-1

我有一個帶有標誌的圖像,像the one with a pie chart here在畫布上查找替換

我怎樣才能找到一個特定的標誌,並用帆布取代另一個標誌?

編輯: 我無法控制的源圖像,但要找到該地區始終是已知的,以取代圖像總是大小作爲一個找到相同。我只需要用另一個特定的標誌替換一個特定的標誌。

編輯2: 該標誌可能出現在圖像數次。

+0

這不會是微不足道的 - 它*有*實現自動化?如果新的標誌是比舊的,哪裏會背景的像素從未來小? –

+0

你需要更具體。有沒有辦法以某種方式修改原始圖像? –

+0

圖片不存在。 – epascarello

回答

0

鑑於你已經知道座標並有圖像映射,你可能需要使用drawImage

+0

的圖像總是不同的,唯一的標誌是一樣的。我需要找到該標誌的所有出現,並取代它們 –

+0

您可能需要找出某種OCR的算法中找到的標誌。在這種情況下,您可能需要比較像素級別的圖像。 API中有一些方法允許您執行此操作(主要是getImageData)。 –

1

你不會看到壯觀的表現,但解決這個問題的一種方法是迭代餅圖圖像中的像素。

在餅圖圖像上調用getImageData()以獲取圖像的所有像素數據(即請求最大尺寸)。同樣,請在要搜索的標誌上撥打getImageData()。設置一個迭代從餅圖中獲取的所有像素的循環。對於每個像素,假定它是您正在搜索的標誌的左上角(或基於您的迭代順序的另一個角)。將其與標誌像素數據中的第一個像素進行比較,如果他們同意,則繼續在等於標誌寬度和高度的窗口大小內進行迭代。如果到達窗口迭代的末尾,並且每個像素對匹配,就會找到您要查找的標誌。如果他們不這樣做,請轉到餅圖數據中的下一個像素,然後再次在窗口上進行迭代。

注意,在最壞的情況下你與N = pie chart pixelsW x H = flag dimensions看着O([N * W * H] - [W * H])或只是O(N * W * H)。你可以改善這一點,不要在你知道沒有標誌的窗口上迭代,並且通過更加智能地移動窗口。一旦找到匹配項,您就可以在角落的座標處打上drawImage()的新標誌。

當然這種方法假定您要搜索的標誌餅圖圖像中表示正是。如果您要將非壓縮標誌與壓縮的餅圖圖像進行比較,反之亦然,則不會找到匹配項。同樣,任何大小或方向的變化都將徹底擊敗這種方法。如果你需要這種靈活性,那麼你正在研究類似SIFT領土。雖然我確信可以使用畫布元素來實現,但我不想成爲那樣做的人。

在這種情況下,你要確保你不遍歷DOM不必要在進行迭代。特別是,你將要存儲的像素數據本地引用的解釋在這裏:http://www.onaluf.org/en/entry/13