我花了几个小时研究这个,我已经取得了一些进展,但仍然需要一些帮助。
我知道有库可以做到这一点,但由于我的场景非常简单,我宁愿拥有自己的代码。我正在用支票扫描仪扫描支票,但有些图像歪了,需要去歪斜;
这是我的代码:
Function DeskewImage(Original As Bitmap) As Bitmap
Dim w = Original.Width
Dim h = Original.Height
'i go over the first 200 rows of pixels and for each row i get the first black pixel. this should be enough to get me the angle
Dim FirstBlacks As New List(Of Point)
For row = 0 To 200
For col = 0 To w - 1
Dim p = Original.GetPixel(col, row)
Dim rl = CInt(p.R) + p.G + p.B
If rl < 760 Then
FirstBlacks.Add(New Point(col, row))
Exit For
End If
Next
Next
'here i try to get the angle, im not sure its correct though
Dim xyAvg = FirstBlacks.Select(Function(pnt) pnt.X * pnt.Y).Average
Dim xAvg = FirstBlacks.Select(Function(pnt) pnt.X).Average
Dim yAvg = FirstBlacks.Select(Function(pnt) pnt.Y).Average
Dim xVar = FirstBlacks.Select(Function(pnt) pnt.X).Variance
Dim coefficient = (xyAvg - xAvg * yAvg) / xVar
Dim LeftTop = -20
'now id like utilize the angle to skew
Dim destinationPoints = {New Point(0, LeftTop), New Point(w, 0), New Point(0, h)}
Dim ret = New Bitmap(w, h)
Dim g = Graphics.FromImage(ret)
g.DrawImage(Original, destinationPoints)
ret.Save("D:\aa.jpg")
Return Original
End Function
我有两个问题:
- 我的系数正确吗?这是基于这里的一篇文章 http://www.experts-exchange.com/Microsoft/Development/MS_Access/A_2799-Simple-Linear-Regression-in-MS-Access.html 但我不确定我是否正确移植了它
- 我如何利用系数在.net 中倾斜图像?我能找到的唯一功能需要目的地点,我不知道如何找到
我也觉得很奇怪,我需要在绘制之前指定返回图像的高度和宽度。我应该如何知道偏斜之前的尺寸?
编辑
感谢 Pieter Geerkens,我将代码更改为旋转而不是倾斜
现在问题仍然存在于算法上
首先是一个示例图像
我上面的算法为此示例图片返回了大约 -0.33 的结果。实际上我需要大约+4度的旋转。那么算法错了吗?还是需要将结果转换为度数?有任何想法吗?
赞赏地