1.概述

字符分割有很多方法,但并不是每一种方法是万能的,那么就需要根据自己的需要来分析。例如:我现在项目的需求是将一串编号给切分开来。查了网上的资料和文献,大致适合项目的有两种方法:投影分割法和连通域分割法。当然还有其他的一些改进的算法,今天就不作深入讨论,以后研究了再分享。

2.分析

投影法的原理其实很简单,利用二值化图片的像素的分布直方图进行分析,从而找出相邻字符的分界点进行分割。

上图其实已经看的很明白,投影所反应的就是在垂直方向上数字区域像素个数。接下来我们只需判断投影的每一列,即可找出分割点。

3.实现过程

首先,定义一个数组用来储存每一列像素中白色像素的个数。

int perPixelValue;//每个像素的值

int* projectValArry = new int[width];//创建一个用于储存每列白色像素个数的数组

memset(projectValArry, 0, width*4);//必须初始化数组1

2

31

2

3

然后,遍历二值化后的图片,将每一列中白色的(也就是数字区域)像素记录在数组中。

//遍历每一列的图像灰度值,查找每一行255的值

for (int col = 0; col < width; ++col)

{

for (int row = 0; row < height; ++row)

{

perPixelValue = binImg.at(row, col);

if (perPixelValue == 255)//如果是黑底白字

{

projectValArry[col]++;

}

}

}1

2

3

4

5

6

7

8

9

10

11

121

2

3

4

5

6

7

8

9

10

11

12

最后,根据数组里的灰度值画出投影图

/*新建一个Mat用于储存投影直方图并将背景置为白色*/

Mat verticalProjectionMat(height, width, CV_8UC1);

for (int i = 0; i < height; i++)

{

for (int j = 0; j < width; j++)

{

perPixelValue = 255; //背景设置为白色。

verticalProjectionMat.at(i, j) = perPixelValue;

}

}

/*将直方图的曲线设为黑色*/

for (int i = 0; i < width; i++)

{

for (int j = 0; j < projectValArry[i]; j++)

{

perPixelValue = 0; //直方图设置为黑色

verticalProjectionMat.at(height - 1 - j, i) = perPixelValue;

}

}

imshow("【投影】",verticalProjectionMat);

delete[] projectValArry;//不要忘了删除数组空间1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

221

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

有了投影图做切割就很容易了,其实最主要的就是那个储存灰度值的数组,下面就需要根据这个数组的内容来找到相邻字符间的分割点。

vector roiList;//用于储存分割出来的每个字符

int startIndex = 0;//记录进入字符区的索引

int endIndex = 0;//记录进入空白区域的索引

bool inBlock = false;//是否遍历到了字符区内

for (int i = 0; i < srcImg.cols; ++i)

{

if (!inBlock && projectValArry[i] != 0)//进入字符区了

{

inBlock = true;

startIndex = i;

cout << "startIndex is " << startIndex << endl;

}

else if (projectValArry[i] == 0 && inBlock)//进入空白区了

{

endIndex = i;

inBlock = false;

Mat roiImg = srcImg(Range(0,srcImg.rows),Range(startIndex,endIndex+1));

roiList.push_back(roiImg);

}

}1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

201

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

最后来看下效果图:

4.总结

做图像分割的时候要选择合适的方法,例如我这张样本图的布局是左右型,就适合用垂直投影的方法,反之若是上下型,则做水平投影即可。若图像内的字符是纵横交错的话就需要先垂直投影分割再水平分割,或者采用连通域分割法,取出字符范围。

投影法字符分割matlab,利用投影法进行字符分割相关推荐

  1. 用相关法辨识系统的脉冲响应 matlab,利用相关分析法辨识脉冲响应

    利用相关分析法辨识脉冲响应 自1205 刘彬 41251141 1 实验方案设计 1.1 生成输入数据和噪声 用M 序列作为辨识的输入信号,噪声采用标准正态分布的白噪声. 生成白噪声时,首先利用乘同余 ...

  2. matlab 矩阵位移法编程 结构力学,matlab 矩阵位移法编程 结构力学.doc

    matlab 矩阵位移法编程 结构力学.doc 矩阵位移法编程大作业(091210211)一.编制原理本程序的原理是基于结构力学矩阵位移法原理,以结构结点位移作基本未知量,将要分析的结构拆成已知节点力 ...

  3. matlab实现细胞分割,MATLAB图像处理实验——细胞图像的分割和计数

    代码戳这里 1. 实验内容 本实验为使用MATLAB编写的细胞图像分割及计数系统,实现了对图像内细胞的计数,以及对每个细胞周长和面积的测量,并分别展示了分割后的每个细胞的图像. 实验步骤共分为图像预处 ...

  4. matlab利用作图法求圆周率

    MATLAB本身,pi返回值最接近基本常数π的浮点数.要注意,MATLAB中定义的pi与基本常数π之间的微小差异会导致计算结果出现微小的误差. 例如,表达式sin(pi)(期望返回0)实际上在MATL ...

  5. matlab 矩阵位移法编程 结构力学,matlab 矩阵位移法编程 结构力学

    矩阵位移法编程大作业 (091210211) 一.编制原理 本程序的原理是基于结构力学矩阵位移法原理,以结构结点位移作基本未知量,将要分析的结构拆成已知节点力-结点力位移关系的单跨梁集合,通过强令结构 ...

  6. matlab实现进退法、0.618法、牛顿法

    文章目录 实验一 一维最优化方法 实验目的及要求: 实验原理: 算法1:进退法 算法2:0.618法 算法3:牛顿法 实验内容(方法和步骤) 例题 题目1 编写程序实现进退法. 题目2 利用进退法求解 ...

  7. 肺实质分割matlab实现

    肺实质分割matlab实现 前言 一.阈值分割 二.提取人体部分 三.提取疑似肺质 四.去除非肺质 五.最终输出肺质图 完整代码 前言 最近有个课程作业,肺实质分割,找了很多代码,大部分都不能用,最后 ...

  8. 视频分割全面探究:从视频物体分割到视频全景分割

    前言 图像分割大家可能都耳熟能详,近年来,图像分割的研究已经取得了显著成果,而视频分割的研究仍在起步阶段. 视频分割由简到繁可分为三类:视频物体分割.视频语义分割和视频全景分割.视频物体分割是指从视频 ...

  9. 文本分割之垂直投影法基于OpenCV(python)的实现

    在我的上一篇博客中讲述了水平投影法取出文本行图像的实现,在这里将用垂直投影法对文本行的每个字符进行分割.下图是用水平投影法切割的文本行: 文本分割的原理如下,先用水平投影取出单一文本行,接着使用垂直投 ...

最新文章

  1. 人工智能为什么用python_使用python实现人工智能的优势
  2. Windows 8.1安装.net 3.5功能
  3. 字典创建列表的2种方法,作业
  4. 开发日记-20190424 关键词 阶段性开发心得和小结
  5. mybatis中的智能标签之二
  6. java 创建uri_使用UriBuilder快速创建URI
  7. asp Upload
  8. Elasticsearch的Watcher插件
  9. excel打开csv乱码解决------------为什么pycharm里面csv不乱码,excel里面却乱码了
  10. Win11、Linux 双系统安装方法
  11. jeDate日期控件 时间最大值最小值禁用的bug修改
  12. [异步图书].Python机器学习:预测分析核心算法.pdf
  13. Android开发环境的安装与配置(两种方法)
  14. mysql proxy maxscale_maxscale参数配置
  15. 【比赛回顾】广工大2020级年ACM第一次月赛——Dio的面包工坊
  16. 拓嘉启远:定制类的商品如何处理退款
  17. Excel批量合并相同内容单元格操作——WPS太秀了
  18. m计算机基本拓扑结构,计算机网络的拓扑结构
  19. MySQL数据库卸载+MySQL常用的图形化管理工具介绍
  20. mysql where not in_mysql查询条件not in 和 in的区别及原因说明

热门文章

  1. PPT模板免费下载制作
  2. pandas 获取Dataframe元素值的几种方法
  3. 华山论剑闲谈iOS中闪光灯的使用
  4. CTFshow——web入门——sql注入
  5. echarts添加背景图
  6. 小米路由器3c 虚拟服务器,小米路由器3C,怎么刷breed啊?可以吗
  7. 微信小程序-创建自己的小程序帐号
  8. ubuntu下安装网易云音乐
  9. 摄像机产生“拖影”、“重影”的原因
  10. iOS 微信分享,返回自己的app 闪退