霍夫變換 文字圖片傾斜矯正 python實現
阿新 • • 發佈:2019-01-10
一、霍夫變換原理簡介
霍夫變換主要是利用圖片所在的空間和霍夫空間之間的變換,將圖片所在的直角座標系中具有形狀的曲線或直線對映到霍夫空間的一個點上形成峰值,從而將檢測任意形狀的問題轉化成了計算峰值的問題。即在圖片所在的直角座標系的一個直線,轉換到霍夫空間便成了一點,並且是由多條直線相交而成,我們統計的峰值也就是該相交點的橡膠線的條數
這麼難以理解,下面將用霍夫直線檢測具體解釋一下為什麼可以將檢測任意形狀問題轉化成計算峰值問題
對圖片建立直角座標系,則圖片中如果存在一條直線,設為:y = k*x + b,此空間x、y 為未知數,k、b是引數; 而霍夫空間便是將k、b看成未知數,x、y看成引數,因此霍夫空間便是 b = -x*k + y
如果圖片中有一條長的直線:y = k*x + b,那麼肯定由很多個畫素點(x0, y0)構成,但k、b是固定的,將這條直線上的畫素點全部對映到霍夫空間中,(k, b)是一個固定的點,但(x0, y0)不同,所以在霍夫空間中便形成了多條直線匯聚於一點。如下圖:
因此得出結論: 我們便是在霍夫空間中統計多個(k、b),對每一個(k, b)上的直線條數進行統計,計算出峰值最高的那個,也就是在圖片所在直角座標系中我們要檢測的直線。此時在回看最初那句話應該更理解了。
二、python霍夫變化實現文字圖片傾斜矯正
先上圖:
python實現
#先通過hough transform檢測圖片中的圖片,計算直線的傾斜角度並實現對圖片的旋轉
import os
import cv2
import math
import random
import numpy as np
from scipy import misc, ndimage
filepath = 'E:/peking_rw/hough transform/tilt image correction/test image'
for filename in os.listdir(filepath):
img = cv2.imread('E:/peking_rw/hough transform/tilt image correction/test image/%s'%filename)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
#霍夫變換
lines = cv2.HoughLines(edges,1,np.pi/180,0)
for rho,theta in lines[0]:
a = np.cos(theta)
b = np.sin(theta)
x0 = a*rho
y0 = b*rho
x1 = int(x0 + 1000*(-b))
y1 = int(y0 + 1000*(a))
x2 = int(x0 - 1000*(-b))
y2 = int(y0 - 1000*(a))
if x1 == x2 or y1 == y2:
continue
t = float(y2-y1)/(x2-x1)
rotate_angle = math.degrees(math.atan(t))
if rotate_angle > 45:
rotate_angle = -90 + rotate_angle
elif rotate_angle < -45:
rotate_angle = 90 + rotate_angle
rotate_img = ndimage.rotate(img, rotate_angle)
misc.imsave('E:/peking_rw/hough transform/tilt image correction/test result/%s'%filename, rotate_img)
供參考!