图像处理(三)霍夫变换,直线检测

霍夫变换是将直角坐标的点变为参数坐标的直线,直线的交点就直角坐标点的直线,比如说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)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值