2012-11-14 12 views
9

我正在將位圖圖像添加到我的C#程序中,以便能夠執行OCR以識別圖像中的字符。如果圖像沒有旋轉,我可以很好地做到這一點。然而,程序要求之一是程序自動確定圖像是否已旋轉,並自動糾正這些旋轉。如何找到圖像的旋轉角度?

我試過實現一個簡單的方法,在圖像上跟蹤線條,並記錄與角色接觸的點,然後對線條點執行簡單的線性迴歸。這在一定程度上起作用,雖然由於字符的曲率等原因未被證明是非常準確的。

我想知道是否有更好的方法來解決這個問題?提前謝謝了! :)

回答

2

我使用gmseDeskew算法來糾正我的程序中的圖像。它工作得很好。

+1

這個算法對我有用。我發現一個很棒的C#實現[here。](http://mdb-blog.blogspot.com/2010/10/c-how-to-deskew-image.html)不幸的是,它看起來像寫的算法是寧可硬編碼爲±20度。我嘗試改變代碼行,例如'double cAlphaStart = -20;'改爲-45,以搜索±45度,以及其他一些行,但不可避免地會有某些事情中斷。我很想聽聽是否有更靈活的算法,或者有人可以解釋如何調整算法使其更加靈活,而不會破壞結果。 –

+0

我也試過了,效果很好。 @MacSigler要增加角度「範圍」到(-45,+ 45),似乎你只需要改變這些行:double cAlphaStart = -45; int cSteps = 90 * 5;我測試很快,但它似乎沒問題。 – AFract

2

這是一個有趣的問題,可以肯定。我會尋找更容易分辨旋轉的字母。例如,首字母A或R或K應該具有大致相同的水平面。另一個選擇是採用無法識別的字母,並以各種方式旋轉它們並重新嘗試識別它們。如果原始掃描中無法識別的字母可以在旋轉時識別出來,這是一個很大的線索。一旦識別出使得不可識別字符變成可識別字符的「校正」旋轉,將相同的旋轉值應用於其他字符。

+0

加入到這個,如果你可以找到一個「o」,你可以徑向向外延伸出一個方向,並通過查看字母是否在你的線上來確定你的方向 –

+0

最大的問題是我找到它了因爲我正在尋找字符之間的垂直和hortizontal空格,所以在旋轉之前很難甚至無法分離字符。如果圖像旋轉,則更多的時候這個空白被下一個字符中斷。由於我無法隔離角色,因此我無法開始嘗試識別角色。 –

+0

@MacSigler如果一個足夠強大的模糊會使文本行至少混合在一起足以進行邊緣檢測或在hough變換中脫穎而出? –

0

找到與文本相鄰的豎直線可能更容易(即左邊距)。對於每條掃描線,記錄第一個黑色像素。把所有這些放在一個線性迴歸中,你應該得到一條接近垂直的線。從真實的垂直角度測量它的角度,你應該能夠不旋轉文字。你可以想象對頂部,底部和右側也做同樣的事情,並取平均值。

2

如果它識別出文本行,則嘗試模糊圖像,以便線條大多是實心的,並找到線條的方向(或者通過傅立葉變換分析或通過脊線檢測)。

1

如果文本的格式與打印文檔(列和文本行)相同,那麼您可以利用此功能。

,我經常看到用於文檔中的文本的方法是做投影輪廓:

  1. 在特定方位掃描文檔並總結了「黑」像素的數量上的每個掃描線(創建一維計數數組,每個索引代表一個Y座標,配置文件)。
  2. 計算計數(分佈)的方差。
  3. 對於多個角度重複(可採用二進制搜索方式來減少處理)
  4. 導致最大變化的角度是正確的角度(由於文本行從打印的文本創建大峯值,由於沒有文字之間的線低谷)

然後找到這個角度後,你可以相應地調整你的形象,做你真棒的OCR。

0

我們之前遇到過類似的問題,我們搜索了一個簡單快捷的解決方案,最後我們使用了一個商業工具包(leadtools)。您可以使用它在OCR之前對圖像進行自動處理。您可以檢查help topic以瞭解如何使用此工具包處理和掃描圖像。

+0

儘管這個鏈接可能回答這個問題,但最好在這裏包含答案的基本部分(以及爲什麼它實際上回答*旋轉角度*的問題),並提供供參考的鏈接。如果鏈接頁面發生變化,則僅鏈接答案可能會變爲無效(並且已停用)。請參閱[如何回答](http://superuser.com/questions/how-to-answer)瞭解它的重要性。 – bytebuster