2012-11-16 70 views
1

我需要在較大的圖像中找到較小圖像的位置。較小的圖像是較大圖像的子集。例如,如果圖像是由不同的JPEG壓縮產生的,則要求像素值可以稍微不同。 我已經通過比較使用CPU的字節來實現解決方案,但我現在正在研究加快此過程的任何可能性。 我可以以某種方式利用OpenGLES和iPhone GPU嗎?硬件加速圖像比較/搜索?

注意:圖像是灰度。

回答

1

@Ivan,這是一個非常標準的視頻壓縮問題(找到前一幀中當前宏塊的位置)。您可以使用像素差異的度量標準,例如絕對差異總和(SAD),差異平方和(SSD)或Hadamard轉換差異總和(SATD)。我假設你不是試圖壓縮視頻,而是尋找像水印這樣的東西。在許多情況下,您可以使用梯度下降類型搜索來找到局部最小值(最佳匹配),根據經驗性觀察,將圖像(您的小圖像)與略微偏移的相同版本(與其位置不匹配沒有被發現)恰好比另一個圖像的隨機部分產生更接近的度量。因此,您可以首先對所有可能的偏移/位置(視頻編碼中的運動向量)進行粗略抽樣,然後對最佳結果進行局部優化。局部優化通過將比賽與一些鄰近比賽進行比較來起作用,並且如果比當前比賽好,則重複進行。這比蠻力(檢查每個可能的位置)要快得多,但它可能在所有情況下都不起作用(這取決於正在匹配的性質)。不幸的是,這種類型的算法不能很好地轉換成GPU,因爲每一步都依賴於前面的步驟。它可能還是值得的;如果你檢查例如16個鄰居到256x256圖像的位置,這足夠並行計算發送給GPU,是的,它絕對可以在OpenGL-ES中完成。然而,所有這一切的答案真的取決於你是在做強力還是本地最小化類型搜索,以及本地最小化是否適合你。

+0

感謝您的詳盡答案!目前我正在做abs差異的總和。我沒有處理視頻。這有點具體。我從服務中獲取兩張圖像,並且需要能夠在較小圖像所在的確切位置放大較大圖像(然後用戶可以隨意縮小)。我沒有提到的是,較小的圖像可以是不同的分辨率,所以我非常強制所有決議,直到我找到一個匹配。我相信可以在GPU上並行化?但是,我希望我能想到從哪裏開始考慮如何完成。 –

+2

@IvanKovacevic - 比較本身可以很容易地在GPU上完成,使用兩個圖像的不同混合(例如,我的GPUImage框架將做到這一點非常簡單),並且可以通過將平均亮度的結果(再次,可以在GPU上執行的操作)。更強大的方法可能是使用特徵匹配,但這需要更多的編碼工作才能完成。 –

+0

謝謝布拉德你的框架看起來很棒!我會嘗試使用混合和亮度技術,但是我有點懷疑瓶頸會在GPU中發送/初始化圖像,因爲我需要逐個像素地移動原始圖像並創建相同尺寸的裁剪圖像作爲子圖像(我正在比較),然後發送到您的差異混合過濾器。也許有可能編寫一個自定義過濾器來完成GPU上的所有功能? –