Hough变换检测直线..doc
文本预览下载声明
Hough变换检测直线实验报告
一,实验要求
用hough算法检测图像中的直线算法。使用这一算法来求一幅图像中的所有大于规定长度的直线段,设规定的长度为20点。
二,Hough变换简介
Hough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的一个点。这样就把原始图像中给定曲线的检测问题转化为寻找参数空间中的峰值问题。
图1 Hough变换
如上图所示,在图像空间,直线上一点转换到参数空间就是一条曲线,而且,图像空间同一直线上的点转换到参数空间的曲线一定相交于一点,即参数空间各曲线的交点对应着图像空间的一条直线,这样,检测参数空间曲线交点就检测出了图像空间的直线。
三,实验过程和结果分析
用Hough变换之前, 首先要对图像进行边缘检测的处理,也即霍夫线变换的直接输入只能是边缘二值图像。本实验基于VS2008和OPENCV来实现。实验的步骤如下:
(1)读入图像,转换成灰度图像
OPENCV中用cvLoadImage函数来读取图像,函数原型:IplImage* cvLoadImage( const char* filename, int flags=CV_LOAD_IMAGE_COLOR );
filename :要被读入的文件的文件名(包括后缀);
flags :指定读入图像的颜色和深度;
例如:cvLoadImage( filename, -1 ); //默认读取图像的原通道数
cvLoadImage( filename, 0 ); //强制转化读取图像为灰度图
cvLoadImage( filename, 1 ); //读取彩色图
进行边缘检测
本实验选择Canny算子的边缘检测,OPENCV中用Canny函数来进行Canny算子的边缘检测,函数原型为:void cvCanny( const CvArr* image, CvArr* edges, double threshold1, double threshold2, int aperture_size=3 );
image:单通道输入图像
edges:单通道存储边缘的输出图像
threshold1 :第一个阈值
threshold2 :第二个阈值
aperture_size :算子内核大小
3,对检测出的二值图像进行Hough变换
OPENCV中用cvHoughLines2函数来进行Hough变换,函数原型为:
CvSeq* cvHonghLines2(CvArr* image,void* line_storage,int mehtod,double rho,double theta,int threshold,double param1 =0,double param2 =0);
Image:输入8-比特、单通道(二值)图像
line_storage:检测到的线段存储仓
Method:Hough 变换变量,是下面变量的其中之一
CV_HOUGH_STANDARD ——传统或标准 Hough 变换
CV_HOUGH_PROBABILISTIC——概率 Hough 变换
绘制连接两个点的线段,函数原型为:
void cvLine( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1, int line_type=8, int shift=0 );
img 图像
pt1:线段的第一个端点
pt2:线段的第二个端点
Color:线段的颜色
Thickness:线段的粗细程度
line_type:线段的类型
8 (or 0) - 8-connected line(8邻接)连接 线
4 - 4-connected line(4邻接)连接线
CV_AA - antialiased:线条
Shift:坐标点的小数点位数
程序代码如下:
#include cv.h
#include iostream
#include highgui.h
using namespace std;
int main()
{
char *path=D:\\zhi2.png;
IplImage * src_Img=NULL;
src_Img=cvLoadImage(path ,1);//加载图像
if(!src_Img)
return -1;
//显示原图像
cvNamedWindow(E1,CV_WINDOW_AUTOSIZE);
cvShowImage(E1,src
显示全部