基于Hough变换原理的文档图像倾斜角检测与校正

2020/07/18 人工智能 - 次.

基于Hough变换原理的文档图像倾斜角检测与校正

霍夫变换是一种特征检测(feature extraction),被广泛应用在图像分析(image analysis)、计算机视觉(computer vision)以及数位影像处理(digital image processing)。霍夫变换是用来辨别找出物件中的特征,例如:线条。他的算法流程大致如下,给定一个物件、要辨别的形状的种类,算法会在参数空间(parameter space)中执行投票来决定物体的形状,而这是由累加空间(accumulator space)里的局部最大值(local maximum)来决定。 现在广泛使用的霍夫变换是由RichardDudaPeterHart在公元1972年发明,并称之为广义霍夫变换(generalizedHoughtransform),广义霍夫变换和更早前1962年的PaulHough的专利有关。经典的霍夫变换是侦测图片中的直线,之后,霍夫变换不仅能识别直线,也能够识别任何形状,常见的有圆形、椭圆形。1981年,因为DanaH.Ballard的一篇期刊论文”Generalizing the Hough transform to detect arbitrary shapes”,让霍夫变换开始流行于计算机视觉界。1

霍夫变换基本原理

所谓霍夫变换,即对于图像平面上的一个点(x , y ),我们采用参数方程p=xcos(θ)+ysin(θ)把这个点映射到参数p-theta平面,那么图像平面上的一个点就对应p-theta平面的一条曲线,其中的p表示图像平面中的这个点所在直线到原点的距离,theta表示这个点所在直线与X轴的夹角。

又因为图像平面上的一个点对应一系列穿过这个点的直线,即有一系列对应的p和theta,所以一个点在参数p-theta平面对应着一条正弦曲线。由此我们可以推导,如果是图像平面上的一条直线,那么直线上的每个点在参数p-theta平面对应的曲线都会相交于同一点,即当前直线的(theta, p)。

基于霍夫变换原理,我们可以在p-theta平面找到最多曲线相交的那点,这一点对应着图像平面最长的直线(可以是连续的也可以是不连续的)。这个点的theta坐标即是我们要寻找的倾斜角。2

代码实现

基于霍夫变换的基本原理,我们可以使用Matlab或Python来实现,为方便理解同时兼顾代码的可移植性此处我们用Python进行编写。

# 像素间隔
# pixel = 3
pixel = int(image.shape[1] * 0.0015)
if pixel == 0: pixel = 1

img_blur = cv2.cvtColor(cv2.medianBlur(image, 5), cv2.COLOR_BGR2GRAY)
img_ad_thr = cv2.adaptiveThreshold(img_blur, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)

# 基于双边滤波器的图像自适应阈值
# img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# img = cv2.bilateralFilter(img, 9, 75, 75)
# img = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
# img_ad_thr = cv2.medianBlur(img, 5)

m, n = img_ad_thr.shape[:2]
pMax = round(math.sqrt(m ** 2 + n ** 2))
thetaMax = 180
countMatrix = np.zeros((pMax, thetaMax))

for i in range(0, m, pixel):
    for j in range(0, n, pixel):
        if img_ad_thr[i, j] == 0:
            for theta in range(thetaMax):
                p = math.floor(abs(i * math.cos(3.14 * theta / 180) + j * math.sin(3.14 * theta / 180)))
                countMatrix[p + 1, theta] = countMatrix[p + 1, theta] + 1

m, n = countMatrix.shape
angle = 0
for i in range(0, m, pixel):
    for j in range(n):
        if countMatrix[i, j] > countMatrix[1, 1]:
            countMatrix[1, 1] = countMatrix[i, j]
            angle = j

图像角度检测及矫正效果如图所示:

参考文献

  • [1] [Richard O. Duda and Peter E. Hart. Use of the Hough Transformation to Detect Lines and Curves in Pictures (PDF). Artificial Intelligence Center (SRI International). April 1971.]
  • [2] [荆雷,张欣,郭金鑫.基于版面的拍照文档图像倾斜校正.激光与红外[J].2010,第10期]

Search

    Table of Contents