2011-08-09 29 views
14

我一直在嘗試多次創建算法以從中文字符中提取筆劃信息。我嘗試了各種方法,但沒有一個能讓人滿意,可能是因爲我對圖形算法的知識有限。如何從中文字符中提取筆劃

基本上,我有以下數據:

  • 中國的字符,該字符可以是像素或載體(黑色)

  • 行程的整體輪廓,以像素爲單位(在紅色)

  • 整體方向(藍色箭頭)。

enter image description here

從此,我試圖提取衝程。如果你必須這樣做,給定可用的數據,你會用什麼方法?你能想到任何自動提取筆畫的方法嗎?

+0

棘手的問題之間的這一步。 –

+0

你在準備什麼? – Szabolcs

+1

我想創建角色中風動畫。 –

回答

4

我會先計算距離每個藍色像素最近的白色像素的距離。然後你可以保留所有比最近的白色像素更近的紅色像素。之後可以使用某些過濾器來平滑效果(可能類似於erosion後跟close)。

2

我不認爲你可以想出一個算法,沒有案件,這將是不正確的。有些字符的部分是相同的,但不等同於相同的筆畫數。例如,馬在技術上還包括從視覺角度來看(當然不是語言上的)。

我唯一的想法是將區域分成小區域並編寫一個試圖按照設定順序進行筆劃的算法,但我無法想象這很容易,並且取決於字體,一些線路延伸到的區域,他們不應該在

也有一些字符根本就沒有得到很好的算法,由於其不尋常的佈置工作 - 只有按照順序的嚴格規定筆畫可以得到正確的數字:例子包括凹和凸。

我不得不問 - 筆畫數是每個字符的基本信息 - 爲什麼你需要創建一種算法來計算呢?做字符識別並查找自定義字典中字符的筆畫計數不會更容易嗎?

+0

我相信OP有關於由藍色箭頭給出的筆畫的附加信息。此外,他似乎沒有興趣計算筆畫,但在分離它們(也許創建一個動畫版本?)。 –

+0

是的,我不是在尋找中風計數,因爲我知道有數據庫。我想從角色中提取每個筆畫(它的圖形外觀)。因爲我相信它不能自動完成的,我將通過提供藍線,紅色像素(基本上我手動繪製在具有大刷字符的頂部,下面的筆畫順序)「引導」的算法。我也認識到,某些情況下可能會更復雜(我腦子裏的角行程在中),但在同一時間:) –

+0

啊一個問題,我明白你的意思。這是我的頭! ; O;祝你好運,這聽起來將會是很多工作。 – aevanko

3

你可能會尋找medial axis,也被稱爲topological skeleton。簡而言之,您將求解找到與邊上多個點等距的點。您可能需要對結果曲線進行平滑或簡化。

棘手的部分是分離這是常見到多於一個筆劃的形狀的一部分。我不相信有一個明確的方式來做到這一點。也許將「共同區域」定義爲以每個骨架交點爲中心的圓,與最近的邊相切?那麼可能是間隙中的筆畫寬度的一些插值?

1

我認爲可以工作的最簡單的事情就是到:

  1. 情節的藍色箭頭,逐一
  2. 計算每個藍色線段
  3. 的距離變換交叉與此離散距離紅色區域
  4. 隨距離除去紅色區域到藍色段更大的大於T

一旦你完成這件事,那麼你就可以在更復雜的戰略合作,選擇一個好的,段依賴T.

2

從藍線和樣本圖像,我認爲這三個步驟的方法可能對相當多的情況下工作:

  1. 對於沿線的每個點,選擇比最接近的白色像素更接近 到那個點的所有紅色像素。這將粗略地給出角色的描邊,但是在兩個筆劃交叉的區域周圍會出現凸起,並且您將排除描邊兩端的一些像素。

  2. 要消除凸起,請隔離筆畫的邊緣像素,然後計算該邊緣圖像的hough transform。從中選擇兩條最重要的線。這會給你(如果筆畫足夠直的話)沿着筆畫邊緣的兩條線。消除您的筆畫中與這兩條線相比在垂直方向上遠離藍線的所有紅色像素。現在(對於一個足夠筆直的筆畫),你所缺少的將是一些小的孤立的像素塊,在第1步或第2步中已經消除了:

  3. 添加所有小的孤立像素區域中風,而且沒有其他部分的人物可以中風。如果在步驟2中找到線太靠近藍線你也可以執行步驟1和2