使用Python+OpenCV图像处理实现直线检测
创始人
2024-11-17 10:02:56
0次

简介:

1.霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等)。最基本的霍夫变换是从黑白图像中检测直线(线段)。

2.Hough变换的原理是将特定图形上的点变换到一组参数空间上,根据参数空间点的累计结果找到一个极大值对应的解,那么这个解就对应着要寻找的几何形状的参数(比如说直线,那么就会得到直线的斜率k与常熟b,圆就会得到圆心与半径等等)

3.霍夫线变换是一种用来寻找直线的方法。用霍夫线变换之前, 首先需要对图像进行边缘检测的处理,也即霍夫线变换的直接输入只能是边缘二值图像。

4.霍夫直线检测的具体原理参见:

http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html

代码如下:

#直线检测
#使用霍夫直线变换做直线检测,前提条件:边缘检测已经完成
import cv2 as cv
import numpy as np

#标准霍夫线变换
def line_detection(image):
  gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY)
  edges = cv.Canny(gray, 50, 150, apertureSize=3) #apertureSize参数默认其实就是3
  cv.imshow("edges", edges)
  lines = cv.HoughLines(edges, 1, np.pi/180, 80)
  for line in lines:
    rho, theta = line[0] #line[0]存储的是点到直线的极径和极角,其中极角是弧度表示的。
    a = np.cos(theta)  #theta是弧度
    b = np.sin(theta)
    x0 = a * rho  #代表x = r * cos(theta)
    y0 = b * rho  #代表y = r * sin(theta)
    x1 = int(x0 + 1000 * (-b)) #计算直线起点横坐标
    y1 = int(y0 + 1000 * a)  #计算起始起点纵坐标
    x2 = int(x0 - 1000 * (-b)) #计算直线终点横坐标
    y2 = int(y0 - 1000 * a)  #计算直线终点纵坐标  注:这里的数值1000给出了画出的线段长度范围大小,数值越小,画出的线段越短,数值越大,画出的线段越长
    cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)  #点的坐标必须是元组,不能是列表。
  cv.imshow("image-lines", image)

#统计概率霍夫线变换
def line_detect_possible_demo(image):
  gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY)
  edges = cv.Canny(gray, 50, 150, apertureSize=3) # apertureSize参数默认其实就是3
  lines = cv.HoughLinesP(edges, 1, np.pi / 180, 60, minLineLength=60, maxLineGap=5)
  for line in lines:
    x1, y1, x2, y2 = line[0]
    cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
  cv.imshow("line_detect_possible_demo",image)

src = cv.imread('E:/imageload/louti.jpg')
print(src.shape)
cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE) 
cv.imshow('input_image', src)
line_detection(src)
src = cv.imread('E:/imageload/louti.jpg') #调用上一个函数后,会把传入的src数组改变,所以调用下一个函数时,要重新读取图片
line_detect_possible_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

运行结果:

使用Python+OpenCV图像处理实现直线检测

注意:

1.opencv的HoughLines函数是标准霍夫线变换函数,该函数的功能是通过一组参数对 使用Python+OpenCV图像处理实现直线检测 的集合来表示检测到的直线,其函数原型为:HoughLines(image, rho, theta, threshold[, lines[, srn[, stn[, min_theta[, max_theta]]]]]) -> lines

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...