整体倾斜度调整

                扫描图像中的前景可能存在一定程度的倾斜,本文以一行倾斜的数字为例,需要进行适当的调整以使字符处在同一水平位置,这样既有利于后续的字符分割,也可以降低字符识别的难度。

       一般来说,对于若干字符组成的图像,如果左右两边字符像素的平均位置有比较大的起落,就说明图像存在倾斜。因此可以根据图像左右两边的黑色像素的平均高度进行调整。

       算法首先逐行扫描左半部分和有半部分图像,分别计算出起黑色像素的平均加权高度(给靠两边的像素更多的权重);在此基础上计算出斜率,根据斜率重新组织图像。这实际上是一个从新图像到旧图像的像素映射过程,属于图像几何变换的范畴。


代码如下:

/****************************************************************
功能: 调整图像中前景物体的倾斜度,使其尽量处于一个水平位置上。比较适合于横向分布的物体,如        字符调整
参数:       
注  : 只能处理二值图像
返回值:  无
***************************************************************/
void Ctry::OnTryTyr1()
{
	//TODO:  在此添加命令处理程序代码  
	IplImage* img = cvLoadImage("C:\\Users\\Administrator\\Desktop\\2.jpg", -1);
	IplImage* dst = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
	int i, j;
	int nWeightSum = 0;             //统计皮平均加权高度时的权重和
	double dAvgLHeight = 0;      //图像左半部分前景物体的平均高度
	double dAvgRHeight = 0;      //图像右半部分前景物体的平均高度

	//逐行扫描左半部分图像,计算黑色像素的平均加权高度
	for (i = 0; i < img->height; i++)
	{
		for ( j = 0; j < img->width/2; j++)
		{
			double nGray = cvGetReal2D(img, i, j);
			if (int(nGray) == 0)  //是前景物体,黑
			{
				//计算高度的加权和,给靠两边的像素分配更多的权重
				nWeightSum += img->width / 2 - j;
				dAvgLHeight += i*(img->width / 2 - j);
			}
		}
	}

	dAvgLHeight /= nWeightSum;
	nWeightSum = 0;

	//逐行扫描左右部分图像,计算黑色像素的平均加权高度
	for (i = 0; i < img->height; i++)
	{
		for (j = img->width/2; j < img->width; j++)
		{
			double nGray = cvGetReal2D(img, i, j);
			if (int(nGray) == 0)  //是前景物体,黑
			{
				//计算高度的加权和,给靠两边的像素分配更多的权重
				nWeightSum += j - img->width / 2;
				dAvgRHeight += i*(j - img->width / 2);
			}
		}
	}

	dAvgRHeight /= nWeightSum;
	//计算斜率
	double dSlope = (dAvgLHeight - dAvgRHeight) / (img->width / 2);

	int nYSrc;        //Y的源坐标

	//扫描新图像,根据斜率得到的新旧图像的映射关系为每一个像素赋值
	for ( i = 0; i < img->height; i++)
	{
		for ( j = 0; j < img->width; j++)
		{
			//找到与新图像的当前点对应的旧图像点的水平坐标(以水平方向中心为中心)
			nYSrc = int(i - (j - img->width / 2)*dSlope);
			if (nYSrc<0||nYSrc>=img->height) //对应点不在图像区域内
			{
				cvSetReal2D(dst,i, j, 255);
			}
			else
			{
				double pixel = cvGetReal2D(img, nYSrc, j);
				cvSetReal2D(dst, i, j, pixel);
			}
		}
	}
	cvSaveImage("C:\\Users\\Administrator\\Desktop\\dst.jpg", dst);
}
效果图:

调整后:

明显平行了很多,效果还不错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值