图像线段检测几种方法

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://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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值