中國知網(wǎng)(CNKI <http://www.cnki.net/>
)是最重要的中文學(xué)術(shù)資源數(shù)據(jù)庫,收錄絕大多數(shù)中文學(xué)術(shù)刊物。我們可以檢索論文,也可以導(dǎo)出檢索結(jié)果前6000條論文的題錄數(shù)據(jù)。
在CNKI檢索結(jié)果翻頁10次以上,用戶需要手動(dòng)輸入驗(yàn)證碼才能繼續(xù)。為了實(shí)現(xiàn)自動(dòng)化題錄數(shù)據(jù)導(dǎo)出,我們就需要通過程序識(shí)別驗(yàn)證碼。最終,基于Eugu.CV實(shí)現(xiàn)驗(yàn)證碼識(shí)別,正確率在70%以上,能保證自動(dòng)化導(dǎo)出過程的連貫。
CNKI驗(yàn)證碼識(shí)別主要分為四個(gè)步驟:
1 去掉灰色干擾線
2 去掉干擾點(diǎn)
3 二值化
4 基于Tesseract識(shí)別?
?CNKI驗(yàn)證碼是長這個(gè)樣子。
首先,要去掉驗(yàn)證碼圖片的灰色干擾線,如圖:
去掉干擾線的思路:干擾線都是灰色,而灰色的RGB三色的值相對(duì)來說都比較大,所以將RGB三色值均大于150的點(diǎn)的顏色設(shè)置成白色。代碼如下:
Bitmap bmp = (Bitmap)Image.FromFile(imagePath); for (int i = 0; i <
bmp.Width; i++) { for (int j = 0; j < bmp.Height; j++) { Color color =
bmp.GetPixel(i, j);int threshold = 150; if (color.R > threshold && color.G >
threshold && color.B > threshold) { Color newColor = Color.FromArgb(255, 255,
255); bmp.SetPixel(i, j, newColor); } } }
然后,去掉干擾點(diǎn),如圖:
去掉干擾點(diǎn)的思路很簡單,遍歷每個(gè)點(diǎn),如果它上下左右8個(gè)鄰居點(diǎn),有6個(gè)以上是白色的點(diǎn),就把這個(gè)點(diǎn)也設(shè)置成白色。
for (int i = 0; i < bmp.Width; i++) { for (int j = 0; j < bmp.Height; j++) {
var colorList = GetColorList(bmp, i, j); var count = colorList.Count(x => x.R ==
255 && x.G == 255 && x.B == 255); if (count >= 6) { bmp.SetPixel(i, j,
Color.FromArgb(255, 255, 255)); } } }
圖片識(shí)別前需要二值化,也就是把圖片變成黑白兩色,即把所有的點(diǎn)都變成黑色。
Eugu.CV提供了二值化的方法。
var gray = new Image<Gray, Byte>(bmp); var image = gray.CopyBlank();
CvInvoke.Threshold(gray, image,120, 255, ThresholdType.Triangle);
最后,就是用Eugu.CV集成的Tesseract-OCR識(shí)別二值化圖片。
Tesseract是非常強(qiáng)大的OCR開源庫,Eumu.CV集成了Tesseract 4.0,可以用lstm識(shí)別模式提供識(shí)別效率。
Emgu.CV.OCR.Tesseract ocr = new Emgu.CV.OCR.Tesseract(path, "eng",
Emgu.CV.OCR.OcrEngineMode.LstmOnly, whitelist,true);
ocr.PageSegMode = Emgu.CV.OCR.PageSegMode.SingleLine;
var gray = new Image<Gray, Byte>(image);
ocr.SetImage(gray);
if (ocr.Recognize() != 0) throw new Exception("Failed to recognizer image");
var list = ocr.GetCharacters().Select(x => x.Text); textBox.Text = string.Join(
"", list);
?
如果你對(duì)識(shí)別結(jié)果的精確度不夠滿意,還可以通過Tesseract自己訓(xùn)練提高識(shí)別精度。
熱門工具 換一換