【OpenCV】利用投影法进行字符分割
1.概述
字符分割有很多方法,但并不是每一种方法是万能的,那么就需要根据自己的需要来分析。例如:我现在项目的需求是将一串编号给切分开来。查了网上的资料和文献,大致适合项目的有两种方法:投影分割法和连通域分割法。当然还有其他的一些改进的算法,今天就不作深入讨论,以后研究了再分享。
2.分析
投影法的原理其实很简单,利用二值化图片的像素的分布直方图进行分析,从而找出相邻字符的分界点进行分割。
上图其实已经看的很明白,投影所反应的就是在垂直方向上数字区域像素个数。接下来我们只需判断投影的每一列,即可找出分割点。
3.实现过程
首先,定义一个数组用来储存每一列像素中白色像素的个数。
int perPixelValue;//每个像素的值int* projectValArry = new int[width];//创建一个用于储存每列白色像素个数的数组memset(projectValArry, 0, width*4);//必须初始化数组
然后,遍历二值化后的图片,将每一列中白色的(也就是数字区域)像素记录在数组中。
//遍历每一列的图像灰度值,查找每一行255的值for (int col = 0; col < width; ++col){for (int row = 0; row < height; ++row){perPixelValue = binImg.at<uchar>(row, col);if (perPixelValue == 255)//如果是黑底白字{projectValArry[col]++;}}}
最后,根据数组里的灰度值画出投影图
/*新建一个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<uchar>(i, j) = perPixelValue;}}/*将直方图的曲线设为黑色*/for (int i = 0; i < width; i++){for (int j = 0; j < projectValArry[i]; j++){perPixelValue = 0; //直方图设置为黑色 verticalProjectionMat.at<uchar>(height - 1 - j, i) = perPixelValue;}}imshow("【投影】",verticalProjectionMat);delete[] projectValArry;//不要忘了删除数组空间
有了投影图做切割就很容易了,其实最主要的就是那个储存灰度值的数组,下面就需要根据这个数组的内容来找到相邻字符间的分割点。
vector<Mat> 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);}}
最后来看下效果图:
4.总结
做图像分割的时候要选择合适的方法,例如我这张样本图的布局是左右型,就适合用垂直投影的方法,反之若是上下型,则做水平投影即可。若图像内的字符是纵横交错的话就需要先垂直投影分割再水平分割,或者采用连通域分割法,取出字符范围。
【OpenCV】利用投影法进行字符分割相关推荐
- 投影法字符分割matlab,利用投影法进行字符分割
1.概述 字符分割有很多方法,但并不是每一种方法是万能的,那么就需要根据自己的需要来分析.例如:我现在项目的需求是将一串编号给切分开来.查了网上的资料和文献,大致适合项目的有两种方法:投影分割法和连通 ...
- python 视觉技术_python+opencv实现机器视觉基础技术(边缘提取,图像滤波,边缘检测算子,投影,车牌字符分割)...
机器视觉是人工智能正在快速发展的一个分支.简单说来,机器视觉就是用机器代替人眼来做测量和判断.它是一项综合技术,包括图像处理.机械工程技术.控制.电光源照明.光学成像.传感器.模拟与数字视频技术.计算 ...
- opencv实现车牌识别之字符分割
简介 在前一篇中,我们已经定位出来了在图片中车牌号的位置,并且将车牌号图片复制成了新图片,并显示出来,本章在这些被截取出来的图片上继续处理. 截取出来的新图片如下: 图像灰阶/二值化 首先也是选择将图 ...
- OpenCV+Python识别车牌和字符分割
本篇文章主要基于python语言和OpenCV库(cv2)进行车牌区域识别和字符分割,开篇之前针对在python中安装opencv的环境这里不做介绍,可以自行安装配置! 车牌号检测需要大致分为四个部分 ...
- opencv利用投影法进行水平切割和垂直切割
水平投影切割 #include<iostream> #include <opencv2/opencv.hpp> using namespace std; using names ...
- python使用垂直投影法进行字符串分割
import cv2 import random import string# 1.读取图像,并把图像转换为灰度图像并显示 img = cv2.imread("D:\\picture\\te ...
- 蓝底白字车牌的定位与字符分割识别matlab仿真
目录 1.算法概述 2.仿真效果 3.MATLAB仿真源码 1.算法概述 车牌识别自然环境下,汽车图像背景复杂.光照不均匀,如何在自然背景中准确地确定车牌区域是整个识别过程的关键.首先对采集到的视频图 ...
- 汽车车牌识别系统实现(三)-- 车牌矫正+字符分割+代码实现
车牌矫正 一.前言 汽车车牌识别设备往往都是固定于红绿灯的支架或者是小区.学校入口的一侧来采集获取车牌图像,由于采集图像设备的安装位置不固定以及不同车辆车牌悬挂的高度也不确定等因素,这些外部因素都有可 ...
- python编程胡牌将是什么意思_OpenCV+Python识别车牌和字符分割的实现
本篇文章主要基于python语言和OpenCV库(cv2)进行车牌区域识别和字符分割,开篇之前针对在python中安装opencv的环境这里不做介绍,可以自行安装配置! 车牌号检测需要大致分为四个部分 ...
最新文章
- 浅谈无人机的应用场景
- Know more about RAC statistics and wait event
- SOAP和HTTP 两种基本传输协议
- 这才是程序员春运抢票的正确姿势!
- json mysql php_PHP MySQL连接表作为JSON
- DL实战(1):tensorflow在mnist上实现siamese net
- ORCAD生成BOM单时不显示元器件封装
- 使用biopython查询NCBI数据库
- ANC主动降噪理论及Matlab代码实现
- 数据时代的大数据思维特征,主要有哪些?
- 震惊!某徐姓诗人竟,,
- 软件工程:浅谈人工智能软件开发与传统软件开发的区别
- 【数据结构】二叉树(Binary Tree)
- ie8不兼容jquery的html,IE8不支持jQuery版本的解决方法
- 描写火车站场景_描写春运火车拥挤的作文_火车站上
- 使用 Cocos Creator 引擎创建3D资产
- 农村产权交易服务平台二次开发html源码
- 翻译考试用计算机作答,2021翻译资格水平考试:CATTI考试时间是多久?考试是上机操作吗?...
- php模拟炒股网站源码,stock 模 拟 炒 股 网 站 源 码(WEB版) WEB(ASP,PHP,...) 251万源代码下载- www.pudn.com...
- じゅうきゅう: ANN
热门文章
- 【硬件】嵌入式板卡硬件电路设计、焊接
- python findall返回值_Python re 模块findall() 函数返回值展现方式解析
- 区块链读书笔记02 - 区块链进阶
- 雨听 | 英语学习笔记(十六)~作文范文:在时尚方面花费太多
- linux双核程序怎么写,Linux检查双核(及多核)CPU信息
- 后端实现上传文件接口,并使用阿里云的oss对象存储
- 峰会实录 | StarRocks存储引擎近期进展与实时分析实践
- 儿童护眼灯哪个品牌比较好?适合儿童、青少年的平价护眼灯
- HBuilder打包tp项目成APP
- 信息系统项目管理师-人力资源管理考点笔记