記一次圖片中繁體文字轉簡體的嘗試

語言: CN / TW / HK

背景

一個朋友有一批從他人ppt截取的圖片(如上圖),其中的文字均是繁體字,看起來不太順序,想轉換成簡體字,然後我就多了這麼一個需求

第一反應當然是網上搜索類似的解決方案,找了一圈沒有找到完全符合要求,無奈只能自己動手了

説幹就幹

參照之前蒐集的資料,大致有些思路,但也有一些比較難搞的點,沒有現成的方案可以借鑑,初步構思如下:

實現步驟:
1. 進行文字識別,獲取圖片內的文字及其對應座標
2. 逐個判斷文字是否是繁體,如果是,則加入待替換列表
3. 識別文字顏色、大小、以及背景顏色
4. 根據座標區域和背景顏色,覆蓋原有文字區域,即先刪除繁體字
5. 將繁體轉換為簡體,根據座標區域、字體大小和顏色,將簡體字繪製在圖片上
複製代碼

1、OCR識別

這一步最簡單,各大雲服務廠商都有相應的OCR服務,包括有道雲、騰訊雲和華為雲等,這幾家的準確度都差不多,都能識別出圖片內的繁體字並返回段落座標,而有道雲有提供單個字的座標,所以最終選擇了有道雲。

2、繁體字轉換

直接使用現成的庫(zhconv),簡單了事

3、識別字體大小和顏色、以及背景色

A) 字體大小比較好辦,根據字體區域的寬度和字符的個數,即可估算出字體大小

font_size = width/len(text)
複製代碼

B) 字體顏色和背景色計算是最難的環節,本來是想通過顏色值的比例計算出背景色和字體顏色(比例最高的為背景色、其次為字體顏色)。理想很豐滿,但現實很骨感,字體所處區分的背景和文字本身肉眼看上去是純色,但實際上並不是,讀取到的RBG有些許的差異,特別是文字的描邊,RGB值還相差很多,即使通過相近顏色合併,得到的結果值仍然很多,無法找到一個簡單的規則確定使用哪個色值。 經過多次改進仍然無法精確判斷,最後只能無奈放棄,採用簡單暴力的方式實現該步驟:字體色採用固定值,背景色取色值出現比例最高的一個;如果背景色和字體顏色相同,則將字體顏色做一次轉換。

1. 讀取圖片所有像素點色值,並進行相近顏色合併,得到色值及被使用次數
colors = {'FFFFFF': 10000, 'FE00F8': 8456, '000000': 88, ....}
2. 計算字體顏色和背景色
font_color = (0,0,0)
bg_color = 'FFFFFF' #出現次數最多的色值
if font_color == bg_color:
    font_color = (255 - bg_color[0], 255 - bg_color[1], 255 - bg_color[2])
複製代碼

4、清除繁體字

這一步比較暴力,直接使用上一步計算的背景色進行覆蓋,因為原圖片背景色可能會有多種顏色,該方式會導致文字區域的背景色失真。好在實際文字背景彩色的部分較少,出錯的部分佔比不高,最終的結果也在接受範圍之內。

5、繪製簡體字

剩下的事情就沒有什麼難度了,找一個好看的免費字體,根據前面獲取的字體大小和顏色,按座標繪製文字即可,這裏直接用的第三方庫(PIL)

效果對比

原始圖片

轉換後

總結

圖片處理之前接觸的比較少,這次通過借鑑他人的文章、以及查看第三方庫的文檔,對圖片的操作有了更深的理解。雖然轉換後的圖片有些失真和位置錯誤,大體上還是能滿足要求的。這是前期設想的方案沒有完全實現,實在是有些可惜,如果後續時間允許的話,再繼續研究。

完整代碼如下,歡迎大家幫忙指正~~~

github.com/xiaohuege/r…