4

我的問題顯示在這裏:problem statement。我有一個模板圖像,我必須在相機圖像中檢測。在檢測到我必須通過使用仿射變換來標準化攝像機圖像之後。我的工作的目標是確定十字架。我嘗試使用SURF功能進行圖像標準化步驟,但模板圖像非常規則,不適合SURF匹配。任何想法如何做到這一點?也許某種輪廓匹配?圖像匹配,仿射變形

+0

您的程序允許多少手動輸入,或根本沒有輸入? – MoarCodePlz

+0

沒有手動輸入允許,應該全部由計算機完成。 – Karl

+0

您是想從頭開始編寫整個系統還是使用現有庫來爲您完成工作? – MoarCodePlz

回答

5

所以我給了這個想法,然後意識到,你正在尋找一個整體票而不是該票的一個子集,並將其轉換爲常規矩形。這個問題(至少在理論上)不是那麼困難,編寫一些代碼來自己做這件事相對來說是微不足道的。

到目前爲止,這個最困難的部分將是初始角點檢測。由於您只對整張票感興趣,票上的所有內容都沒有任何意義。所有你感興趣的是四個角落。你可以從照片中看到,當一張票在另一張票上面時,角落並不明顯。如果你的所有照片都是在非常黑暗的表面上放置的票據,那麼這將再次變得微不足道,但想法是編寫一個應用程序,希望能夠處理甚至含糊不清的情況。這就是說我會建議採用以下方法:

1)使用圖像過濾器來減輕圖片的光照區域並使圖片的黑暗區域變暗。

我忘記了這種過濾器的名稱,但基本上你想在圖像的較暗和較亮的區域之間有更多的對比。

2)銳化所有區域的一個給定的亮度以上,高斯模糊所有給定的黑暗

特徵尋找算法一般依賴於「銳度」的圖像在下面的區域中,以便能夠檢測角和邊。通過銳化圖像中所有較亮的區域(考慮到您的票據是白色的)並模糊了圖像中所有較暗的區域,您將增加算法檢測您所尋找的角落的機會。

3)使用功能檢測,檢測四角

在這裏,事情會得到毛。如果你有一堆樂透彩票,你正在拍照,而且你希望能夠在算法上找到一張並顯示它,那麼你正在談論尖端的當前正在研究的材料。如果這是你想要做的,那麼我建議讀一些劉延熙的論文,最着名的是基於對稱性的基於對稱性的感知分組與城市場景的應用。您很可能必須從預先製作的故障單圖片中創建模板,然後嘗試將此模板的確切功能與相機圖像中相同功能的扭曲網格相匹配。一旦你的比賽高於百分比門檻,那麼你可以嘗試找到它的四個角落。如果你找到他們成功,那麼你可以繼續下一步。

另一方面,如果您沒有嘗試做尖端的事情,那麼您可以只做一些書中的功能檢測。對於角點檢測,我會推薦使用The Harris & Stephens/Plessey/Shi-Tomasi角點檢測算法。這與Yanxi在她的許多論文中使用的算法相同,並且在拐角檢測方面做得相當不錯。我不確定濾鏡是否需要圖像的灰度,或者是否需要當前色彩比例,但是如果它使用Canny邊緣檢測濾鏡,則在使用角點檢測算法之前進行濾鏡處理將是有利的。一旦你得到了檢票的主要角落(希望),那麼你將需要設計一些智能發現算法(基於你的照片的角度和內容)來「猜測」哪個角落實際上是你關心的四個角落。

同樣值得注意的是,「Mean Shift Belief Propagation」可以幫助您確定檢測算法後最重要的特徵。基本上,您可以在給定框中獲取多個特徵點,對其所有座標進行平均,然後將框放在所得座標上。移動後如果盒子中有新點,則再次進行。你繼續這樣做直到你在盒子中心有一個興趣點。這是對這個想法的簡要描述,所以我建議你進一步研究它,因爲我不知道平均細節。

4)使用雙線性插值來確定您需要傳輸到最終圖像的顏色。

重要的是要注意,你不想從你扭曲的圖像中獲取顏色。在圖像上運行所有過濾器和檢測算法的目的是找到您感興趣的特徵點。一旦擁有了這些座標,就可以回到使用原始圖像來拉取顏色。

如果你問這個問題,那麼我假設你知道雙線性插值的含義。您可以考慮失真票的頂部和底部邊緣從0開始(左角)並結束於1(右側角落)。你會認爲左邊和右邊從0開始(頂角),結束於1(底角)。您可以將相同的邏輯應用於輸出圖像的尺寸。在輸出圖像中逐個像素地尋找需要檢索顏色並使用雙線性插值的插值座標,您可以從輸入圖像中提取顏色。

就是這樣! (大聲笑)你要做的事情很相關,我希望你這樣做的運氣。根據我所知道的,創建一個完全適用於所有情況而無需用戶輸入的算法,幾乎是不可能的。此外,你正在看樂透彩票的事實引發了這個項目的道德問題。但無論如何,希望這足以讓你的大腦開始。這裏有一些額外的鏈接:

Canny邊緣檢測:http://en.wikipedia.org/wiki/Edge_detection

角檢測:http://en.wikipedia.org/wiki/Corner_detection

燕西劉的論文:http://www.cse.psu.edu/~yanxi/

均值漂移信仰傳播:用於我告訴過你的文件

編輯

代碼級分離

int threshold = 128; 
float percentChange = .5; 
int oldr, oldg, oldb, newr, newg, newb, grayscale; 

//Assuming that pixels is a 1D array of pixel objects that make up the image you're currently working with. Syntax is of Processing.org 

for (int i=0; i<pixels.length; i++) { 

    oldr = red(pixels[i]); 
    oldg = green(pixels[i]); 
    oldb = blue(pixels[i]); 

    grayscale = Math.floor((oldr + oldg + oldb)/3.0); 

    if (grayScale >= threshold) { //Brightness is above threshold, therefore increase brightness 
     newr = oldr + (255-oldr)*percentChange; 
     newg = oldg + (255-oldg)*percentChange; 
     newb = oldb + (255-oldb)*percentChange; 
    } else { //Brightness is below threshold, therefore increase darkness 
     newr = oldr - oldr*percentChange; 
     newg = oldg - oldg*percentChange; 
     newb = oldb - oldb*percentChange; 
    } 

    pixels[i] = color(newr,newg,newb); 

} 
+0

感謝您的提示!我查了一些過濾器爲1),但沒有找到某人..你能記住這些過濾器的名稱? – Karl

+0

爲過濾器添加代碼。找不到它的名字(我認爲它有點過於通用),但實現就在那裏。你基本上通過像素循環,檢查亮度(灰度),如果超過了閾值,你將每個顏色通道增加當前值和255之間的距離的百分比。如果低於這個值,則將該值減小一個% 0與當前值之間的距離。 – MoarCodePlz

0

基於特徵的直接(基於像素)的方法可能會更好。

的圖像對齊很好的教程,你可以在這裏找到: http://research.microsoft.com/apps/pubs/default.aspx?id=70092

另一個想法是選擇投資回報率。如果您知道圖像上的正確區域由紅色方塊組成,您可以嘗試將其從SURF檢測中排除。此外,您可以檢測「紅色方形區域」的形狀並將其用於變換估計。

+0

我已經嘗試過使用投資回報率,但是如果在右側區域沒有任何東西,我就會遇到問題......但是你也許正確,如果我檢測到正方形並且使用這些點,那麼它可以工作......什麼樣的算法會你用來檢測紅色方塊? – Karl

+0

首先,我會嘗試一些簡單的方法,找到長紅線(例如通過霍夫變換)並檢測它們的方向。選擇兩個最受歡迎的方向並打開正確的角度。第二個想法是使用諸如邊緣模板匹配之類的東西:http://www.codeproject.com/KB/graphics/Edge_Based_template_match.aspx,並且在模板圖像上使用長紅線作爲算法的模板。 – ton4eg

0

只要找到最大(厚和長)紅線,並做仿射變形。