Python+OpenCV图像处理——实现直线检测
程序员文章站
2022-03-03 18:53:19
简介:1.霍夫变换(hough transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,...
简介:
1.霍夫变换(hough transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等)。最基本的霍夫变换是从黑白图像中检测直线(线段)。
2.hough变换的原理是将特定图形上的点变换到一组参数空间上,根据参数空间点的累计结果找到一个极大值对应的解,那么这个解就对应着要寻找的几何形状的参数(比如说直线,那么就会得到直线的斜率k与常熟b,圆就会得到圆心与半径等等)
3.霍夫线变换是一种用来寻找直线的方法。用霍夫线变换之前, 首先需要对图像进行边缘检测的处理,也即霍夫线变换的直接输入只能是边缘二值图像。
4.霍夫直线检测的具体原理参见:
代码如下:
#直线检测 #使用霍夫直线变换做直线检测,前提条件:边缘检测已经完成 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()
运行结果:
注意:
1.opencv的houghlines函数是标准霍夫线变换函数,该函数的功能是通过一组参数对 的集合来表示检测到的直线,其函数原型为:houghlines(image, rho, theta, threshold[, lines[, srn[, stn[, min_theta[, max_theta]]]]]) -> lines