2012-03-19 59 views
3

我已經創建了一個iPhone應用程序,可以掃描方格紙頁面的圖像,然後可以告訴我哪些方塊已被黑掉,哪些方塊爲空。用於識別2D特徵的圖像處理

我通過從左到右掃描並使用方格紙的線條作爲參考。當我遇到一個方格紙線時,我開始尋找黑色,直到我再次點擊方格紙線。然後,我繼續沿着掃描線繼續前進,並完全掃描黑色方塊。然後我繼續到下一個框。在該行的最後,我開始掃描新行之前忽略了很多像素(因爲我已經知道每個盒子的高度)。

這類作品,但有問題。有時我會將圖形線條誤認爲「黑色」。有時,如果圖像偏斜,或者整個頁面沒有統一的光照,那麼我的效果不好。

我想要做的是指定一些「對齊」框,然後調整大小並旋轉(和傾斜)圖片以與這些對齊。然後,我想,一旦我將圖像對齊後,我就會知道所有的盒子在哪裏,不需要掃描盒子,只需掃描盒子的位置,看它們是否是黑色的。這應該更快,更可靠。如果我要操作來自相機的圖像,我會更靈活地要求用戶對齊圖片以匹配對齊標記,而不必自己對齊圖像。

鑑於這是我的第一個圖像處理項目,我覺得我正在重新發明輪子。我想就如何做到這一點以及是否利用OpenCV等庫提出建議。

我附上了一張類似於我想處理的圖像。我正在尋找有大量黑色標記的所有方塊的列表,即A8,C4,E7,G4,H1,J9。 enter image description here

需要注意的問題的:

  • 圖像的光覆蓋範圍可能不理想,但應該是在圖像相對一致的(即無陰影)
  • 所有的廣場可能是空的或全黑,並且該算法需要能夠確定圖像可能偏斜或圍繞任何軸旋轉。圍繞z軸旋轉可能很容易修復。圍繞x或y軸可能會有旋轉,使圖像的一側比另一側寬。但是,如果我從相機中實時掃描圖像,我可以要求用戶將對齊標記與屏幕上的標記對齊。如何最好地確保對齊以給用戶提供適當的反饋?只要檢查以確保4個角落是黑暗的,當相機指向黑色表面時可能會導致誤報。
  • 並非每一個方格都會同樣或一致地變黑,但我認爲會有足夠的黑色使它對人眼無可懷疑。
  • 藍色網格可能很有用,但有些情況下黑色標記可能與藍色網格重疊。我認爲虛擬網格可能比依靠印刷網格更好。我認爲使用對齊標記來對齊圖像可以實現精確的虛擬網格佈局。然後可以對每個網格框的內容進行採樣,以查看它是否主要是黑色,與從左到右的掃描相比,不是?這是另一幅在網格上有更多標記的圖像。在這張圖片中,除了之前在A8,C4,E7,G4,H1,J9中的標記之外,我標記了E2,G8和G9以及I4和J4,您可以看到藍色網格是如何被遮擋的。

2nd image

  • 這是我這個項目的第一階段。最終,我想擴展這種算法,以便能夠處理至少幾百個插槽和可能不同的顏色。
+1

請發表幾個實際的圖片。 – Maurits 2012-03-19 21:29:36

+0

@Maurits補充說。感謝您的要求。 – mahboudz 2012-03-19 22:06:51

+0

算法可以使用藍色網格嗎? – Maurits 2012-03-20 22:03:48

回答

5

首先,這個問題讓我想起了一下這些演示的的,可能是從學習有用:

個人而言,我認爲最簡單的方法是檢測s誇張在你的形象。

1)取下的背景和小的cruft

f_makebw = @(I) im2bw(I.data, double(median(I.data(:)))/1.3); 
bw = ~blockproc(im, [128 128], f_makebw); 
bw = bwareaopen(bw, 30); 

enter image description here

2)拆下的一切,但正方形和圓形。

se = strel('disk', 5); 
bw = imerode(bw, se); 

% Detect the squares and cricles via morphology 
[B, L] = bwboundaries(bw, 'noholes'); 

3)使用regionprops的'extend'檢測正方形。 「範圍」度量度量了邊框的哪個比例被填充。這使得它 不錯的措施,圓形和方形

stats = regionprops(L, 'Extent'); 
extent = [stats.Extent]; 
idx1 = find(extent > 0.8); 
bw = ismember(L, idx1); 

enter image description here

4)這讓你與你的功能進行區分,以同步或糾正與圖像。一個簡單而可靠的方法就是通過自相關函數。

enter image description here

這給了很好的峯值,這很容易被發現。這些峯可以通過匈牙利算法與來自模板圖像的ACF峯匹配。一旦匹配,則可以糾正旋轉和縮放,你現在具有可以求解線性系統:

x = Ax'

翻譯然後可以使用針對所定義的相同的預運行的設施,工廠互相關來校正模板。

如果一切順利,您知道有一個對齊或同步的圖像,這應該有助於確定點的位置。

+0

謝謝。這給了我很多想法。你的例子是MatLab代碼,對嗎? iPhone Soduku鏈接非常有幫助。我也會研究OpenCV。 – mahboudz 2012-03-22 21:28:41

+0

這是Matlab,我可以共享一個功能,如果你想要做任何事情。隨着iPhone的發展,我不能幫你... – Maurits 2012-03-22 21:51:23

+0

我很想看到一些C代碼,如果可用的話。但是獲得一般想法,就像你給我的一樣,也是有幫助的。我可以很容易地做到黑白,和反。我不確定bwareaopen,strele和imerode是做什麼的,但我想我可以很容易地看到它們。我也很好奇OpenCV做了多少。 然後,我有這樣的想法,一旦我有一切相關,我可以很容易地看看我可以期望找到圈子的位置,並檢測它們 - 因爲它們將是白色或黑色,並且不會有與周圍環境區分開來。 – mahboudz 2012-03-24 02:09:03

3

我已經開始使用我的GPUImage iOS框架做類似的事情,所以這可能是在OpenCV或其他方面做所有這些的替代方案。正如其名稱所示,GPUImage完全基於GPU,所以它可以比CPU綁定處理帶來巨大的性能優勢(處理實況視頻等處理速度高達180倍)。

在第一階段,我把你的圖像,並把它們放到了與0.5閾值的簡單的亮度閾值過濾,抵達你的兩個圖像以下幾點:

Threshold image 1 Threshold image 2

我只是增加了一個自適應閾值濾波器,該濾波器試圖校正局部光照變化,並且非常適合拾取文本。然而,在你的圖片,它使用過小的平均半徑來處理您的blob好:

Adaptive threshold image 1 Adaptive threshold image 2

,似乎襯托出你的網格線,它聽起來像你希望忽略。

Maurits提供了一個更全面的描述你可以做什麼,但可能有一種方法來實現這些處理操作作爲高性能的基於GPU的過濾器,而不是依賴相同計算的較慢的OpenCV版本。如果您可以從此閾值圖像中獲取旋轉和縮放信息,則可以構建一個轉換,該轉換也可以作爲篩選器應用於閾值圖像,以生成最終對齊的圖像,然後可以由應用程序對其進行降採樣並讀出,以確定這些網格位置被填充。

這些基於GPU的閾值操作對於iPhone 4上的640x480幀運行時間小於2毫秒,因此可以將濾波器鏈接在一起以分析傳入視頻幀的速度與設備的速度一樣快攝像機可以提供它們。

+0

這聽起來很強大。我在哪裏可以學到更多? – mahboudz 2012-03-27 10:32:48

+0

我現在看到您的鏈接到GPUImage。將調查。 – mahboudz 2012-03-27 10:34:42