本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。
原文链接:实战 | OpenCV实现扫描文本矫正应用与实现详解(附源码)
1 导 读
本文主要介绍使用OpenCV对扫描文本矫正的应用实例及详细实现步骤。
2 背景介绍
在使用打印机或扫描仪扫描文档时,由于摆放位置差异难免造成扫描文档的倾斜。本文将使用OpenCV将倾斜的文档矫正水平并去除黑边。
3 实现步骤
本文只针对包含大部分文字的文档做倾斜矫正,思路来源是大部分文字倾斜后同一行的也在同一条直线,通过拟合直线计算文本倾斜角度,然后旋转来实现文本倾斜矫正。
【1】加载倾斜图像
【2】灰度转换+腐蚀+膨胀
【3】Canny边缘检测 + 霍夫线变换检测直线
【4】计算直线角度中值作为最终的旋转角度,旋转图像
注意不建议用最值或平均值,因为霍夫线变换有可能拟合到异常角度直线,最值或均值会导致最终角度偏大或偏小,使矫正结果偏差较大。
为什么使用均值?大家可以结合中值滤波的概念来理解。
举例来说:霍夫线变换找到了10条直线,角度分别为:0°,5°,25°,26°,26°,28°,28°,30°,100°,150°。如果去最大值angle=150°,最小值angle=0°,平均值angle=41.8°,中值angle=27°,明显中值结果更准确,更符合直线拟合角度的统计特性,因为拟合直线结果中大部分直线拟合是准确的,这部分角度会集中在一起。当然,使用直方图统计,计算出现频率最多的角度范围更准确,大家可以自行尝试。
【5】去除边角黑边(使用漫水填充或轮廓删选方式)
【6】换图片测试
4 代码解析
import numpy as np
import os
import cv2
import math
from scipy import misc,ndimage
def rotate(image,angle,center=None,scale=1.0):
(w,h) = image.shape[0:2]
if center is None:
center = (w//2,h//2)
wrapMat = cv2.getRotationMatrix2D(center,angle,scale)
return cv2.warpAffine(image,wrapMat,(h,w))
#使用霍夫变换
def getCorrect2():
#读取图片,灰度化
src = cv2.imread('./imgs/1.jpg')
showAndWaitKey("src",src)
gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
showAndWaitKey("gray",gray)
#腐蚀、膨胀
kernel = np.ones((5,5),np.uint8)
erode_Img = cv2.erode(gray,kernel)
eroDil = cv2.dilate(erode_Img,kernel)
showAndWaitKey("eroDil",eroDil)
#边缘检测
canny = cv2.Canny(eroDil,50,150)
showAndWaitKey("canny",canny)
#霍夫变换得到线条
lines = cv2.HoughLinesP(canny, 0.8, np.pi / 180, 90,minLineLength=100,maxLineGap=10)
drawing = np.zeros(src.shape[:], dtype=np.uint8)
#画出线条
for line in lines:
x1, y1, x2, y2 = line[0]
cv2.line(drawing, (x1, y1), (x2, y2), (0, 255, 0), 1, lineType=cv2.LINE_AA)
showAndWaitKey("houghP",drawing)
"""
计算角度,因为x轴向右,y轴向下,所有计算的斜率是常规下斜率的相反数,我们就用这个斜率(旋转角度)进行旋转
"""
k = float(y1-y2)/(x1-x2)
thera = np.degrees(math.atan(k))
print(thera)
"""
旋转角度大于0,则逆时针旋转,否则顺时针旋转
"""
rotateImg = rotate(src,thera)
cv2.imshow("rotateImg",rotateImg)
cv2.waitKey()
cv2.destroyAllWindows()
cv2.imwrite('result.jpg',rotateImg)
def showAndWaitKey(winName,img):
cv2.imshow(winName,img)
cv2.waitKey()
if __name__ == "__main__":
getCorrect2()
THE END !
文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。
标签:src,showAndWaitKey,AI,cv2,OpenCV,角度,源码,np From: https://blog.csdn.net/csdn_xmj/article/details/138501897