对于数字图像识别,其实有很多方法,例如模板匹配、神经网络、支持向量机等。但是,在这里我们处理的情况比较简单,主要体现在如下两点:(1)场景简单,是白底黑字;(2)具有明显可利用的特点,这个对于数字识别很重要。其实,在matlab中就有一个OCR的函数可以识别数字、标点和英文字母,但是,该算法对于数字比较密集的情况下,识别能力有限。
现在简介一下我的识别程序处理的场景,如下图测试图像所示,我们处理的是白底黑字、字符大小一样的密集的图像。在这里首先想到的是将数字分割出来,通过观察我们发现具有如下特点:(1)行与行之间的间隔比较明显,可以轻松分割出各个行;(2)列与列之间的间隔可以大于字符之间的间隔;(3)在同一个数字中,每隔3个进位会产生一个比较大的间隔,但是,仍然小于列之间的间隔。
根据上述特点,整理出如下的思路来实现数字识别:
(1)对图像中的数字按行列进行分割,以获取每一个数字;
(2)通过构造自适应构造模板进行模板匹配,实现数字图像分类。尽管这个思路是如此的简单,但是,在该场景中,仍然可以获得很好的识别效果。
先看测试图像和识别结果如下:
测试图像:
输出结果:
Outputs =
Columns 1 through 9
'133.133.133.252' '40756' '36.110.219.248' '80' '4' '532' '2' '420' '2'
'133.133.133.252' '54147' '36.110.219.248' '80' '13' '1888' '7' '1156' '6'
'127.0.0.1' '33293' '127.0.0.1' '6477' '2' '132' '1' '76' '1'
Columns 10 through 11
'112' '1.025877000'
'732' '1.030972000'
'56' '2.002403000'
代码如下:
(1)主程序部分如下(其中Font_10.png在后面):
close all;
clear all;
clc;
filepath = mfilename('fullpath');
filename = mfilename();
jarfilepath = filepath(1:end-length(filename));
javaaddpath(fullfile(jarfilepath,'SimpleCaptureScreen.jar'));
ScreenCapture = javaObjectEDT('com.huawei.ScreenCapture.SimpleCaptureScreen');
ScreenCapture.MainCaptureScreen;
Img = imread('MyCaptureScreen.png');
TemplateImg = imread('Font_10.png');
Font = 10;
Scale = 4; % 原始图像放大倍数
% 创建模板
[Templat