LSD算法简介
LSD快速直线检测算法是由Rafael Grompone、Jeremie Jackbowicz、Jean-Michel Morel于2010年发表在PAMI上的文献《LSD:a Line Segment Dectctor》中提出的,该算法时间复杂度较霍夫变换低。LSD算法通过对图像局部分析,得出直线的像素点集,再通过假设参数进行验证求解,将像素点集合与误差控制集合合并,进而自适应控制误检的数量 。由于LSD算法是对图像的局部分析,所以对于特别模糊的目标,或小目标,LSD是具有较大优势的。
1.源代码下载地址:http://www.ipol.im/pub/art/2012/gjmr-lsd/
2.源代码压缩包的组成:
Files | 简介 |
---|---|
README.txt | 说明书 |
COPYING | GNU AFFERO GENERAL PUBLIC LICENSE Version 3 |
Makefile | Compilation instructions for ‘make’.“make”的编译说明文件 |
lsd.c | LSD module ANSI C code, peer reviewed file. LSD模块ANSI C代码,同行评审文件(即LSD算法的源文件) |
lsd.h | LSD module ANSI C header, peer reviewed file.LSD模块是ANSI C头文件,是一个经过同行评审的文件。(LSD算法的头文件) |
lsd_cmd.c | command line interface for LSD, ANSI C code. LSD的命令行接口,ANSI C代码。 |
lsd_call_example.c | Minimal example of calling LSD from a C language program.LSD的最小示例(自定义一张左半边是黑色,右半边是灰色的图片,并提取中间的一条直线) |
chairs.pgm | Test image in PGM format.PGM格式的测试图像 |
chairs.lsd.txt | Expected result for ‘chairs.pgm’ image as an ASCII file.'chairs.pgm’图像的预期结果的ASCII文件 |
chairs.lsd.eps | Expected result for ‘chairs.pgm’ image as an EPS file.'chairs.pgm’图像的预期结果的EPS文件 |
doc | Html code documentation. |
doxygen.config | doxygen configuration file for documentation generation. |
3.编译
LSD算法采用标准C语言程序编写,可以被其他C语言程序调用,也可以用作独立命令。发行版中包含一个Makefile文件,Makefile文件中包含编译源程序“lsd.c”,头文件“lsd.h”,和“lsd_call_example.c“程序的指令。要构建这几个程序,必须在系统上安装C语言编译器(用“cc”调用),以及“make”工具。LSD只使用标准C库,因此它应该在任何ANSI C语言环境中编译。应当注意的是,它应该在类Unix系统中编译。
首先,在源代码和生成文件所在的目录打开终端,输入编译指令make
,进行编译。为了验证编译的正确性,您可以将LSD应用于测试的椅子图像。并将结果与提供的结果进行比较。这里提供一个示例,这个示例清晰地演示了如何使用LSD作为一个模板来编译程序,编译命令行为:cc -o lsd_call_example lsd_call_example.c lsd.c -lm
,得到lsd_call_example的可执行程序,运行该示例程序:./lsd_call_example
得到示例程序的输出,自定义一张左半边是黑色,右半边是灰色的图片,并提取中间的一条直线。
最简单的LSD命令行是./lsd
,这将打印LSD版本和命令行接口,包括可用选项。
LSD处理的唯一输入图像格式是PGM,输出有ASCII和二进制两种版本。输入命令行:./lsd chairs.pgm chairs.result.txt
,即运行lsd程序,输入图像为chairs.pgm ,输入结果保存到一个ASCII文件“chairs.result.txt”中。文件中每一行对应于检测到的线段。每行由七个由空格分隔的数字组成,即
x1, y1, x2, y2, width, p, -log_nfa.
例如: 159.232890 134.369601 160.325338 105.613616 2.735466 0.125000 17.212465
表示检测到从点(159.232890134.369601)开始、结束于点(160.325338 105.613616)且宽度为2.735466的线段。角度精度p为0.125,这意味着梯度角度公差为p180=0.125180=22.5度。检测的NFA值是以10为底的对数值,即-log_10(NFA)=17.212465,因此NFA值为10^(-17.2124656),大致为6e-18。长度单位为像素,坐标原点为左上像素(0,0)的中心。
为了更容易地可视化结果,LSD命令还可以以EPS或SVG文件格式提供输出。命令行为./lsd -P chairs.result.eps chairs.pgm chairs.result.txt
,表示运行lsd程序,输入图像为chairs.pgm ,输入结果保存到一个ASCII文件result.txt中,还保存到一个EPS文件“chairs.result.EPS”中。
要查看完整选项,请执行不带参数的LSD命令,如“./lsd”
注意:可选参数应该总是出现在所需参数的输入和输出之前。例如,下面的行是错误的:./lsd chairs.pgm -s 0.5 chairs.result.txt -> WRONG!!
。正确写法应是./lsd -s 0.5 chairs.pgm chairs.result.txt
,从而修改了LSD算法的默认参数值,将高斯滤波器的图像尺度值s由默认的0.8修改为0.5。