2011-01-21 112 views
24

OpenCV在模板匹配期間處理圖像透明度的方式是什麼?OpenCV模板匹配和透明度

問題是模板圖像需要有透明部分,因爲在原始圖像中可能有任何這些地方。

我嘗試了所有的方法,沒有一個產生正面的結果(例如原始圖像中模板的位置未被正確檢測到)。

編輯:好吧,我明白這是必要提供的例子。

Original image

Template image

正如你所看到的,這幾乎是不可能這樣的模板匹配那樣的圖像。 「背景」 周圍的物體可以有任何顏色(像這樣,還是白色,棕色...)

Sobel on grayscaled image & template + cvConvertScaleAbs

Additional original image

編輯2: Misha的解決方案有一點甚至工作(「透明」作品)。例如:

Template match sucessful

編輯3 - 多次出現:

我做了找到一個模板的多次出現的快速和骯髒的解決方案,但是當模板沒有找到,我收到了「很多「的誤報。這主要是因爲我的實現的:

  • 迭代過的圖像數據
  • 如果(的imageData [Y,X,0]> =包括maxValue * 0.95f),那麼它計數[X,Y]爲匹配 (包括maxValue從cvMinMaxLoc)

works圖片,當有至少一個正賽,但是結果是可怕的局面圖像,其上有isn't such template

+0

對最大值設置閾值。如果它低於閾值,圖像不包含模板。您將不得不憑經驗確定閾值的度量。 – misha 2011-01-26 01:00:35

+4

找不到圖片。 =( – 2015-12-10 04:32:05

+0

@anatolytechtonik對不起,我沒有他們了(已經5年了) – mnn 2016-02-18 18:30:19

回答

15

OpenCV似乎並不像你想要的那樣處理alpha。

你有兩個選擇:

  1. 寫,將使用Alpha通道
  2. 將您的圖像,所以您的alpha通道變得無關緊要

因爲第一選擇自己的互相關法很簡單,我會在這裏探索第二個選項。我將重新使用前面提供給a similar question的示例代碼。如果將互相關直接應用於圖像,背景會干擾模板匹配(特別是淺色背景部分)。如果您使用顏色通道,您會發現藍色通道中的匹配會給出正確的結果。這取決於圖像內容,並不是解決問題的一致方法。

另一種選擇是對圖像和模板執行邊緣檢測(例如Sobel),然後執行互相關。這裏是邊緣檢測圖像(我在GIMP的Luma通道上使用Sobel邊緣檢測器,然後進行一些強度拉伸)。

map

building

正如你可以看到,α通道這裏已經變得無關緊要,因爲大多數的地形成爲零強度,並且不會向交叉相關計算。所以,現在的互相關可以直接應用,獲得所需結果:

[email protected]:~/Desktop/stackoverflow$ python cross-correlation.py map-blue.png building-maskz-blue.png 
(163, 244) 

最後,這裏的another related question

PS。這是什麼遊戲?

0

我想你正在嘗試做什麼在OpenCV中稱爲模板匹配與面具。我想你可以嘗試在模板上設置ROI(感興趣區域)。 This SO question shows how to do it。 (請注意,在這個問題中,ROI是在目標圖片上設置的,而不是模板,但程序是相同的)。

+0

有趣,但並沒有真正的幫助,因爲我不能縮小搜索範圍到這樣的區域(模板圖像可能位於 – mnn 2011-01-24 19:51:53

+0

但是,在模板本身中,像素是透明的(即不應該在模板ROI中),像素不透明(即應該在模板ROI中)。可能發生的最糟糕的事情(就像@Utkarsh Shinha所說的那樣,你必須編寫自己的模板匹配函數來忽略不在ROI中的像素) – carlosdc 2011-01-25 00:38:20

+0

查看示例圖像透明區域不是以任何方式呈現矩形,並且ROI是一個矩形 – mnn 2011-01-25 10:05:33

0

我不確定,但透明度通道就像其他任何通道一樣處理。如果模板中的某個像素是「透明的」,則它在主圖像上也應該是「透明的」。我只是在這裏猜測。

1

如果您嘗試用黑色RGB顏色替換Alpha通道,則SQDIFF/SQDIFF_N選項將是一個解決方案。 至少這是我對同樣問題的解決方案。從我的結果顯而易見的是,這種方法對更亮的像素值很敏感,我抓住了這個機會。

-1

我遇到了同樣的問題,我想到了一個解決方案。假設referenceImageMask和templateMask在好像素中有1,而在壞像素中有0。並且referenceImage和templateImage已經被屏蔽並且在壞像素中也具有0。

然後,模板匹配的第一個結果將給出圖像之間沒有標準化的互相關。但是,一堆像素爲零。

第二個模板匹配將爲每個可能的偏移量提供兩個圖像中同時不同於零(未遮罩)的像素數。

然後,通過該數字對相關性進行歸一化應該給出您(和我)想要的值。兩個圖像中未被遮罩的像素的平均產品。

Image<Gray, float> imCorr = referenceImage.MatchTemplate(templateImage,  Emgu.CV.CvEnum.TM_TYPE.CV_TM_CCORR); 
Image<Gray, float> imCorrMask = referenceImageMask.MatchTemplate(templateMask, Emgu.CV.CvEnum.TM_TYPE.CV_TM_CCORR); 
_imCorr = _imCorr.Mul(_imCorrMask.Pow(-1)); 

更新:實際上,此解決方案不起作用。由於opencv中的交叉關聯的實現使用了DFT,因此會出現數字問題,您不能使用第二個互相關來糾正第一個。

9

我對這個問題有一個稍微更多的腦死亡的解決方案,實際上它似乎工作得很好:用噪聲代替模板圖像的alpha通道,這或多或少會使得透明區域在匹配過程中變得無足輕重。

例如,我的用例涉及在iOS屏幕截圖中搜索表情符號字符。 iOS鍵盤背景根據上下文更改顏色,如果您在模板圖像中提交特定背景顏色,則匹配過程會出現問題。

下面是關於阿爾法原始模板圖像:
raw template image on alpha

這裏的處理的模板與噪聲alpha通道填充:
enter image description here

我通過在所提供的Template Matching sample code發送經處理的模板圖像OpenCV文檔。無論是黑暗或淺色背景下,都可以找到合適的信心。

在搜索深色背景:

matched on dark

在搜索上的光的背景:

matched on light

相比較而言,在離開模板的alpha通道透明 - 或承諾深色或淺色背景 - 沒有返回可接受的比賽。

6

OpenCV 3.0提供了本機支持模板匹配與屏蔽模板。請參閱new documentation

參數:

圖像...

TEMPL ...

結果...

方法...

掩碼搜索到的模板的掩碼。它必須與templ具有相同的數據類型和大小。它沒有默認設置。

該模板與掩蔽參考圖像(較大的圖像)的匹配[輕微題外話]

注意是不可能的,但。這是有道理的,因爲OpenCV使用基於FFT的模板匹配。因此,如果您只需要在參考圖像的特定區域執行模板匹配,則需要實現自己的方法或掩蓋cv :: matchTemplate的輸出。

從頭開始實施它可以彌補您只想在特定區域搜索模板的情況(即:在哈里斯角周圍)。