65.9K
CodeProject 正在变化。 阅读更多。
Home

如何倾斜图像

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.65/5 (36投票s)

2006 年 3 月 30 日

Apache

2分钟阅读

viewsIcon

244293

downloadIcon

6714

本文描述了一种计算图像倾斜角度的算法。

引言

以下文章描述了一种使用 VB.NET 校正图像倾斜的算法。

背景

如果想要进行 OCR、OMR、条码检测,或者仅仅是提高扫描图像的可读性,校正图像倾斜会很有帮助。例如,设想一个自动拍摄带有条码的商品的相机。如果倾斜角度过大,则无法检测到条码。校正倾斜后,就可以读取条码了。

校正倾斜前

校正倾斜后

使用代码

以下代码确定图像 bmpIn 的倾斜角度

Dim sk As New gmseDeskew(bmpIn)
Dim skewangle As Double = sk.GetSkewAngle
Dim bmpOut As Bitmap = RotateImage(bmpIn, -skewangle)

关注点

该算法的基本思想是

  • 在图像中找到参考线。
  • 计算这些线的角度。
  • 将倾斜角度计算为角度的平均值。
  • 旋转图像。

使用 霍夫变换 检测线条。图像中的每个点都可能位于无限多条线上。为了找到参考线,我们让每个点为通过该点的所有线投票。获得最多点的线就是我们的参考线。

首先,我们需要线的参数化表示。一条线可以参数化为

y = m*x+t

斜率为 m,截距为 t。我们感兴趣的是角度而不是斜率。线的角度 alpha 满足

m=tan(alpha)=sin(alpha)/cos(alpha)

得到

y=sin(alpha)/cos(alpha)*x+t

这等同于

y*cos(alpha)-x*sin(alpha)=d

我们无法搜索无限的参数空间,因此必须定义一个离散的参数空间。我们搜索所有满足

-20<=alpha<=20

的线,步长为 0.2,并将 d 四舍五入为整数。

伪代码中的基本算法

1. Create a two-dimensional matrix Hough and initialize the values with 0 
2. for y=0 to Height-1 
3.    for x=0 to Width-1 
4.      if Point(x,y) is black then 
5.        for alpha=-20 to 20 step 0.2 
6.          d= Trunc(y*cos(alpha)-x*sin(alpha)) 
7.          Hough(Trunc(alpha*5),d)+=1 
8.        next alpha 
9.      end if 
10.   next x 
11. next y 
12. Find the top 20 (alpha,d) pairs that have the highest count in the Hough matrix 
13. Calculate the skew angle as an average of the alphas
14. Rotate the image by – skew angle

该算法的计算量很大。为了节省时间,减少了投票点的数量。对于每条文本行,可以通过字母绘制许多不同角度的线

对于校正倾斜,只有底线很重要。

底线上的点具有较低的白色邻居。因此,我们只让满足以下条件的点 (x,y) 投票

  • 点 (x,y) 是黑色的。
  • 较低的邻居 (x,y+1) 是白色的。

参考文献

本文摘自 GMSE Imaging

历史

  • 03-30-06:原始文章。
  • 03-31-06:更多关于霍夫变换的解释。
  • 04-25-06:添加了参考文献部分。
© . All rights reserved.