1、LSD算法
当我将OpenCV提升到4.1.0时,LineSegmentDetector(LSD)消失了。
OpenCV-contrib有一个名为FastLineDetector的东西,如果它被用作LSD的替代品似乎很好。如果你有点感动,你会得到与LSD几乎相同的结果。
import cv2
import numpy as np
img = cv2.imread('/home/user/Downloads/111_131_1448_433_0.11_0.36_table_20230822_images_20_header.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#Create default Fast Line Detector (FSD)
fld = cv2.ximgproc.createFastLineDetector()
#Detect lines in the image
lines = fld.detect(gray)
#Draw detected lines in the image
drawn_img = fld.drawSegments(gray, lines)
cv2.imshow("FLD", drawn_img)
cv2.waitKey(0)
2、EDlines算法
EDlines算法原理
1 运行一个灰度图像,运行边缘检测、边缘绘制ED算法,产生像素相邻的链,称之为边缘。边缘线段直观地反应对象的边界。
2 利用直线度准则,即最小二乘直线拟合法,从生成的像素链中提取线段。
3 线的验证步骤定于亥姆霍兹原理Helmholtz principle ,用来消除虚假线段的检测。
edlines算法无论是速度和效果都是可以的,可以自行研究该算法,该算法研究完毕应该会得到很多东西。
3、霍夫直线检测
import cv2 as cv
import numpy as np
img = cv.imread('/home/user/Downloads/111_131_1448_433_0.11_0.36_table_20230822_images_20_header.png')
def line_detection(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
# apertureSize做Canny时梯度窗口的大小
edges = cv.Canny(gray, 50, 150, apertureSize=3)
# 返回的是r和theta
lines = cv.HoughLines(edges, 1, np.pi/180, 200)
for line in lines:
print(type(line))
rho, theta = line[0]
a = np.cos(theta)
b = np.sin(theta)
x0 = a*rho
y0 = b*rho
# 乘以1000,是根据源码乘的,通过x1、x2、y1、y2画一条直线
x1 = int(x0+1000*(-b))
y1 = int(y0+1000*a)
x2 = int(x0-1000*(-b))
y2 = int(y0-1000*a)
cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2) # 2是所画直线长度的宽
print(x1,y1,x2,y2)
cv.imshow('image_lines', image)
line_detection(img)
cv.waitKey(0)
cv.destroyAllWindows()
4、边缘检测 cv2.Canny()
cv2.Canny()函数是OpenCV中用于边缘检测的函数,其主要功能是检测图像中的边缘并标记出来。
函数的调用格式如下:
edges = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]])
其中,参数含义如下:
-
image
:要进行边缘检测的输入图像,可以是灰度图像或彩色图像。 -
threshold1
:第一个阈值,用于边缘检测中的滞后阈值,建议取值为100。 -
threshold2
:第二个阈值,用于边缘检测中的滞后阈值,建议取值为200。 -
edges
:可选参数,用于存储边缘检测的结果。如果指定了该参数,则该参数会被用来存储检测到的边缘图像。如果没有指定该参数,则函数会自动创建一个与输入图像相同大小的数组来存储检测到的边缘图像。 -
apertureSize
:可选参数,用于指定Sobel算子的大小,建议取值为3。 -
L2gradient
:可选参数,用于指定是否使用 L 2 L_2 L2 梯度计算方式。默认值为False,表示使用 L 1 L_1 L1梯度计算方式。
cv2.Canny()函数的工作原理如下:
- 对输入图像进行灰度化处理。
- 对灰度图像进行高斯滤波,以平滑图像并去除噪声。
- 对滤波后的图像使用Sobel算子计算梯度幅值和方向。
- 对梯度幅值进行非极大值抑制,以压缩边缘带宽。
- 对压缩后的边缘带宽使用滞后阈值进行二值化,得到二值化图像。
- 对二值化图像进行连接操作,将断开的边缘进行连接,得到最终的边缘图像。
下面是一个简单的示例代码,演示了如何使用cv2.Canny()函数进行边缘检测:
import cv2
import numpy as np
# 读取一张图片
img = cv2.imread('test.jpg', 0)
# 使用Canny函数进行边缘检测
edges = cv2.Canny(img, 100, 200)
# 显示结果
cv2.imshow('Original', img)
cv2.imshow('Canny Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
需要注意的是,在使用cv2.Canny()
函数进行边缘检测时,阈值的选择对最终的结果有很大的影响。一般来说,较低的阈值可以检测到较弱的边缘,而较高的阈值可以去除较弱的边缘。建议在使用该函数时,先使用默认的阈值进行测试,然后根据实际情况进行调整。文章来源:https://www.toymoban.com/news/detail-676504.html
参考资料https://blog.csdn.net/m0_51233386/article/details/124171578
https://www.52dianzi.com/category/article/37/359179.html
https://blog.csdn.net/qq_28949847/article/details/129537581
https://docs.opencv.org/3.4/d9/db0/tutorial_hough_lines.html
文章来源地址https://www.toymoban.com/news/detail-676504.html
到了这里,关于图像线段检测几种方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!