獲取矩形出點
回答
如果您使用的是角點檢測算法,那麼你就可以根據檢測出的彎道的相對強度來篩選結果。相對於當前背景的書角的對比度似乎比木紋中的對比度強得多。是否有與每個點相關的相對量級,還是隻有點數?除非前景和背景的強度相對恆定,否則設置邊緣強度的閾值可能意味着很多擺弄。
你的樣本圖像可以被模糊或演變。例如,對光像素進行正確的形態學「關閉」可以消除木紋中的紋理,而不會影響書的大小和形狀。 (http://en.wikipedia.org/wiki/Mathematical_morphology)
另一種可能性是將圖像縮小到更小的尺寸,然後對進行檢測。調整圖像大小會消除小細節,例如當前正在檢測到任何木紋圖案。
挑選合適的透鏡和照明可以使圖像更容易加工。儘量在處理圖像之前儘可能簡化圖像。如上所述,只能照亮書本邊緣的「暗場」照明將爲處理提供更簡單的圖像。寫下約束條件可以更明顯地體現哪種解決方案最爲強大且最易於實施。在圖像中的任何位置找到任何矩形都非常困難;如果矩形的大小至少爲100 x 100像素,從正方形到圖像邊緣的旋轉角度不超過15度等,則在深色背景上找到淺矩形要容易得多。
更多涉及的解決方案可以拆分分爲兩種方法:
- 使用給定的只有4個或更多(x,y)點解決問題。
- 對樣本圖像使用不同的圖像處理技術。
1.解決只給出點 程序如果你一般只有5或6分,如果你有信心,這些點4將屬於你想要的矩形的角落,那麼你可以試試這個:
- 找到所有點的凸包。凸包是完全包含所有點的N型結構。如果這些點是釘子粘住,並且如果你在它們周圍拉伸橡皮筋並讓它卡入到位,那麼橡皮筋的最終形狀就是一個凸包。發現凸包的算法通常會返回從最左下角逆時針排列的點的列表。
- 讓你點列表的副本,從副本中刪除點,直到只有四點依然存在。剩餘的這四點仍然是逆時針排列的。
- 計算每組三個連續點形成的角度:點1,2,3,然後是2,3,4,然後是3,4,1等等。
- 如果角度超出合理的公差 - 小於70度或大於110度 - 跳回步驟2並移除下一個點(或一組點)。
- 存儲每組4點的最小和最大角度。
- 重複步驟2 - 6,每次刪除不同的點(或點)。
- 跟蹤最小和最大角度最接近90度的一組點。
http://en.wikipedia.org/wiki/Convex_hull
有許多可以引入其他的檢查和約束。例如,如果凸包(pts N到N + 1和N + 1到N + 2)中連續3個點的點到點距離接近書的預期寬度和高度,那麼您可能會將這些標記爲已知的優點,並且只對剩餘的點進行測試,以確定哪些是第四點。
如果您獲得了不少的幾點,上面的技巧可能會變得很難處理,但如果預計在凸包上找到兩三本書角點,它可能會奏效。
對於任何幾何問題,我總是建議檢查一下GeometricTools.com,它有許多偉大的優化的源代碼用於各種問題。這本書也非常方便,特別是如果你可以使用AddAll.com找到便宜的副本。
http://www.geometrictools.com/
2.爲您的樣品圖像 其他圖像處理技術,雖然我可能是錯的,看來GPUImage沒有許多通用圖像處理算法。其他一些圖像處理算法可能使這個問題更容易解決。
儘管在這裏沒有空間進入它,成功的圖像處理的關鍵之一是適當的照明。確保你的照明是一致的。均勻照亮書本和背景的漫射光線可以很好地工作。您可以使用更好的照明來簡化問題:如果您有四盞燈(或特殊的環形燈),則可以從上,下,左和右提供水平照明,使書本的邊緣看起來明亮,其他表面看起來很黑。 http://www.benderassoc.com/mic/lighting/nerlite/Darkfield.htm
如果你可以使用一些其他的GPU庫做圖像處理,那麼下列方法之一可以很好地工作:
- 連通區域標記(又名發現斑點)。使用二進制閾值或分水嶺算法來分離書中的白色斑點與背景的其餘部分是不應該太難的。一旦確定了該書的一團,找到角落更容易。 (http://en.wikipedia.org/wiki/Connected-component_labeling)在OpenCV中,您可以找到「輪廓」。
- 生成邊緣點列表,然後使用四個單獨的線條擬合工具從上到下,從右到左,從下到上搜索,從左到右搜索與邊緣點相關的四個強(大部分是直線)邊書。不過,在您的示例圖像中,書籍封面稍有扭曲或相機鏡頭引入了桶形失真。
- 使用設計用於在深色背景上查找燈角的角落探測器。如果您一直在尋找木紋背景上的白皮書,您可以創建一個探測器來查找棕色背景上的白色邊角。
- 使用霍夫技術來找到圖像中最強的四條線。 (http://en.wikipedia.org/wiki/Hough_transform)
效果最好的算法技術將取決於您的約束:您是否在尋找只有一定大小的矩形?前景與背景的對比是否一致?你可以引入照明來簡化圖像的外觀嗎?等等。
- 1. 獲取矩形和線的交點
- 2. 獲取圓角矩形的點數
- 3. 獲取矩形的所有頂點
- 4. 獲取矩形的座標
- 5. 獲取最佳矩形
- 6. 獲取由兩個矩形
- 7. 點在矩形
- 8. 獲取離中心矩形最遠的矩形
- 9. 從包圍矩形和角度獲取旋轉矩形座標
- 10. Libgdx - 從Rectangle.overlap(矩形)獲取交集矩形
- 11. 捕獲矩形
- 12. C點形成矩形
- 13. 點繪製矩形
- 14. SysLink焦點矩形
- 15. 矩形內的點
- 16. 從一個點和一條線獲取矩形座標
- 17. 按中心,法線,長度和高度獲取矩形頂點
- 18. 如何在OpenCV中獲取旋轉矩形的頂點?
- 19. 獲取矩形的交點不是O(n²)和OutOfMemory
- 20. DQL查詢獲取地理空間點st_within一個矩形
- 21. 如何從矩形交點獲取單個數字
- 22. 如何獲取cocos2d或cocos2d-x中節點的可見矩形?
- 23. 獲取一組矩形的輪廓
- 24. 在「蜘蛛網」內獲取矩形?
- 25. 獲取旋轉矩形的角落
- 26. 獲取矩形的旋轉中心
- 27. 獲取FrameworkElement邊界矩形的座標
- 28. 獲取drawString的邊界矩形?
- 29. 如何從矩形中獲取圖像?
- 30. 獲取UIWebView的邊界選擇矩形
我想知道是否可以使用打開或關閉操作作爲第一步,以消除它檢測到的一些小尺寸功能。您也可以使用角點檢測器以較低的分辨率處理圖像,以僅挑出較大尺寸的特徵。這不會完全消除多餘的點,但它可能會有所幫助。 –
嗨0xSina,我也想用GPUImage做同樣的事情(檢測圖像中的書/頁面的角落)。你是怎麼做到的?你使用了哪個過濾器? – iKT
@IOSDev我在GPUImage中使用了幾個過濾器的混合結果,所以我使用openCV。 – 0xSina