整体倾斜度调整
2015-11-06 22:51
176 查看
扫描图像中的前景可能存在一定程度的倾斜,本文以一行倾斜的数字为例,需要进行适当的调整以使字符处在同一水平位置,这样既有利于后续的字符分割,也可以降低字符识别的难度。
一般来说,对于若干字符组成的图像,如果左右两边字符像素的平均位置有比较大的起落,就说明图像存在倾斜。因此可以根据图像左右两边的黑色像素的平均高度进行调整。
算法首先逐行扫描左半部分和有半部分图像,分别计算出起黑色像素的平均加权高度(给靠两边的像素更多的权重);在此基础上计算出斜率,根据斜率重新组织图像。这实际上是一个从新图像到旧图像的像素映射过程,属于图像几何变换的范畴。
代码如下:
调整后:
明显平行了很多,效果还不错
一般来说,对于若干字符组成的图像,如果左右两边字符像素的平均位置有比较大的起落,就说明图像存在倾斜。因此可以根据图像左右两边的黑色像素的平均高度进行调整。
算法首先逐行扫描左半部分和有半部分图像,分别计算出起黑色像素的平均加权高度(给靠两边的像素更多的权重);在此基础上计算出斜率,根据斜率重新组织图像。这实际上是一个从新图像到旧图像的像素映射过程,属于图像几何变换的范畴。
代码如下:
/**************************************************************** 功能: 调整图像中前景物体的倾斜度,使其尽量处于一个水平位置上。比较适合于横向分布的物体,如 字符调整 参数: 注 : 只能处理二值图像 返回值: 无 ***************************************************************/ 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); }效果图:
调整后:
明显平行了很多,效果还不错
相关文章推荐
- 数论之欧拉函数
- 深入浅出Java三大框架SSH与MVC的设计模式
- LeetCode OJ:Longest Substring Without Repeating Characters(最长无重复字符子串)
- C++常见类型所占字节大小
- haproxy
- 我第二次用SecureCRT时的糗事
- Linux 下 shell 编写 计算器
- Shmget 参数 0600的解释
- effective c++ 考虑写出一个不抛出异常的swap函数
- Python之str方法
- Animator无法添加event
- SpringMVC使用ResponseBody报406错误
- mac下使用自带的vim编辑器编辑文件
- Scrum Meeting 11.06
- Spring 知识总结
- apache配置httpd-vhosts
- Java 引用传递的实验
- cocos2d-x设计模式发掘之九:委托模式
- 设计模式-简单工厂模式(实现,可与前文进行比较)
- 开始swift学习之路