2009-11-10 38 views
3

正如你可能聽說過的,有一個在線字體識別服務調用WhatTheFont用Python自動識別字體

我很好奇這個工具背後的技術。我覺得基本上我們可以單獨爲兩個部分是:

  1. 生成各種格式的字體文件圖像,請參閱http://www.fileinfo.com/filetypes/font的字體文件擴展名列表。

  2. 比較提交的圖像與所有生成的圖像

我很欣賞你分享一些建議或Python代碼來實現上述兩個步驟。

+0

添加了「圖像處理」標籤。 – tom10 2009-11-10 16:44:26

回答

4

由於OP狀態,有兩個部分(可能還有第三部分):

  1. 使用PIL產生images from fonts

  2. 使用圖像分析工具包,如OpenCV(具有Python綁定)來比較不同的形狀。有多種標準技術可以比較不同的對象以查看它們是否相似。例如,scale invariant moments工作得很好,並且是OpenCv工具包的一部分。

  3. #2中的大多數標準工具都是用來尋找類似但不一定相同的形狀,但對於字體比較而言,這可能不是您想要的,因爲字體之間的差異可以基於非常精細的細節。要進行細節分析,請嘗試比較每個字母周圍路徑的x和y輪廓,當然要進行適當的標準化。 (這一點,或者它的一個更復雜的數學變種,已經使用的字體分析很成功。)

2

我不能提供Python代碼,但這裏有兩種可能的方法。

  1. 「特徵字符」。在人臉識別中,給定大量的規範化人臉圖像訓練集,可以使用主成分分析(PCA)獲得一組「特徵臉」,當訓練臉投影到這個子空間時,這些「特徵臉」表現出最大的方差。輸入測試面相對於特徵臉空間的「座標」可以用作分類的特徵向量。同樣的事情可以用文本字符來完成,即字符'A'的許多版本。

  2. 動態時間扭曲(DTW)。這種技術有時用於手寫字符識別。這個想法是,鉛筆尖(即d/dx,d/dy)所採取的軌跡對於相似的字符而言是相似的。 DTW使單人的寫作實例中的一些變體保持不變。同樣,角色的輪廓可以表示軌跡。該軌跡然後成爲每個字體集的特徵向量。我猜DTW部分對於字體識別來說並不是必要的,因爲機器創建了角色,而不是人類。但是消除空間歧義可能仍然有用。