OpenCV Python Hough直线变换
霍夫直线变换(Hough Transform)是一种在图像中检测直线的技术。它可以帮助我们从图像中鲜明地检测出直线段,并且对于噪声和不完整的线段也有较好的鲁棒性。
霍夫直线变换的基本思想是将直线表示为参数空间中的曲线,通过统计参数空间中的交点来检测直线。
以下是霍夫直线变换的基本步骤:
边缘检测:
对输入图像进行边缘检测操作,例如使用Canny算子。
得到二值化的边缘图像,其中边缘像素为非零值,非边缘像素为零值。
构建霍夫空间:
定义霍夫空间,在二维情况下,霍夫空间通常由两个参数表示,如极坐标系下的角度和距离。
对每个边缘像素,在霍夫空间中遍历所有可能的直线,并将对应的霍夫空间中的计数器加一。
检测直线:
根据霍夫空间中的计数器值,找到具有足够高投票数量的参数组合,这些组合对应于图像中的直线。
可以通过设定阈值来控制检测到的直线数量。
输出直线:
将检测到的直线参数转换回图像坐标空间,得到检测到的直线的端点。
import cv2
import numpy as np
# 读入图像
img = cv2.imread('assets/sudoku.png')
# 灰度化
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 边缘检测
edges = cv2.Canny(gray, threshold1=50, threshold2=150, apertureSize = 3)
# 直线检测
lines = cv2.HoughLines(edges, rho=1, theta=np.pi/180, threshold=150 )
for line in lines:
rho, theta = line[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))
cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2)
cv2.imshow("line", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Lnton 羚通霍夫直线变换广泛应用于图像处理和计算机视觉领域,特别是在直线检测、图像分析、图像配准和边缘检测等任务中。
在实际应用中,OpenCV 是一个常用的计算机视觉库,提供了霍夫直线变换的实现方法和函数。您可以使用 OpenCV 中的 cv2.HoughLines() 函数来进行霍夫直线变换的计算和处理。