各位朋友大家好,我是CPP课题组的视觉工程师。这个系列的文章主要介绍计算机视觉尤其是OCR在经济类课题数据采集中的应用以及其实现方法。既是小教程又是学习笔记。
OCR(Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)用字符识别方法将形状翻译成计算机文字的过程。过程包括预处理—特征提取—分类—后期处理四个重要的环节。过程根据需求和采取的技术路线不同也会有不同。
CPP课题组的数据大量通过爬虫获得,爬取到的文字信息经过数据清洗之后可以利用。但爬取到的图片信息,如果不经过OCR就难以加以利用。例如下面图片中的信息:
环境配置:VisualStudio2015&OpenCV3.1.0
Microsoft Visual Studio(简称VS)是微软的开发工具包系列产品。VS是一个基本完整的开发工具集,它包括了整个软件开发过程中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。OpenCV的全称是:Open Source Computer Vision Library。OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。
它轻量级而且高效——由一系列 C 函数和少量 C 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。VS和OpenCV大家也可以尝试最新的版本,我这里是为了和队友的版本保持一致,所以没有升级。首先安装VS,安装镜像文件可以从官网上找到,社区免费版已经足够用了。OpenCV相关配置,在网上可以很方便地找到教程,就麻烦大家自己动下手了,我只在这里特别提醒几点。
1. 使用镜像安装。未安装虚拟镜像则须下载再安装。安装时无需联网,速度较快。
2. OpenCV解压之后全项目组组统一解压路径,方便代码和工程项目互相转移。
3. 为了保证和他人写的代码兼容,在包含目录中多包含几个。
4. 配置时使用属性表,将属性表保存到方便找的路径。之后新建工程只需要载入已有属性表,无需再次配置。
5. 配置debugx64的属性表,并选择x64.
6. 安装和配置真的会花很长很长很长时间,请有耐心(^.^)
熟悉操作
//在工程目录下储存文件名为"1.jpg"的图像。#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <cstdio> #include <iostream>using namespace cv; using namespace std;
int main(int argc, char* argv[]) {
Mat img = imread("1.jpg");
if(!img.data) {
cout << "no file";
return 0;
}
imshow("Original", img); //show the original image
waitKey(20000);
return 0; }
以上代码实现了读入图片并显示的简单的功能。
颜色空间
在图像显示中,最常用的颜色空间是RGB模型,显示原理非常容易被理解。而HSV模型,是进行图像分析时常用的颜色空间。RGB就是:红(Red)、绿(Green)、蓝(Blue)三种色光原色,是图像显示最直接的色彩表示方法。但RGB虽然表示直接,但是R、G、B数值和色彩的三属性没有直接的联系,不能揭示色彩之间的关系。所以在进行图像识别时,RGB模型就不是那么合适了。
HSV是指Hue(色相)、Saturation(饱和度)和Value(值)。
色调H用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°。
饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。
明度V表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。RGB和CMY颜色模型都是面向硬件的,而HSV颜色模型是面向用户的。在进行颜色判定时,只需查HSV模型的颜色范围表就可以。
Mat imgHSV;cvtColor(img, imgHSV, COLOR_BGR2HSV);
填入参数CV_RGB2GRAY是RGB到灰度图像。
预处理:阀值化、滤波、图形学
阀值化处理图像方便进行进一步处理。参照蓝色的颜色范围进行阀值化处理。
int bLowH = 100;
int bHighH = 124;
int bLowS = 45;
int bHighS = 255;
int bLowV = 45;
int bHighV = 255;
Mat blue_imgThresholded;inRange(imgHSV, Scalar(bLowH, bLowS, bLowV), Scalar(bHighH, bHighS, bHighV), blue_imgThresholded); //阀值化处理图像
常用的滤波操作有中值滤波、均值滤波、双边滤波、高斯滤波等等。中值滤波和均值,滤波都会在不同程度上带来一些问题。在实际操作中,更多用到的是双边和高斯滤波。这里使用高斯滤波再阀值化来看一下效果。
Mat imgHSV, gauHSV;
Mat gau;
GaussianBlur(img, gau, Size(7, 7), 0, 0);//高斯滤波
cvtColor(img, imgHSV, COLOR_BGR2HSV);
cvtColor(gau, gauHSV, COLOR_BGR2HSV);
int bLowH = 100;
int bHighH = 124;
int bLowS = 45;
int bHighS = 255;
int bLowV = 45;
int bHighV = 255;
Mat blue_imgThresholded, gau_imgThresholded;inRange(imgHSV, Scalar(bLowH, bLowS, bLowV), Scalar(bHighH, bHighS, bHighV), blue_imgThresholded); //Threshold the image
inRange(gauHSV, Scalar(bLowH, bLowS, bLowV), Scalar(bHighH, bHighS, bHighV), gau_imgThresholded); //Threshold the image
imshow("Original", img); //show the original image
imshow("gau", gau); //show the original image
imshow("blue_imgThresholded", blue_imgThresholded); //show the original image imshow("gau_imgThresholded", gau_imgThresholded); //show the original image
这里要注意一下处理顺序。先对原图进行高斯滤波再转化为HSV图像。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。这样可以有效地去除一些噪点,突出需要处理的部分。
图形学操作指腐蚀,膨胀,开操作,闭操作。从图像处理角度看,二值图像的腐蚀和膨胀就是将一个小型二值图,在一个大的二值图上逐点移动并进行“与”“或”逻辑运算,根据运算结果确定中心点的像素结果。膨胀是“或”运算,腐蚀是“与”运算。开操作是先腐蚀再膨胀,一般使对象的轮廓变得光滑,断开狭窄的间断和消除细的突出物。闭操作是膨胀再腐蚀可使轮廓线更光滑,但与开操作相反的是,闭操作通常消弥狭窄的间断和长细的鸿沟,消除小的空洞,并填补轮廓线中的断裂。
Mat element = getStructuringElement(MORPH_RECT, Size(4, 4));
Mat element2 = getStructuringElement(MORPH_RECT, Size(4, 4));
Mat imgDilate, imgErode, imgOpen, imgClose;
dilate(blue_imgThresholded, imgDilate, element2);//膨胀erode(blue_imgThresholded, imgErode, element2);//腐蚀morphologyEx(blue_imgThresholded, imgOpen, MORPH_OPEN, element);//开操作
morphologyEx(blue_imgThresholded, imgClose, MORPH_CLOSE, element);//闭操作
关于图形学的操作,在机械工业出版社的《计算机视觉》(2005.3)一书中的习题3.8介绍了齿轮检查的方法。不好意思版本有点旧,这里也不能整体搬运。有兴趣的朋友可以阅读一下相关的内容。后面有机会我复现一下相关操作再给大家介绍一下。
~关于OCR的内容后面还会持续更新~
~笔者水平有限~
文案/主堕妖
排版/芷若
China's Prices Project
微信号:XMUCPP2016
项目专栏:China's Prices Project- 知乎专栏
联系邮箱(项目负责人iGuo):
zhangguocpp@163.com