OpenCV:字符分割——方向投影法
常见字符分割方法:方向投影分割法和连通域分割法
1. 方向投影法
方向投影法主要思想就是记录每一行或者每一列对应值的像素的个数,然后根据这些个数判断它是不是边界或者是目标物体。其中像素的个数就像是一个阈值,最后可以把每一行点的个数画出来便于直观的观察。
投影法的就是,利用二值化图像素分布直方图进行分析,从而找出相邻字符的分界点进行分割。
以竖直方向投影分割字符为例,程序如下:
#include<opencv2/opencv.hpp>
#include<iostream>
#pragma comment(lib,"opencv_world341.lib")
using namespace std;
using namespace cv;int vertical_projection(const Mat& src, vector<Mat>& roiList)
{//step1. 计算竖直投影白色点数量int w = src.cols;int h = src.rows;vector<int> project_val_arry;int per_pixel_value;for (int j=0;j<w;j++)//列{//int num = 0;//for (int i=0;i<h;i++)//行//{// per_pixel_value = src.ptr<unsigned char>(i)[j];// if (per_pixel_value == 255)// num++;//}Mat j_im = src.col(j);int num = countNonZero(j_im);project_val_arry.push_back(num);}//显示if (1){Mat hist_im(h, w, CV_8UC1, Scalar(255));for (int i = 0; i < w; i++){for (int j = 0; j < project_val_arry[i]; j++){hist_im.ptr<unsigned char>(h - 1 - j)[i] = 0;}}imshow("project", hist_im);waitKey();}//step2. 字符分割//vector<Mat> roiList;int startIndex = 0;int endIndex = 0;bool inBlock = false;//是否遍历到了字符区内for (int i = 0; i < w; ++i){if (!inBlock && project_val_arry[i] != 0)//进入字符区了{inBlock = true;startIndex = i;//cout << "startIndex is " << startIndex << endl;}else if (project_val_arry[i] == 0 && inBlock)//进入空白区了{endIndex = i;inBlock = false;Mat roiImg = src(Rect(startIndex,0,endIndex+1-startIndex,h));roiList.push_back(roiImg);}}return 0;
}int main()
{Mat src = imread("ocr.bmp",0);Mat bin;threshold(src, bin, 60, 255, CV_THRESH_OTSU);imshow("src", src);imshow("bin", bin);waitKey();vector<Mat> char_im_vec;vertical_projection(bin, char_im_vec);for (int i=0;i<char_im_vec.size();i++){string win_name = "roi" + to_string(i);imshow(win_name, char_im_vec[i]);}waitKey();return 0;
}
2.连通域分割法
连通域分割法就是计算boundingRect,通过一些条件判断是否是字符区域,宽高比,面积,矩形度等。
参考文章:
1. https://blog.csdn.net/wx7788250/article/details/60139109
2. https://blog.csdn.net/dieju8330/article/details/82631514
3.https://blog.csdn.net/nienelong3319/article/details/81546237
4.https://blog.csdn.net/mangobar/article/details/80286059?utm_source=blogxgwz0
OpenCV:字符分割——方向投影法相关推荐
- python字符分割垂直投影法_Python实现投影法分割图像示例(一)
Python实现投影法分割图像示例(一) 发布时间:2020-01-26 21:14 来源:互联网 当前栏目:web技术类 投影法多用于图像的阈值分割.闲话不多说,现用Python实现. 上代码. i ...
- opencv实现字符分割
opencv字符分割流程是:1.图像单通道化,2.图像二值化:3.获取图像中的轮廓:4.实现分割. 代码如下: void SegmentChar(const string strPic) {Mat i ...
- 【OpenCV】利用投影法进行字符分割
1.概述 字符分割有很多方法,但并不是每一种方法是万能的,那么就需要根据自己的需要来分析.例如:我现在项目的需求是将一串编号给切分开来.查了网上的资料和文献,大致适合项目的有两种方法:投影分割法和连通 ...
- python 视觉技术_python+opencv实现机器视觉基础技术(边缘提取,图像滤波,边缘检测算子,投影,车牌字符分割)...
机器视觉是人工智能正在快速发展的一个分支.简单说来,机器视觉就是用机器代替人眼来做测量和判断.它是一项综合技术,包括图像处理.机械工程技术.控制.电光源照明.光学成像.传感器.模拟与数字视频技术.计算 ...
- 投影法字符分割matlab,利用投影法进行字符分割
1.概述 字符分割有很多方法,但并不是每一种方法是万能的,那么就需要根据自己的需要来分析.例如:我现在项目的需求是将一串编号给切分开来.查了网上的资料和文献,大致适合项目的有两种方法:投影分割法和连通 ...
- 【图像分割】基于投影法实现扫描文件的光学字符分割(文字分割)Matlab代码
1 简介 文档图像是以像素形式存贮的, 很难直接操纵 其中的文本内容, 为了识别单个汉字, 必须进行文档 图像分割.本文基于中文文档图像的特征, 提出 了一种基于投影法的文档图像分割算法,,从文档图 ...
- 文本分割之垂直投影法基于OpenCV(python)的实现
在我的上一篇博客中讲述了水平投影法取出文本行图像的实现,在这里将用垂直投影法对文本行的每个字符进行分割.下图是用水平投影法切割的文本行: 文本分割的原理如下,先用水平投影取出单一文本行,接着使用垂直投 ...
- 文本分割之水平投影法基于OpenCV(python)版实现
对于如下一张图片,如何将文本区域分割成一行一行的了? 在文本分割领域中有一种很优秀的算法:投影法,包括水平投影法和垂直投影法.本文主要讲述水平投影法,水平投影法可以理解为一束光线从图像的左侧向右边进行 ...
- python圈出车牌字符_Python+OpenCV实现车牌字符分割和识别
最近做一个车牌识别项目,入门级别的,十分简单. 车牌识别总体分成两个大的步骤: 一.车牌定位:从照片中圈出车牌 二.车牌字符识别 这里只说第二个步骤,字符识别包括两个步骤: 1.图像处理 原本的图像每 ...
最新文章
- 2_Selenium对象识别
- 持续集成(三):最佳实践
- 90后斯坦福博士论文登Science封面!AI算法准确预测RNA三维结构
- unused function warning message(转)
- IE兼容模式下 SCRIPT1028: 缺少标识符、字符串或数字
- Service Mesh 实践指南:从单体应用到 Service Mesh 的曲折历程
- 【思维导图】Python中常用的8种字符串操作
- [Linux]控制语句If case
- spring 整合mongodb报NoSuchMethodError错误
- 美团深度学习系统的工程实践
- python re模块详解_python与正则表达式:re模块详解
- 罗永浩重新定义直播带货
- 第十三届蓝桥杯大赛个人赛全国总决赛准考证开放下载
- 如何查看对方的QQ登录是IP地址的方法
- 分节符的插入与删除word
- 服务器命令里面怎么删除文件,scp删除服务器文件命令
- 脱壳_00_压缩壳_ASPACK
- 一文看懂互联网支付系统架构
- linux 代码格式化工具下载,Linux 代码格式化工具 indent
- SDRAM中数据掩码的作用(DQM)