垂直投影上的切割

  1. 首先我选择车牌号作为投影的图片,可以作为车牌切割的技术。
  2. 原理:车牌处理好后,用数组存储所有像素值,然后在x轴上遍历每一列的像素值并累加,最总所投影的效果将以投影图的形式呈现,投影图的波峰波谷的差距就是每列累加的像素值的差距。
  3. 如果把这项技术作为车牌字符切割的技术,那么每列像素的累加值就是用来判断字符区与空白区的依据。
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;
vector<Mat> verticalProjectionMat(Mat Image)//垂直投影
{int perPixelValue;//每个像素的值  int width = Image.cols;int height = Image.rows;printf("图片的宽%d图片的高%d", width, height);int* projectValArry = new int[width];//创建用于储存每列白色像素个数的数组  memset(projectValArry, 0, width * 4);//初始化数组  for (int col = 0; col < width; col++)//列  {for (int row = 0; row < height; row++)//行  {perPixelValue = Image.at<uchar>(row, col);//每个像素的值//if (perPixelValue == 0)//如果是白底黑字  if (perPixelValue == 255)//如果是黑底白字{projectValArry[col]++;//列上的叠加}}}Mat verticalProjectionMat(height, width, CV_8U, Scalar(255));//垂直投影的画布  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);//以上是如何让这个画布形成的呢Rect rect(0, 0, 356, 90);Mat image_cut = Mat(verticalProjectionMat, rect);Mat image_copy = image_cut.clone();imshow("切割图片", image_copy);vector<Mat> roiList;//用于储存分割出来的每个字符  int startIndex = 0;//记录进入字符区的索引  int endIndex = 0;//记录进入空白区域的索引  bool inBlock = false;//是否遍历到了字符区内  for (int i = 0; i < Image.cols; i++)//cols=width  {if (!inBlock && projectValArry[i] != 0)//进入字符区  {inBlock = true;startIndex = i;}else if (projectValArry[i] == 0 && inBlock)//进入空白区  {endIndex = i;inBlock = false;Mat roiImg = Image(Range(0, Image.rows), Range(startIndex, endIndex + 1));roiList.push_back(roiImg);}}delete[] projectValArry;return roiList;
}int main()
{Mat Image = imread("D://OPENCV//实践小程序//pictures//image//00A.jpg");imshow("原图", Image);Mat Image1;cvtColor(Image, Image1, CV_BGR2GRAY);imshow("灰度化", Image1);Mat Image2;threshold(Image1, Image2, 100, 255, CV_THRESH_BINARY);//二值化imshow("二值化", Image2);Mat Image3;Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));morphologyEx(Image2, Image3, MORPH_OPEN, element);//开运算imshow("开运算", Image3);char szName[30] = { 0 };vector<Mat> b = verticalProjectionMat(Image3);//先进行垂直投影 ,并切割/*for (int j = 0; j <b.size(); j++){sprintf(szName, "vertical_%d.jpg", j);imshow(szName, b[j]);}*/waitKey(0);return 0;
}

(一)效果图
1、原始高度是118,切割高度是102

2、切割高度是90

3、上面所展现的切割图片就是理想中要达到的波谷,作为字符切割的分界区,但是光凭这张切割图片并不可行,但是以下所讲的可达到与此同等的目的。

(二)寻找波谷

改变红框中的临界条件就可以定义理想的波谷

当临界条件是每列的像素累加值为18时,效果图如下

(三)总结
通过垂直投影进行字符切割的要点是寻找字符间隔的准确波谷,本次实验中带部首的汉字由于汉字中间出现较低波谷切割不准确。这种方法中如果字符间隔的波谷不具有一致性,或者车牌图像前期处理不够细致也很难切割准确。

车牌识别之字符切割2相关推荐

  1. opencv实现车牌识别之字符分割

    简介 在前一篇中,我们已经定位出来了在图片中车牌号的位置,并且将车牌号图片复制成了新图片,并显示出来,本章在这些被截取出来的图片上继续处理. 截取出来的新图片如下: 图像灰阶/二值化 首先也是选择将图 ...

  2. 寻找连通域算法_【车牌识别算法】

    车牌识别技术要求能够将运动中的汽车牌照从复杂背景中提取并识别出来,通过车牌提取.图像预处理.特征提取.车牌字符识别等技术,识别车辆牌号.颜色等信息. 目前车牌识别技术主要分为端到端识别与车牌分割识别两 ...

  3. otsu算法_【车牌识别算法】

    车牌识别技术要求能够将运动中的汽车牌照从复杂背景中提取并识别出来,通过车牌提取.图像预处理.特征提取.车牌字符识别等技术,识别车辆牌号.颜色等信息. 目前车牌识别技术主要分为端到端识别与车牌分割识别两 ...

  4. 基于Matlab模板匹配方法的车牌识别系统设计

    本系统针对家庭小型车蓝底白字车牌进行识别 背景 近年来,随着交通现代化的发展要求,汽车牌照自动识别技术已经越来越受到人们的重视.车牌自动识别技术中车牌定位.字符切割.字符识别及后处理是其关键技术.由于 ...

  5. 图像五值化与基于三值图像的车牌识别(1)

    庆祝2011年新年 张忠义 海口愚佬会教育科技有限公司 全文下载 www.yulaohui.com/color5_2/ 摘 要:      图像五值化是通过公式Y =(R+G)/2,将RGB空间映射到 ...

  6. matlab imcrop 对应python函数_MATLAB车牌识别之7个字符切割浅谈【抽丝剥茧】

    车牌识别的7个字符切割,可能大家都听过是所谓的连通域法切割,可是何为连通域呢,估计98.98%的朋友,包括绝大部分老师都不知道所以然,今天就该问题抽丝剥茧进行讲解. 先来一段代码: % 7个分割字符 ...

  7. matlab连通域分割_MATLAB车牌识别之7个字符切割浅谈【抽丝剥茧】

    车牌识别的7个字符切割,可能大家都听过是所谓的连通域法切割,可是何为连通域呢,估计98.98%的朋友,包括绝大部分老师都不知道所以然,今天就该问题抽丝剥茧进行讲解. 先来一段代码: % 7个分割字符 ...

  8. OpenCV(项目)车牌识别2 -- 车牌字符分割(直方图)

    目录 试错 1.没有膨胀/膨胀过小:无法连接上单个字符. 2.膨胀过大:错误连接相邻字符. 一.直方图处理原理 1.横向分割 2.纵向分割 过程: 一.中值滤波.灰度化 二.二值化(统一黑底白字) 三 ...

  9. 车牌识别之二:字符分割

    车牌识别大概步骤可分为:车牌定位,字符分割,字符识别三个步骤. 细分点可以有以下几个步骤: (1)将图片灰度化与二值化 (2)去噪,然后切割成一个一个的字符 (3)提取每一个字符的特征,生成特征矢量或 ...

最新文章

  1. amqp协议与pika库浅析
  2. DeepMind用神经网络求解MIP后,攻破运筹学只是时间问题?你想多了
  3. 使用Nodejs创建基本的网站 Microblog--《Node.js开发指南》 1
  4. Jenkins之gitlab配置
  5. windows7下载python教程-Windows 7下Python Web环境搭建图文教程
  6. 数据本地存储方法封装(笔记)localStorage、sessionStorage
  7. HTTP 请求之URLs 与 URNs
  8. 写一段代码提高内存占用_记录一次生产环境中Redis内存增长异常排查全流程!...
  9. arm9 adc及触摸屏
  10. CUDNN学习笔记(2)
  11. 三、 安装项目依赖以及启动项目
  12. LeedCode知识点之位运算
  13. maxscale mysql_Maxscale实现Mysql读写分离
  14. 基于树莓派的sht20温湿度传感器应用(c语言)
  15. 怎么批量删除旧的微博内容?推荐按键精灵自动删除
  16. 视频: 视频码率、分辨率、帧率、视频大小等
  17. 中国近代史导图(二)
  18. Netty03-进阶
  19. 我不理解表现与数据分离。。。
  20. 链家二手房信息爬取(内附完整代码)

热门文章

  1. 【大数据处理技术】实验4
  2. Java论坛系统--3.系统用户角色权限表结构设计
  3. SECS连接模式中active与passive
  4. python爬虫模拟登录网页:登录wish
  5. Android 实战项目:简单计算器
  6. Vue实例基础5 (vue 条件渲染与列表渲)
  7. 服务器应用程序不可用的问题
  8. AsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
  9. 在Ubuntu安装完成后更改默认的语言LANG,出现Cannot set LC_CTYPE to default locale: No such file or directory错误的解决办法
  10. visitor 模式