霍夫直线检测进行复杂环境的树干提取

霍夫直线检测进行复杂环境的树干提取

霍夫直线检测是常用的直线检测算法,原理比较简单。

我叙述一下我对霍夫直线检测算法的理解:将像素点在图像中的二维坐标,通过坐标变换转化为极坐标,然后通过比较每个点在极坐标下的角度值,如果角度值相同,则判定为同直线。

该算法有几个可调参数:

C++: void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold, double minLineLength=0, double maxLineGap=0 )

  • 第五个参数,int类型的threshold,累加平面的阈值参数,即识别某部分为图中的一条直线时它在累加平面中必须达到的值。大于阈值threshold的线段才可以被检测通过并返回到结果中。
  • 第六个参数,double类型的minLineLength,有默认值0,表示最低线段的长度,比这个设定参数短的线段就不能被显现出来。
  • 第七个参数,double类型的maxLineGap,有默认值0,允许将同一行点与点之间连接起来的最大的距离。

要想将这个算法使出威力,需要对这几个直线检测算法有足够的了解。本人由于水平有限,搞起来感觉比较失败。

我的代码参考自毛星云的博客,连接如下:

http://blog.csdn.net/poem_qianmo/article/details/26977557

先贴出树干提取前的原图:

图中白色的就是需要提取的树干。很明显,树干非常不清晰,环境干扰量大,十分不好直接分离。

我再贴处理后的最终效果图(由于本人很菜,误检率比较高,漏检率也比较高)

要完成这个直线检测的步骤大概如下(包括图片预处理):

1.RGB转灰度图,这一步一般来说没什么要注意的,提醒一下。如果目标在某一个通道(R、G、B)和环境相差很大,最好保留这个通道作为灰度图。本例中由于树干为白色,就不用考虑这个

2.选择合适阈值进行二值化,(域值的参数选择很重要,必须能去除大部分干扰)。

3.删除小面积连通域。去除一些不可能是树干的小干扰。

4.树干骨架提取,便于直线检测。

5.霍夫直线检测。

由于霍夫直线检测需要调整的参数太多,可以将参数设为不同的滑动条,通过滑动滑动条来寻找合适参数。

时间: 2024-10-19 19:41:27

霍夫直线检测进行复杂环境的树干提取的相关文章

霍夫直线检测算法进行树干提取

霍夫直线检测算法进行树干提取 霍夫直线检测是常用的直线检测算法,原理比较简单. 我叙述一下我对霍夫直线检测算法的理解:将像素点在图像中的二维坐标,通过坐标变换转化为极坐标,然后通过比较每个点在极坐标下的角度值,如果角度值相同,则判定为同直线. 该算法有几个可调参数: C++: void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold, double minLineLe

【练习6.8】霍夫直线变换、圆变换,cvCanny边缘检测,找圆找直线

提纲 题目要求 程序代码 结果图片 要言妙道 题目要求: 使用霍夫直线变换和霍夫圆变换 a.找圆 b.找直线 程序代码: 1 // OpenCVExerciseTesting.cpp : 定义控制台应用程序的入口点. 2 // 3 //D:\\Work\\Work_Programming\\Source\\Image\\lena.jpg 4 5 6 #include "stdafx.h" 7 #include <cv.h> 8 #include <highgui.h&

opencv 检测图像线条 霍夫线检测

1 # Writer : [email protected] 2 3 # Data : 2020.3.21 4 5 import cv2 as cv 6 7 import numpy as np 8 9 img = cv.imread('../paojie.jpg') 10 11 gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY) 12 13 # 50,150 为二值化时的阈值 apertureSize为Sobel滤波器的大小 14 15 edges = cv.C

霍夫圆检测 opencv

进行霍夫圆变换中有一个API:HoughCircles(). 第五个参数为double类型的minDist(),为霍夫变换检测到的圆的圆心之间的最小距离,即让算法能明显区分的两个不同圆之间的最小距离.这个参数如果设置太小,多个相邻的圆可能被错误的检测成了一个重合的圆.反之,如果设置太大,某些圆就不能检测出来. 第七个参数,它越小,就越可以检测到更多根本不存在的圆,而它越大的话,能通过检测的圆就更加接近完美的圆形了. 1 #include<opencv2/opencv.hpp> 2 3 usin

Python+OpenCV图像处理(十四)—— 直线检测

简介: 1.霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法.主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等).最基本的霍夫变换是从黑白图像中检测直线(线段). 2.Hough变换的原理是将特定图形上的点变换到一组参数空间上,根据参数空间点的累计结果找到一个极大值对应的解,那么这个解就对应着要寻找的几何形状的参数(比如说直线,那么就会得到直线的斜率k与常熟b,圆就会得到圆心与半径等等) 3.霍夫线变

Python+OpenCV图像处理之直线检测

霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法.主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等). python实现 import cv2 import numpy as np # 使用霍夫直线变换做直线检测,前提条件:边缘检测已经完成 __author__ = "boboa" # 标准霍夫线变换 def line_detection_demo(image): gray = cv2.cvtColor(image, cv2.COLO

opencv之霍夫曼变换

霍夫变换不仅可以找出图片中的直线,也可以找出圆,椭圆,三角形等等,只要你能定义出直线方程,圆形的方程等等. 不得不说,现在网上的各种博客质量真的不行,网上一堆文章,乱TM瞎写,误人子弟.本身自己就没有理解的很清楚,又不去读算法实现的源码,写的云山雾罩的,越看越懵逼. 霍夫变换本身的思路是很简明的.这篇文章我们就以霍夫直线变换说明算法的思想. 霍夫变换 思考一下,二维平面里我们怎么表达直线. 有两种表达方式: 直角坐标系(也叫笛卡尔坐标系) 极坐标系(也叫球坐标系) 第一种就是最常见的直角坐标系下

OpenCV——霍夫变换(直线检测、圆检测)

x 1 #include <opencv2/opencv.hpp> 2 #include <iostream> 3 #include <math.h> 4 5 using namespace cv; 6 using namespace std; 7 8 9 int main(int argc, char** argv) 10 { 11 Mat src, src_gray, dst; 12 src = imread("test1.jpg"); 13 1

python数字图像处理(15):霍夫线变换

在图片处理中,霍夫变换主要是用来检测图片中的几何形状,包括直线.圆.椭圆等. 在skimage中,霍夫变换是放在tranform模块内,本篇主要讲解霍夫线变换. 对于平面中的一条直线,在笛卡尔坐标系中,可用y=mx+b来表示,其中m为斜率,b为截距.但是如果直线是一条垂直线,则m为无穷大,所有通常我们在另一坐标系中表示直线,即极坐标系下的r=xcos(theta)+ysin(theta).即可用(r,theta)来表示一条直线.其中r为该直线到原点的距离,theta为该直线的垂线与x轴的夹角.如