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.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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值