使用OpenCV实现图像中的文字切割

前言

1.做文字识别相关的项目,首先是检测字符区域,然后进行水平切割,得到整行的文字,其次要考虑的就是怎么将每一个字符分开,并且从图片中切割下来,然后才可以导入训练好的模型进行字符识别。在字符单个切割的切割的过程中,可以使用OpenCV来实现。
2.我这里用到的OpenCV的版本是3.30,IDE是Qt和VS2015。

代码演示

void textCutting(Mat &src, vector<Mat> &out_char)
{	

	if (src.channels() > 1)
	{
		cvtColor(src, src, CV_BGR2GRAY);
	}

	//滤波
	//GaussianBlur(src, src, Size(1, 1), 5, 5, 4);
	adaptiveThreshold(src, src, 255, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, 41, 0);

	//新建一个全白图像
	Mat white_base(src.size(), src.type(), cv::Scalar(255));
	//相减得到反转的图像
	Mat input_src = white_base - src;

	const int src_width = input_src.cols;
	const int src_height = input_src.rows;

	//储存每列白色像素个数的容器
	//取列白色像素个数
	vector<int> white_pice(src_width,0);
	for (size_t i = 0; i < src_height; i++)
	{
		for (size_t j = 0; j < src_width; j++)
		{
			if (input_src.at<uchar>(i, j))
			{
				white_pice.at(j)++;
			}
		}
	}

	//绘制垂直投影下每列白色像素的数目
	Mat vertical_projection(src_height, src_width, CV_8UC1, Scalar(0));
	for (int i = 0; i< src_width; i++)
	{
		for (int j = 0; j < white_pice[i]; j++)
		{
			vertical_projection.at<uchar>(src_height - j - 1, i) = 255;
		}
	}
	imshow("投影图", vertical_projection);

	vector<Mat> split_src;

	bool white_block = false;
	bool black_block = false;
	
	int temp_col_forword = 0, temp_col_behind = 0;
	Mat split_temp;
	

	for (int i = 0; i < src_width; i++)
	{
		//表示区域有白色像素
		if (white_pice[i])
		{
			white_block = true;
			black_block = false;
		}
		else
		{	//若无白色像素(进入黑色区域)
			if (white_block)
			{
				//若前一列有白色像素
				temp_col_behind = i;
				//取当前列为截止列
				//截取下一部分
				split_temp = input_src(Rect(temp_col_forword, 0, temp_col_behind - temp_col_forword, src_height)).clone();
				split_src.push_back(split_temp);
			}
			//记录最新黑色区域的列号,记为起始列
			temp_col_forword = i;
			//表示进入黑色区域
			black_block = true;
			white_block = false;
		}
	}

	for (int i = 0; i < split_src.size(); i++)
	{
		imshow(to_string(i), split_src[i]);
		//out_char.push_back(split_src[i]);
	}
}

函数调用:

Mat src;
src = imread("4.png");
vector<Mat> dst;
imshow("src", src);
textCutting(src, dst);

运行结果:
在这里插入图片描述

  • 3
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知来者逆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值