在图像处理和计算机视觉领域中,如何从当前的图像中提取出所需要的特征信息是图像识别的关键所在。在许多应用场合中需要快速的检测出直线或者圆。其中一种非常有效的的解决方法是霍夫变换,其为从图像中识别几何图形的基本方法。
注意:霍夫变换的输入是边缘检测的输出。
1、理解霍夫空间
在图像空间中线可以用y = mx +b 表示
接下来我们换另一种方式来表示直线,拿m和b作为坐标,可以将直线表示称一个点。这就是霍夫空间,又名参数空间。这样的变换叫霍夫变换。
反过来也同样成立,霍夫空间中的一条线对应于图像空间中的一个点。
以此类推,如果霍夫空间中有多个相交的线代表什么呢?
想象一下图像空间中有一条由多个点组成的有间断的线,就是这样。
所以说,想要找图像空间中不便于发现的线,就去霍夫空间中找相交点。
我们把图像空间从x-y直角坐标系改成极坐标系,这样一来,一个分段的线会在霍夫空间表示成相交的正弦曲线。
2、应用
从图像中框出屏幕所在区域。
# encoding: utf-8
import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
image = cv.imread('iphone.png')
image = cv.cvtColor(image, cv.COLOR_BGR2RGB)
gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY)
# 检测边缘
low_threshold = 50
high_threshold = 100
edges = cv.Canny(gray, low_threshold, high_threshold)
# 查找直线
rho = 1
theta = np.pi/180
threshold = 60
min_line_length = 50
max_line_gap = 5
# 在轮廓图上进行直线检测
lines = cv.HoughLinesP(edges, rho, theta, threshold, np.array([]),
min_line_length, max_line_gap)
# 显示检测的直线
line_image = np.copy(image)
for line in lines:
for x1,y1,x2,y2 in line:
cv.line(line_image,(x1,y1),(x2,y2),(255,0,0),5)
plt.imshow(line_image, cmap='gray')
plt.show()