翼度科技»论坛 编程开发 python 查看内容

【Python】【OpenCV】OCR识别(二)——透视变换

10

主题

10

帖子

30

积分

新手上路

Rank: 1

积分
30
  对于OCR技术在处理有角度有偏差的图像时是比较困难的,而水平的图像使用OCR识别准确度会高很多,因为文本通常是水平排列的,而OCR算法一般会假设文本是水平的。
  针对上述情况,所以我们在处理有角度的图象时,需要将图像“摆正”,将使用到getPerspectiveTransform方法和warpPerspective方法。
getPerspectiveTransform:
参数:

  • src:源图像中的四个点坐标,以浮点数数组或列表的形式表示。这些点应按照逆时针方向指定。
  • dst:目标图像中对应的四个点坐标,以浮点数数组或列表的形式表示。这些点应按照逆时针方向指定。
返回值:

  • M:一个3x3的透视变换矩阵,以浮点数NumPy数组的形式返回。可以使用此变换矩阵将源图像中的点映射到目标图像中对应的点。
 
warpPerspective:
参数:

  • src:输入图像,可以是8位无符号整数类型、32位浮点类型或16位有符号整数类型。
  • M:3x3的变换矩阵,可以使用cv2.getPerspectiveTransform()函数计算得到。
  • dsize:输出图像的大小,以(width, height)的形式指定。可以通过cv2.resize()函数调整大小,也可以直接提供目标大小。
  • flags:插值方法的标志,可以是cv2.INTER_NEAREST、cv2.INTER_LINEAR、cv2.INTER_CUBIC或cv2.INTER_LANCZOS4之一。
  • borderMode:用于处理超出边界的像素值的标志,可以是cv2.BORDER_CONSTANT、cv2.BORDER_REPLICATE、cv2.BORDER_REFLECT、cv2.BORDER_WRAP或cv2.BORDER_REFLECT_101之一。
返回值:

  • dst:输出图像,与dsize参数指定的大小相同。
 
Code:
  1. 1 height, width = numpy.int0(cv2.minAreaRect(goal_points)[1])
  2. 2 hw_rate = height / width
  3. 3 new_width = 400
  4. 4 new_height = int(new_width * hw_rate)
  5. 5 pts = numpy.float32([[0, 0], [new_width, 0], [new_width, new_height], [0, new_height]])
  6. 6
  7. 7 ll = [i for item in iter(goal_points) for i in item]
  8. 8 if ll[0][0] > ll[1][0]:
  9. 9     ll[0], ll[1] = ll[1], ll[0]
  10. 10 ll[2], ll[3] = ll[3], ll[2]
  11. 11
  12. 12 matrix = cv2.getPerspectiveTransform(numpy.float32(ll), pts)
  13. 13 iout = cv2.warpPerspective(image, matrix, (new_width, new_height))
复制代码
结果:

 思路:
 
1、首先我们将approxPolyDP逼近轮廓(goal_points)所返回的四个坐标点传入minAreaRect来获得逼近轮廓的宽高。
2、然后我们求取宽高比,为后续新的图片大小做准备。
3、我们设置一个新的宽(new_width)的值,并根据上一步求得的宽高比得到新的高(new_height)的值。
4、以顺时针坐标顺序,定义新图片的四个坐标点(pts)。
5、将goal_points(此时是三维数组)拆分成二维。
6、通过上一篇博客我们知道了approxPolyDP返回的坐标点是逆时针的,且第一个坐标是变化的,所以我们通过比较第一个坐标的x和第二个坐标的x来确定谁在左上角,并且因为我们定义的新窗口的四个坐标是顺时针,所以需要将第三第四个坐标对调一下,从而符合顺时针的要求。
7、调用getPerspectiveTransform方法和warpPerspective方法,最终得到我们透视变换后的水平图片。
 
注:关于warpPerspective的dsize参数,我们可以随意定义宽高,比如上述代码中可以直接将(new_width, new_height)替换成(300, 300)对应的pts中的new_width, new_height也需要进行替换,但是我们得到的图片是正方形的,和原图中的感兴趣区域的长方形并不相符,所以最终得到的透视变换图也就不理想的。

来源:https://www.cnblogs.com/vangoghpeng/p/17953267
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
来自手机

举报 回复 使用道具