OpenCV自学笔记29. lsd直线检测算法(未完)

lsd直线检测算法

LSD是一种直线检测分割算法,它能在线性的时间内得出亚像素级精度的检测结果。该算法被设计成可以在任何数字图像上都无需参数调节。

参考:http://blog.csdn.net/lien0906/article/details/38417191

1、lsd算法的步骤(未完)

LSD算法的步骤如下:

  • 1、图像缩放
  • 2、梯度计算
  • 3、梯度排序
  • 4、阈值检测
  • 5、区域增长
  • 6、矩形近似

下面分别介绍每一个步骤:

1、图像缩放

2、梯度计算

3、梯度排序

4、阈值检测

5、区域增长

计算每个像素点8-邻域内level-line的角度,如果某个像素点的level-line角度与区域内平均的level-line角度相近(小于22.5°),则将该像素点加入到区域中,并重新计算区域内的平均level-line角度。

如下图所示:LSD算法将线段看做一小段图像区域,在这个区域中,图像的灰度发生剧烈变化,灰度变化的方向为梯度方向(Gradient),与梯度方向垂直的方向为线段方向(Level-Line)。

这里写图片描述

6、矩形近似
使用矩形覆盖区域,区域的质心就是矩形的中心。

2、lsd源码分析

3、实例

这个Demo用到的测试图像是:

这里写图片描述

下面的代码,部分参考自:OpenCV官网

lsd_lines.cpp

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() 
{
    string path = "images/test3.jpg";
    Mat image = imread(path, IMREAD_GRAYSCALE);
    blur(image, image, Size(3,3)); // 使用3x3内核来降噪
    Canny(image, image, 50, 200, 3); // Apply canny edge

    // Create and LSD detector with standard
    /*
      LSD_REFINE_NONE,没有改良的方式;
      LSD_REFINE_STD,标准改良方式,将带弧度的线(拱线)拆成多个可以逼近原线段的直线度;
      LSD_REFINE_ADV,进一步改良方式,计算出错误警告数量,通过增加精度,减少尺寸进一步精确直线。
    */
    Ptr<LineSegmentDetector> ls = createLineSegmentDetector(LSD_REFINE_STD);
    double start = double(getTickCount());
    vector<Vec4f> lines_std;

    // Detect the lines
    ls->detect(image, lines_std);

    // Show found lines
    Mat drawnLines(image);
    ls->drawSegments(drawnLines, lines_std);

    Mat only_lines(image.size(), image.type());
    ls->drawSegments(only_lines, lines_std);

    imshow("【lsd直线检测】", drawnLines);
    imshow("【仅仅是直线】", only_lines);

    waitKey(0);
    return 0;
}

结果图分析

程序首先对源图像滤波降噪,然后使用canny边缘检测算法,提取图像中的边缘。接着创建LineSegmentDetector对象的智能指针并初始化,用于直线检测。
最后,将检测到的直线绘制出来。


createLineSegmentDetector的函数说明如下:


这里写图片描述

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值