常见字符分割方法:方向投影分割法和连通域分割法
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.youkuaiyun.com/wx7788250/article/details/60139109
2. https://blog.youkuaiyun.com/dieju8330/article/details/82631514
3.https://blog.youkuaiyun.com/nienelong3319/article/details/81546237
4.https://blog.youkuaiyun.com/mangobar/article/details/80286059?utm_source=blogxgwz0