Android文字图像识别并翻译的简单实现
本文是對圖像文字識別的簡單實現所做,并沒有深入研究。本程序所實現的app對楷體字識別最有效。例如要識別在一張白紙上的“中國”二個楷體黑字,使用手機攝像頭先進行掃描識別,然后自動翻譯為“China”,再將“中國”和“China”顯示到屏幕上,本文主要研究如何實現這個系統框架。
本文地址:http://blog.csdn.net/yang786654260/article/category/5710631
程序源碼下載地址:本代碼年代久遠, 而且學生時代的代碼水平很糟糕,就不分享了,大意就是用zxing來拿圖識字。
工作流程
流程描述:
環境光亮的情況下,經過攝像頭掃描固定矩形區域圖像,這樣可以避免讓手機對圖像做截圖處理,通過zxing輔助包在避免內存溢出的情況下獲取到文字區域圖像,進而對圖像進行灰度化、去噪、二值化,如果判斷黑色值像素數多于白色值像素度則進行反色處理,最后對圖像切分提取特征值,將特征值傳入谷歌ocr文字識別輔助包對谷歌識別庫進行檢索,查出相似值后,再通過輔助包提取識別庫中的文字。本文為了減少Android系統的cpu使用度,將翻譯交給了百度服務器處理,把提取到的文字上傳到百度服務器,之后再服務器上翻譯并返回結果。
使用的第三方庫
- zxing
- 谷歌ocr(tesseract ocr)
界面展示
主界面:
掃描界面:
說說幾個圖像處理算法
灰度化本文采取的是浮點算法,實現代碼如下
private static Bitmap getGrayImg() {int alpha = 0xFF << 24; //設置透明度for (int i = 0; i < imgTheHeight; i++) {for (int j = 0; j < imgTheWidth; j++) { //獲得第i行第j個的像素點int grey = imgThePixels[imgTheWidth * i + j]; int red = ((grey & 0x00FF0000) >> 16); //獲取紅色灰度值int green = ((grey & 0x0000FF00) >> 8); //獲取綠色灰度值int blue = (grey & 0x000000FF); //獲取藍色灰度值 //浮點算法獲取灰度化色值grey = (int) ((float) red * 0.3 + (float) green * 0.59 + (float) blue * 0.11); grey = alpha | (grey << 16) | (grey << 8) | grey; //添加透明度imgThePixels[imgTheWidth * i + j] = grey; //更改像素色值} Bitmap result = Bitmap.createBitmap(imgTheWidth, imgTheHeight, Config.RGB_565); result.setPixels(imgThePixels, 0, imgTheWidth, 0, 0, imgTheWidth, imgTheHeight);return result;} 方法 setPixels(int[] pixels, int offset, int STiRe, int xxx, int yyy, int theWidth, int theHeight)為設置位圖像素點灰度值,參數如下:參數 pixels 寫入位圖的顏色數組;參數 offset 寫入的第一個顏色索引;參數 STiRe 行寬;參數 xxx寫入位圖的第一個像素的x坐標;參數 yyy寫入位圖的 第一個像素的y坐標;參數 theWidth一行的像素數量;參數theHeight寫入的行數。圖像去除噪點本文使用的算法是取區域像素中值的方法進行去噪
本文中采取的是3 乘以 3的表格區域取中值的方法,如上表所示,pix[0~8]是一個一維的像素值序列,中心點為pix[4]。這個算法最簡便的方法是把這9個像素進行排序,然后取中間值,再存入pix[4]即中心點。實現代碼如下:
二值化處理
大律法
private static int getOtsuHresholdValue(int minOwnGrayValue, int maxOwnGrayValue) {int T = 0;double U = 0, U0 = 0, U1 = 0;double G = 0;for (int i = minOwnGrayValue; i <= maxOwnGrayValue; i++) {double s = 0, l = 0, cs = 0, cl = 0;for (int j = 0; j < imgTheHeight - 1; j++) {for (int k = 0; k < imgTheWidth - 1; k++) {int gray = imgThePixels[J * imgTheWidth + k];if (gray < i) {s += gray;cs++;}if (gray > i) {l += gray;cl++;}}}U0 = s / cs;U1 = l / cl;U = (s + l) / (cs + cl);double g = (cs / (cs + cl)) * (U0 - U) * (U0 - U)+ (cl / (cl + cs)) * (U1 - U) * (U1 - U);if (g > G) {T = i;G = g;}}return T; }迭代法
首先需要獲得中值: T = (maxGrayValue + minGrayValue) / 2; 公式(2-5) maxGrayValue指的是最大灰度值;minGrayValue指的是最小灰度值。 將T視為閾值,大于T的為目標部分,小于T的為背景部分。再分別獲取目標和背景的像素色值平均值T1和T2,獲取新的閾值(T1+T2)/2;將新的閾值賦值給T重復獲取新閾值,直到兩個閾值一樣而且連續的時候,將該閾值視為最終獲取的閾值。實現代碼如下: private static int getIterationHresholdValue(int minGrayValue,int maxGrayValue) {int T1;int T2 = (maxGrayValue + minGrayValue) / 2;do {T1 = T2;double s = 0, l = 0, cs = 0, cl = 0;for (int i = 0; i < imgTheHeight; i++) {for (int j = 0; j < imgTheWidth; j++) {int gray = imgThePixels[I * imgTheWidth + j];if (gray < T1){s += gray;cs++;}if (gray > T1) {l += gray;cl++;}}}T2 = (int) (s / cs + l / cl) / 2;} while (T1 != T2);return T1; }反色處理
nt pixel = 0;for (int i = 0; i < imgTheHeight; i++) {for (int j = 0; j < imgTheWidth; j++) {pixel = (imgThePixels[i*imgTheWidth + j] > T) ? (imgThePixels[i*imgTheWidth + j] = 0): (imgThePixels[i*imgTheWidth + j] = 255);}} Bitmap result= Bitmap.createBitmap(imgTheWidth,imgTheHeight, Config.RGB_565); result.setPixels(imgThePixels, 0, imgTheWidth, 0, 0, imgTheWidth, imgTheHeight);Android端的一些實現
獲取聯網狀態
public boolean isNetworkConnected(Context context) { if (context != null) { ConnectivityManager mConnectivityManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo(); if (mNetworkInfo != null) return mNetworkInfo.isAvailable(); } return false; } //返回true則正在聯網狀態中,返回false則處于斷網的狀態下,這時要提示用戶連接網絡。使用百度翻譯
public static final String BAIDU_LINK = "http://openapi.baidu.com/public/2.0/bmt/translate?"; //具體請自行百度總結
本app完全走了捷徑,用了前人已有的項目做了些修改并使用,因為對這些并沒有透徹的研究,所以,嗯哼,只能這個效果了。以后有研究的話,再探討。
程序源碼下載地址:本代碼年代久遠, 而且學生時代的代碼水平很糟糕,就不分享了,大意就是用zxing來拿圖識字。
總結
以上是生活随笔為你收集整理的Android文字图像识别并翻译的简单实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CS144 lab0 笔记
- 下一篇: [机器学习笔记]Note6--神经网络: