最近在做图片文字提取的一个项目,这两天有点小进展,与大家分享一下。
//图片文字分割,并将分割得到的图片存储到当前路径#include<opencv2/opencv.hpp>
#include<vector>#define EXPANSION_MULTIPLE 1              //图片的膨胀倍数using namespace std;
using namespace cv;Mat myBinarize(Mat input)            //图像阈值化
{Mat binaryImage,grayImage;            //使用OTSU界定输入图像cvtColor(input, grayImage, CV_BGR2GRAY);threshold(grayImage,binaryImage, 0, 255, THRESH_OTSU);/*int size = (int)(binaryImage.size().);int white = countNonZero(binaryImage);  //计算白像素的数目int black = size - white;  //计算黑像素的数目return white < black ? binaryImage : ~binaryImage;*/imshow("【1、阈值处理结果】", grayImage);return binaryImage;
}Mat delWaterMark(Mat input)                  //去水印以及二值化图片
{Mat gray1, dst, binary, gray2;imshow("【有水印的原图】", input);//void  cvtColor(InputArray src, OutputArray dst, int code, int dstCn = 0);cvtColor(input, gray1, COLOR_RGB2GRAY);        //把原图转换成它的灰度图//double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)threshold(gray1, dst, 40, 255, 4);            //去水印imshow("【去掉水印的图片】", dst);threshold(dst, binary, 0, 255, 0);             //二值化imshow("【二值化的图片】", binary);return binary;
}Mat myDilate(Mat input)       //使用膨胀使图像元素加粗,让所有字符粘在一起,创建连通区域
{Mat kernel = getStructuringElement(MORPH_CROSS,Size(3,3));     //使用3*3交叉内核Mat dilated;dilate(input, dilated, kernel, Point(-1, -1), EXPANSION_MULTIPLE);   //以这个内核为中心膨胀8倍//具体的内核大小和膨胀倍数根据实际情况而定,只要确保所有字符都粘在一起即可imshow("【2、膨胀处理结果】",dilated);return dilated;
}/*
Mat myFindContours(Mat input)                     //传入膨胀之后的图片
{vector<vector<Point>> contours;//第一个参数是膨胀后的图像,第二个参数是用于检测轮廓向量findContours(input, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);    imshow("【3、轮廓图】", input);return input;
}
*/Mat deskewAndCrop(Mat input, const RotatedRect& box)      //提取文本和调整文本倾斜,需读取预期的区域、角度和大小
{double angle = box.angle;       //RotatedRect类型的 box的属性有:size , center , angleSize2f size = box.size;if (angle < -45.0)             //调整框角度{angle += 90.0;          //角度小于45度,意味着文本是垂直对齐的,增加90度的旋转角度,交换宽度与高度属性swap(size.width, size.height);}//根据角度旋转文本,先创建一个描述旋转的二维仿射变换矩阵Mat transform = getRotationMatrix2D(box.center, angle, 1.0);  //参数:旋转中心,旋转角度,1.0表示保持框的原始比例不变Mat rotated;warpAffine(input, rotated, transform, input.size(), INTER_CUBIC);  //旋转函数imshow("【旋转后的图像】",rotated);    //---------------test--------Mat cropped;                                              //裁剪结果//void getRectSubPix(InputArray image, Size patchSize, Point2f center, OutputArray patch, int patchType=-1 )getRectSubPix(rotated, size, box.center, cropped);        //裁剪矩形区域的边界框copyMakeBorder(cropped, cropped, 10, 10, 10, 10,BORDER_CONSTANT,Scalar(0));  //增加图像边界return cropped;
}vector<RotatedRect> findTextAreas(Mat input)
{vector<vector<Point>> contours;                                //轮廓vector<RotatedRect>  area;   //RotatedRect类表示平面上的旋转矩形,有三个属性:矩形中心点(质心)、矩形大小、旋转角度findContours(input, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);  //第一个参数是膨胀后的图像,第二个参数是用于检测轮廓向量imshow("【3、轮廓图】", input);  for (auto contour : contours)              //在区域里遍历{cout << "----------轮廓图中的区域遍历----test—_OK-----" << endl;auto box = minAreaRect(contour);                        //找到他的旋转矩形/*if (box.size.width < 20 || box.size.height < 20)        //丢弃非常小的矩形{continue;}double proportion = box.angle < 45.0 ?box.size.height / box.size.width :box.size.width / box.size.height;if (proportion < 2){continue;}*/area.push_back(box);}imshow("【旋转矩形】", input);cout << "---------容器area的大小----test—OK-----" <<area.size()<<endl;return area;
}int main()
{//加载图像和图像二值化以及膨胀处理Mat src = delWaterMark(imread("1.png"));Mat ticket = myDilate(src);char image_name[25];                //存放图片的输出路径(即用于保存图片的路径)int i = 1;                            //用于命名保存的图片//vector<RotateRect> findTextAreas(Mat input);auto regions = findTextAreas(ticket);            //每一个区域for (auto& region : regions){ cout << "---------进入裁剪----test—OK-----" << endl;//裁剪auto cropped = deskewAndCrop(src, region);//显示imshow("【裁剪的ROI】",cropped);sprintf(image_name, "%s%d%s", ".\\testImage", i++, ".jpg");    //保存的图片名 imwrite(image_name, cropped);                                 //保存图片 }waitKey(0);return 0;
}
执行效果:
原图:
分割得到的部分图片:

OpenCV:图片文字分割相关推荐

  1. python显示竖着的文字_Python+OpenCV竖版古籍文字分割

    在做图片文字分割的时候,常用的方法有两种.一种是投影法,适用于排版工整,字间距行间距比较宽裕的图像:还有一种是用OpenCV的轮廓检测,适用于文字不规则排列的图像. 1. 思路 一开始想偷个懒,直接用 ...

  2. python切割图片文字_Python+opencv 实现图片文字的分割的方法示例

    Python+opencv 实现图片文字的分割的方法示例 发布时间:2020-08-26 03:28:37 来源:脚本之家 阅读:116 作者:坏小孩90 实现步骤: 1.通过水平投影对图形进行水平分 ...

  3. python分割图片数字_python实现图片中文字分割效果

    本文实例为大家分享了python实现图片中文字分割的具体代码,供大家参考,具体内容如下 1.原始图片(包含数字): 结果图: 2.原始图片(包含文字): 结果图: 3.代码如下: import cv2 ...

  4. opencv 文字分割

    看了一些文字分割的代码 原来这么简单. using cpoints = vector<Point>; cv::Mat fore_ground_extract(cv::Mat const & ...

  5. opencv学习笔记9:根据图片颜色分割图像

    根据图片颜色分割图像 程序目的 有一张图片,底色是蓝色的,感兴趣的区域是灰色的,需要对图片按颜色分割. 事实上按颜色分割图片在HSV通道上分割效果要远远优于在BGR通道上分割,如何获取某种颜色的HSV ...

  6. OpenCV for .NET获取图片文字坐标

    使用 OpenCV 在 .NET 中获取图像文字的坐标,需要使用 OpenCV 的文字检测 API. 首先,需要读取图像,然后进行文字检测.接下来,遍历检测到的所有文字,并获取它们的位置信息(通常是以 ...

  7. OpenCV+OCR文字识别

    需配置好OpenCV和OCR环境下运行 1.opencv简介 OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库. OpenCV用C ...

  8. 吴恩达机器学习笔记61-应用实例:图片文字识别(Application Example: Photo OCR)【完结】...

    最后一章内容,主要是OCR的实例,很多都是和经验或者实际应用有关:看完了,总之,善始善终,继续加油!! 一.图像识别(店名识别)的步骤: 图像文字识别应用所作的事是,从一张给定的图片中识别文字.这比从 ...

  9. 用openCV去除文字中乱入的线条

    用openCV去除文字中乱入的线条 原文:http://blog.csdn.net/sinat_28309919/article/details/73604109 目录(?)[+] 今天上午,朋友发来 ...

最新文章

  1. codeforces Palindromic characteristics(hash或者dp)
  2. 为什么cp新的so文件替换老的so,程序会core掉的根本原因是什么?
  3. php密码复杂,不要再强迫我设置复杂密码
  4. Allegro 光绘文件快速导入
  5. webpack来打包你的vue项目,如发现你的vendor.js过大
  6. 吴恩达|机器学习作业8.1.推荐系统(协同过滤算法)
  7. 判断线程池中的线程是否全部执行完毕
  8. 吴恩达机器学习系列23:基于内容的推荐算法
  9. 【OpenGL】OpenGL4.3常用指令目录
  10. Linux 磁带机型号,请教一下,爱华的磁带机型号大全,里面的字母什么意思?
  11. xmpp服务器linux,Prosody搭建xmpp服务器
  12. Ubuntu_搜狗输入法安装
  13. matlab 空集判定,在使用matlab 符号运算中的solve函数时,为啥计算的结果是空集?该怎么办?...
  14. 国家代码查询(Country codes)
  15. turtle库画一个正方形
  16. 常见中文停用词表整理
  17. 理财投资理念黄金法则
  18. 综合型集团该如何利用数字化转型支撑磅礴多元的服务?
  19. 使用 css-transform 实现更好的拖拽功能
  20. 将ACII码转为浮点数

热门文章

  1. 1055 mysql_MySQL错误1055
  2. FCN训练自己数据集(person-segmentation)、SIFT-FLOW、SBD和VOC实验总结
  3. 模仿学习:逆向强化学习(Inverse Reinforcement Learning, IRL)
  4. 模拟10位QQ账号的生成
  5. 谷歌浏览器 Chrome 安装 Tampermonkey 油猴插件的方法
  6. Shell脚本-NF、FS(OFS)、RS(ORS)、NR(FNR)
  7. 在Win10中安装Openfoam
  8. php gd 坐标,【PHP】GD库笔记 初探GD库的坐标
  9. 第07章 文本信息提取
  10. win10 android叹号,win10网络连接感叹号如何解决