opencv投影法切割数字-(1)单排横向数字切割


效果展示
白色=255
黑色=0

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace cv;
using namespace std;

int main()
{
	Mat srcImage = imread("photo/number.png");//原图
	Mat srcGray; cvtColor(srcImage, srcGray, COLOR_RGB2GRAY);//灰度图像
	Mat input_src; threshold(srcGray, input_src, 0, 255, THRESH_BINARY_INV); //二值化图像
	int width = input_src.cols;//列数
	int height = input_src.rows;//行数
	int* whitesum = new int[width]();//创建存储每列白色出现次数的数组指针
	for (int i = 0; i < height; i++)//遍历行
	{
		for (int j = 0; j < width; j++)//遍历列
		{
			if (input_src.at<uchar>(i, j) == 255)//判断是否为白色
			{
				whitesum[j]++;//统计每列的白色总数
			}
		}
	}
	Mat out(height, width, CV_8UC1, Scalar(0));//创建一个全黑的大小相等的单通道图
	for (int i = 0; i < width; i++)//遍历列
	{
		for (int j = 0; j < whitesum[i]; j++)//遍历行,退出条件为画完白色
		{
			out.at<uchar>(height - j - 1, i) = 255;//绘制每一列的白色次数投影图
		}
	}
	imshow("原图", srcImage);
	imshow("二值化图像", input_src);
	imshow("投影图", out);
	Mat img;//切割图像
	bool white = 0;//判断值
	int a = 0, b = 0;//切割图像的开始值和末尾值
	for (int i = 0; i < width; i++)//遍历列
	{
		if (whitesum[i])//判断每一列是否为白色
		{
			white = 1;//出现白色
		}
		else//黑色
		{
			if (white == 1)//如果之前那列出现白色
			{
				b = i;//末尾值
				rectangle(srcImage, Point(a, height), Point(b, 0), Scalar(100, 0, 255), 2, 1, 0);//画切割边框
				img = input_src(Rect(a, 0, b - a, height)).clone();//切割图
				imshow("切割边框图", srcImage);
				imshow("切割图", img);
				waitKey(0);
			}
			a = i;//起始值
			white = 0;//没有出现白色
		}
	}
	waitKey(0);
	return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值