霍夫变换是将直角坐标的点变为参数坐标的直线,直线的交点就直角坐标点的直线,比如说2条直线的交点就是2个点的直线参数,50条直线的交点就是50个点的直线的参数,当在参数坐标中,交点个数超过阈值,就可以认定这是一条直线。公式:
r = xcos(theta)+ysin(theta),代码如下,失败了
import numpy as np
import cv2
img = cv2.imread(r'../test.jpg')
#image = cv2.resize(image,(200,200))
image = cv2.Canny(img,50,150)
theta = np.deg2rad(np.arange(0,180))
hight,width = image.shape
distance = pow((pow(hight,2)+pow(width,2)),.5)
#目的是要三角函数值
cos_t = np.cos(theta)
sin_t = np.sin(theta)
num_theta = len(theta)
new_map = np.zeros((int(distance*2),num_theta))
y_inx,x_inx = np.nonzero(image)
for i in range(len(x_inx)):
x = x_inx[i]
y = x_inx[i]
for j in range(num_theta):
#霍夫变换公式 r = xcos(t) + ysin(t)
rot = cos_t[j]*x+sin_t[j]*y
new_map[int(rot),j] += 1
line_in = []
for i in range(int(distance)):
for j in range(num_theta):
if new_map[i,j]>1000:
line_in.append((i,j))
print(line_in)
for item in line_in:
r = item[0]
the = item[1]
point_list = []
for i in range(101):
y = int((r-i*cos_t[the])/sin_t[the])
point_list.append((y,i))
cv2.line(img,(point_list[0][0],point_list[0][1]),(point_list[100][0],point_list[100][1]),(0,0,0),2)
print(point_list)
cv2.imshow('test',img)
cv2.waitKey(0)
直接调用cv2 api成功 实现
import numpy as np
import cv2
img = cv2.imread(r'../test.jpg')
#image = cv2.resize(image,(200,200))
image = cv2.Canny(img,50,150)
lines = cv2.HoughLines(image,0.8,np.pi/180,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))
print(x1,y1,x2,y2)
cv2.line(img,(x1,y1),(x2,y2),(0,0,0),2)
cv2.imshow('test',img)
cv2.waitKey(0)