hough变换提取直线(Matlab实现)
Hough变换直线检测MatLab代码.doc

Hough变换直线检测MatLab代码function Img_hough = hough_s(Img, bw)%该函数实现hough变换提取直线的功能。
%输入图像x,运行Z后直接画出直线。
%选择进行Hough变换的图像行%Img为原图像;bw为边缘图像%%[H,W,D]=size(Img);Img_hough = Img;讦D==lchannel = Img_hough;Img_hough = cal(3,channel, channel, channel); end[M,N]=size(bw);%求出图像大小。
%%dtheta=l;drho=l;md=ceil((N+round(sqrt(M A2+N A2)))/drho);%确定网格的最大区域。
ma=ceil(l 8O/dtheta); numrhotheta=zeros(md,ma);%产生计数矩阵。
coordrhotheta=cell( 1,1);% para=cell(l,3);❷II数组相当于c语言中的指针,可动态的改变大小。
for i=l:mdfor j=l:macoordrhotheta{ i,j}=[J;endend%产生空网格。
ymin = 5;ymax = M - 4;for i=ymin:ymaxforj=l:Nif bw(i,j) == 1for k=l:marho=round((j *cos(dtheta*k*pi/180)+i*sin(dtheta*k*pi/180))/drho); %根据直线的法线式表示,计算出平面上不同点的hough变换值。
rho=rho+ceil(N/drho);%可能的最大负值。
numrhotheta(rho+1 ,k)=numrhotheta(rho+1 ,k)+1;%将hough变换值相应位置的计数值加1。
coordrhotheta {rho+ l,k}=[coordrhotheta {rho+ l,k);[ij]];%记录hough变换值相应位置对应的点的坐标。
Hough变换直线检测MatLab代码

Hough变换直线检测MatLab代码一.function Img_hough = hough_s(Img, bw)%该函数实现hough变换提取直线的功能。
%输入图像x,运行之后直接画出直线。
%选择进行Hough变换的图像行%Img为原图像;bw为边缘图像%%[H,W,D]=size(Img);Img_hough = Img;if D==1channel = Img_hough;Img_hough = cat(3,channel, channel, channel); end[M,N]=size(bw);%求出图像大小。
%%dtheta=1;drho=1;md=ceil((N+round(sqrt(M^2+N^2)))/drho);%确定网格的最大区域。
ma=ceil(180/dtheta);numrhotheta=zeros(md,ma);%产生计数矩阵。
coordrhotheta=cell(1,1);% para=cell(1,3);�ll数组相当于c语言中的指针,可动态的改变大小。
for i=1:mdfor j=1:macoordrhotheta{i,j}=[];endend%产生空网格。
ymin = 5;ymax = M - 4;for i=ymin:ymaxfor j=1:Nif bw(i,j) == 1for k=1:marho=round((j*cos(dtheta*k*pi/180)+i*sin(dtheta*k*pi/180))/drho);%根据直线的法线式表示,计算出平面上不同点的hough变换值。
rho=rho+ceil(N/drho);%可能的最大负值。
numrhotheta(rho+1,k)=numrhotheta(rho+1,k)+1;%将hough变换值相应位置的计数值加1。
coordrhotheta{rho+1,k}=[coordrhotheta{rho+1,k};[i,j]];%记录hough变换值相应位置对应的点的坐标。
数字图像处理Hough变换直线检测matlab实现

数字图像处理—Hough 变换直线检测,matlab 实现实验八Hough 变换直线检测一、实验目的理解Hough变换的原理,了解其应用;掌握利用Hough变换进行直线检测的处理过程及编程方法。
二、实验内容利用Hough变换检测直线通常先进行边缘检测,得到只包含边缘的二值图像。
再通过Hough变换,在参数空间检测图像共线点的数量得到直线参数,从而实现直线检测。
1、读入图像(图像需有直线或直线性边缘) 2 、进行图像边缘,得到二值图像3、实现Hough变换,检测出图像中的直线方程4、输出结果三、实验要求1、编写代码,完成各项实验内容2、总结实验中遇到问题及解决方案,书写实验报告%Hougl变换clc;clear;close all f=imread('l in e.bmp'); % 若是彩色图片转灰度化if len gth(size (f) )>2f=rgb2gray(f);end%figure(1)subplot(121);imshow(f); % 利用edge函数进行边缘检测j=edge(f,'Sobel');subplot(122);imshow(j); [row,col]=size(j);pi nfan g=ro un d((row*row+col*colF0.5);A=zeros(2*pinfang,180);for m=1:rowfor n=1:colif j(m,n)>0for thera=1:180r=thera/180*pi; % 角度转弧度rho=round(m*cos(r)+n*sin(r));% p =cos 0 +sin 0rho=rho+pinfang+1;%-l:l 转换到1:2l+1A(rho,thera)=A(rho,thera)+1;endendendend[rho,the⑻二仙d(A>40);% 交点超过60条线的点,ma,na为参数空间的坐标点nma=length(rho);for i=1:nmahold onm=1:row;%rho=ma(i)-1;r=thera(i)/180*pi;n=(rho(i)-pinfang-m*cos(r))/(0.00001+sin(r));end。
hough变换 matlab例程

以下是一个简单的MATLAB例程,演示如何使用Hough变换来检测图像中的直线。
假设你已经有一个名为`image.jpg`的图像文件,你可以使用以下代码来进行Hough变换:读取图像I = imread('image.jpg');将图像转换为灰度图Igray = rgb2gray(I);执行边缘检测BW = edge(Igray, 'canny');执行Hough变换[H,theta,rho] = hough(BW);找到峰值P = houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));找到直线lines = houghlines(BW,theta,rho,P,'FillGap',5,'MinLength',7);绘制图像和检测到的直线figure, imshow(I), hold onfor k = 1:length(lines)xy = [lines(k).point1; lines(k).point2];plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');% 为每条直线绘制端点plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');end在这个例程中,我们首先读取图像,然后将其转换为灰度图像,并执行Canny边缘检测。
接下来,我们使用Hough变换来检测直线,并找到其中的峰值。
最后,我们使用`houghlines`函数找到图像中的直线,并将其绘制在原始图像上。
hough变换检测直线原理matlab

Hough变换是一种图像处理技术,它可以被用来检测图像中的直线。
Hough变换的原理是通过将图像空间中的像素点转换到参数空间中来对直线进行检测。
在参数空间中,每条直线都可以被表示为一组参数,如直线的斜率和截距。
在matlab中,可以使用hough变换来检测图像中的直线。
下面我们来介绍一下在matlab中如何使用hough变换来检测直线。
1. 预处理图像在使用hough变换之前,首先需要对图像进行预处理。
可以通过灰度化、边缘检测等处理方法来提取出图像中的直线信息,以便于后续的检测。
2. 进行hough变换在matlab中,可以使用函数hough来进行hough变换。
该函数的调用格式为:[H,T,R] = hough(BW)其中,BW是经过预处理的二值图像,H是hough变换的结果矩阵,T和R分别是参数空间中的角度和距离。
3. 检测直线在获得了hough变换的结果矩阵之后,可以使用函数houghpeaks来检测出图像中的直线。
该函数的调用格式为:P = houghpeaks(H,5)其中,H是hough变换的结果矩阵,5表示要检测的直线数量。
4. 获取直线参数一旦检测出了直线,就可以使用函数houghlines来获取直线的参数。
该函数的调用格式为:lines = houghlines(BW,T,R,P)其中,BW是经过预处理的二值图像,T和R分别是参数空间中的角度和距离,P是检测出的直线。
5. 绘制直线可以使用函数imshow来在原图上绘制出检测到的直线。
该函数的调用格式为:imshow(BW)hold onfor k = 1:length(lines)xy = [lines(k).point1; lines(k).point2];plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');endhold off通过以上步骤,就可以在matlab中使用hough变换来检测图像中的直线。
基于matlab的直线检测原理

基于matlab的直线检测原理
基于Matlab的直线检测原理涉及到一种称为霍夫变换的方法。
霍夫变换是一种在图像处理中常用的方法,用于检测图像中的直线。
下面是基于Matlab的直线检测原理的具体步骤:
1. 读取图像:首先,在Matlab中读取需要进行直线检测的图像。
2. 边缘检测:使用Matlab提供的边缘检测算法(例如Canny
算法)来检测图像中的边缘。
这可以通过调用Matlab中的imedge函数来实现。
3. 霍夫变换:使用Matlab中的hough函数来执行霍夫变换。
霍夫变换将边缘图像转换为霍夫空间,其中每个点对应于直线在原始图像中的参数。
通过设置适当的阈值和其他参数,可以控制检测到的直线的数量和质量。
4. 直线提取:通过分析霍夫变换的结果,在霍夫空间中找到具有最高数量的交点,这些交点对应于图像中的直线。
可以使用Matlab的houghpeaks函数来找到霍夫空间中的交点。
5. 直线可视化:使用Matlab中的houghlines函数来提取直线
的位置和角度,并在原始图像上绘制检测到的直线。
这将帮助用户看到直线检测的结果。
需要注意的是,直线检测的结果可能会受到图像质量、边缘检
测算法的选择和参数设置的影响。
因此,在实际应用中,可能需要不断调整参数以获得更好的直线检测结果。
matlab线检测原理

matlab线检测原理
在 MATLAB 中进行线检测通常涉及使用 Hough 变换。
Hough 变
换是一种经典的图像处理技术,用于检测图像中的直线。
其原理是
将图像空间中的像素点映射到参数空间中,从而在参数空间中找到
共线的像素点。
在 MATLAB 中,可以使用 `hough` 函数来执行Hough 变换。
该函数将图像转换为 Hough 空间,并返回一个称为Hough 变换矩阵的二维数组,其中包含了检测到的直线的参数。
然
后可以使用 `houghpeaks` 函数来找到 Hough 变换矩阵中的峰值,
这些峰值对应于检测到的直线。
最后,使用 `houghlines` 函数来
从峰值和 Hough 变换矩阵中提取直线的位置和角度信息。
通过这些
步骤,可以在 MATLAB 中实现对图像中直线的检测。
值得注意的是,Hough 变换的参数设置和后续处理步骤的选择都会影响线检测的性
能和准确性。
用matlab实现hough变换的直线检测.

用matlab实现hough变换的直线检测 RGB = imread('fenkuai.bmp';%jaynes-thesis I=rgb2gray(RGB; % 图片用的是灰度图像, [x,y]=size(I; BW=edge(I;figure;imshow(I;title('原图' figure;imshow(BW;title('边缘检测图像'rho_max=floor(sqrt(x^2+y^2+1; %由原图数组坐标算出ρ最大值,并取整数部分加1 %此值作为ρ,θ坐标系ρ最大值 accarray=zeros(rho_max,180; %定义ρ,θ坐标系的数组,初值为0。
%θ的最大值,180度 Theta=[0:pi/180:pi]; %定义θ数组,确定θ取值范围 for n=1:x, for m=1:y if BW(n,m==1 for k=1:180 %将θ值代入hough变换方程,求ρ值 rho=(m*cos(Theta(k+(n*sin(Theta(k; %将ρ值与ρ最大值的和的一半作为ρ的坐标值(数组坐标),这样做是为了防止ρ值出现负数rho_int=round(rho/2+rho_max/2; %在ρθ坐标(数组)中标识点,即计数累加accarray(rho_int,k=accarray(rho_int,k+1; end end end end %figure;colormap gray;%imagesc(accarray;title('hough变换后的图' %xlabel('\theta', ylabel('\rho'; %=====下面程序的显示效果没上面好=====% %accarray=uint8(accarray; %转换后会丢数据%figure;imshow(accarray;title('hough变换后的图' %xlabel('\theta', ylabel('\rho'; %axis on, axis normal, hold on; %=======利用hough变换提取直线======% %寻找100个像素以上的直线在hough变换后形成的点 K=1; %存储数组计数器 forrho_n=1:rho_max %在hough变换后的数组中搜索 for theta_m=1:180 ifaccarray(rho_n,theta_m>=10 %设定直线的最小值。
Matlab实现——霍夫变换直线检测(2)

Matlab实现——霍夫变换直线检测(2)在上一篇博客中发现经过霍夫变换检测出的直线有可能因为车辆挡住路沿等原因断开,形成线段,这样就不好了,因为检测道路是要找直线焦点。
Thus it is necessary to combine 相同斜率的直线 and connect them.本代码提供了matlab下求取经过霍夫变换的直线斜率,并将其联合,代码见下方,实验结果见文末。
[plain]view plaincopy1.% 入口图像为 BW,出口图像为f2.%optimize from main_optimize, merely select 2 lines, one has positive3.%slope,the other has negative slope4.clear all,close all5.BW=imread('D:\Images\NEW\img4b9faef664e03.jpg');6.figure,imshow(BW);7.8.BW=rgb2gray(BW);9.%thresh=[0.01,0.17];10.thresh=[0.01,0.10];11.sigma=2;%定义高斯参数12. f = edge(double(BW),'canny',thresh,sigma);13.figure,subplot(121);14.imshow(f,[]);15.title('canny Edge Detect Result');16.17.[H, theta, rho]= hough(f, 0.1);%cos(theta)*x+sin(theta) *y=rho18.%imshow(theta,rho,H,[],'notruesize'),axis on,axis norm al19.%xlabel('\theta'),ylabel('rho');20.21.[r,c]=houghpeaks(H,10);22.hold on23.24.25.lines=houghlines(f,theta,rho,r,c);26.27.subplot(122);28.imshow(f,[]),title('Hough Transform Detect Result'),hold on29.nlind=0;%new line index30.st=1;31.%%%%%%%%%求斜率%%%%%%%%%%%%32.for k=1:length(lines)33.%xy=[lines(k).point1;lines(k).point2];34.xielv(k)=(lines(k).point2(1)-lines(k).point1(1))/(lines(k).point2(2)-lines(k).point1(2)+0.0001)35.end36.37.%%%%%%%%%将相同斜率的直线连起来%%%%%%%%%%%%38.k=1;39.while(k<=length(lines))40.if(k~=length(lines))41.k=k+1;42.end43.while(abs(xielv(k)-xielv(k-1))<0.0001)44.k=k+1;45.if(k>length(lines))46.break;47.end48.end49.50.if(abs(xielv(k-1))<0.05||abs(xielv(k-1))>=10)%eliminate horizontal and vertical lines,防治水平线和楼房51.st=k;52.if(k~=length(lines))53.continue;54.end55.end56.57.if(st==length(lines)&&k==st)58.if(abs(xielv(k))>0.05&&abs(xielv(k))<10)59.nlind=nlind+1;60.newlines(nlind)=lines(st);61.newlines(nlind).point2=lines(k).point2;62.newxy=[newlines(nlind).point1;newlines(nlind).point2];63.plot(newxy(:,2),newxy(:,1),'LineWidth',4,'Color',[.6 1.0 .8 ]);64.end65.break;66.end67.68.%end=k-1,start=st; draw line69.nlind=nlind+1;70.newlines(nlind)=lines(st);71.newlines(nlind).point2=lines(k-1).point2;72.newxy=[newlines(nlind).point1;newlines(nlind).point2];73.plot(newxy(:,2),newxy(:,1),'LineWidth',4,'Color',[.6 1.0 .8 ]);74.75.st=k;76.end77.78.fprintf('%d lines are detected in sum.\n',nlind);实验结果:原图:未优化的霍夫变换:优化后:。
matlab hough变换

matlab hough变换
Hough变换是一种图像处理技术,用于检测形状的特定模式,如直线、圆或椭圆。
Hough变换是一种基于数学算法的变换,用于将图像转换为参数空间,并在参数空间中查找由原始图像中的点组成的模式。
然后,可以从参数空间中恢复原始的模式。
在matlab中,Hough变换可以通过hough函数实现。
它需要一个二值图像作为输入,该图像中白色像素表示待检测的模式,黑色像素表示背景。
Hough函数将返回一个二维矩阵H,其中每个单元格表示了直线通过该点的数量。
这个矩阵可以通过调用imshow函数进行可视化。
接下来,可以使用houghpeaks函数来查找H矩阵中的峰值。
峰值表示在给定参数下被多次检测到的模式。
houghpeaks函数需要指定最大峰数和最小峰距离等参数,以控制寻找峰值的过程。
最后,在找到峰值之后,可以使用houghlines函数来提取原始图像中检测到的直线。
houghlines函数需要指定H矩阵、峰值位置和可选的阈值参数,以确定提取直线的位置。
总的来说,Hough变换是一种非常有用的图像处理技术,可以用于检测和提取各种模式,特别是形状的模式。
MATLAB中的Hough变换函数使其易于使用和实施。
用Hough变换检测直线和圆

特殊图像变换1、HoughLines功能:利用Hough 变换在二值图像中找到直线格式:CvSeq* cvHoughLines2( CvArr* image, void* line_storage, int method, double rho, double theta, int threshold,double param1=0, double param2=0 );参数:image:输入8-比特、单通道(二值) 图像,其内容可能被函数所改变line_storage:检测到的线段存储仓. 可以是内存存储仓(此种情况下,一个线段序列在存储仓中被创建,并且由函数返回),或者是包含线段参数的特殊类型(见下面)的具有单行/单列的矩阵(CvMat*)。
矩阵头为函数所修改,使得它的cols/rows将包含一组检测到的线段。
如果line_storage是矩阵,而实际线段的数目超过矩阵尺寸,那么最大可能数目的线段被返回(线段没有按照长度、可信度或其它指标排序).method:Hough 变换变量,是下面变量的其中之一:∙CV_HOUGH_STANDARD- 传统或标准Hough 变换. 每一个线段由两个浮点数(ρ, θ) 表示,其中ρ 是点与原点(0,0) 之间的距离,θ 线段与x-轴之间的夹角。
因此,矩阵类型必须是CV_32FC2 type.∙CV_HOUGH_PROBABILISTIC - 概率Hough 变换(如果图像包含一些长的线性分割,则效率更高). 它返回线段分割而不是整个线段。
每个分割用起点和终点来表示,所以矩阵(或创建的序列)类型是CV_32SC4.∙CV_HOUGH_MULTI_SCALE- 传统Hough 变换的多尺度变种。
线段的编码方式与CV_HOUGH_STANDARD 的一致。
rho:与象素相关单位的距离精度theta:弧度测量的角度精度threshold:阈值参数。
如果相应的累计值大于threshold,则函数返回的这个线段.param1:第一个方法相关的参数:∙对传统Hough 变换,不使用(0).∙对概率Hough 变换,它是最小线段长度.∙对多尺度Hough 变换,它是距离精度rho的分母(大致的距离精度是rho而精确的应该是rho / param1 ).param2:第二个方法相关参数:∙对传统Hough 变换,不使用(0).∙对概率Hough 变换,这个参数表示在同一条直线上进行碎线段连接的最大间隔值(gap), 即当同一条直线上的两条碎线段之间的间隔小于param2时,将其合二为一。
hough变换提取直线(Matlab实现)

Hough变换提取直线一、实验目标实现用Hough变换检测直线的算法二、实验内容1、读入图像选取有较多直线及部分曲线以作对比的图像作为实验素材,这里我们必须使用彩色图像(有些看似灰度图像的实际属性也是彩色图像),原因下面有详解。
2、检测图像边缘如果一个像素落在图像中某一个物体的边界上,那么它的邻域将成为一个灰度级变化的带。
对这种变化最有用的两个特征是灰度的变化率和方向,他们分别用梯度向量的幅度和方向来表示。
边缘检测算子检查每个像素的邻域并对灰度变化率进行量化,通常也包括方向的确定。
有若干种算子可以使用,大多数是基于方向导数掩模求卷积的方法。
如Roberts算子,Sobel算子,Prewitt算子,Log算子等。
这里采用Log算子提取图像边缘,再用均值滤波去除边缘图像噪声。
3、实现Houg变换,检测出图像中的直线Hough变换是一种利用图像的全局特征将特定形状的边缘连接起来,形成连续平滑边缘的一种方法。
它通过将源图像上的点影射到用于累加的参数空间,实现对已知解析式曲线的识别。
这里先对边缘图像进行二值化处理,然后再用hough变换提取直线,最后用红色标记之。
因为处理过程中需使用灰度图像,但最后无法给灰度图像赋颜色(会出错或效果不好),只能给彩色图像赋颜色,故最初输入时请使用彩色图像。
4、Matlab代码如下:f=imread('3.png');%读入彩色图像,注意不能使用灰度图像o=f; %保留彩色原图f=rgb2gray(f);%将彩色图像转换为灰度图像,f=im2double(f);figure();subplot(2,2,1);imshow(o);title('原图');[m,n]=size(f);%得到图像矩阵行数m,列数nfor i=3:m-2for j=3:n-2%处理领域较大,所以从图像(3,3)开始,在(m-2,n-2)结束l(i,j)=-f(i-2,j)-f(i-1,j-1)-2*f(i-1,j)-f(i-1,j+1)-f(i,j-2)-2*f(i,j-1)+16*f(i,j)-2*f(i,j+1)-f(i,j+2)-f(i+1,j-1)-2*f(i+1,j)-f(i+1,j+1)-f(i+2,j);%LoG算子endendsubplot(2,2,2);imshow(l);title('LoG算子提取图像边缘');[m,n]=size(l);for i=2:m-1for j=2:n-1y(i,j)=l(i-1,j-1)+l(i-1,j)+l(i-1,j+1)+l(i,j-1)+l(i,j)+l(i,j+1)+l( i+1,j-1)+l(i+1,j)+l(i+1,j+1);y(i,j)=y(i,j)/9; %LoG算子提取边缘后,对结果进行均值滤波以去除噪声,为下一步hough变换提取直线作准备endendsubplot(2,2,3);imshow(y);title('均值滤波器处理后')q=im2uint8(y);[m,n]=size(q);for i=1:mfor j=1:nif q(i,j)>80; %设置二值化的阈值为80q(i,j)=255; %对图像进行二值化处理,使图像边缘更加突出清晰elseq(i,j)=0;endendendsubplot(2,2,4);imshow(q);title('二值化处理后');%Hough变换检测直线,使用(a,p)参数空间,a∈[0,180],p∈[0,2d]a=180; %角度的值为0到180度d=round(sqrt(m^2+n^2)); %图像对角线长度为p的最大值s=zeros(a,2*d); %存储每个(a,p)个数z=cell(a,2*d); %用元胞存储每个被检测的点的坐标for i=1:mfor j=1:n%遍历图像每个点if(q(i,j)==255)%只检测图像边缘的白点,其余点不检测for k=1:ap = round(i*cos(pi*k/180)+j*sin(pi*k/180));%对每个点从1到180度遍历一遍,取得经过该点的所有直线的p值(取整) if(p > 0)%若p大于0,则将点存储在(d,2d)空间s(k,d+p)=s(k,d+p)+1;%(a,p)相应的累加器单元加一 z{k,d+p}=[z{k,d+p},[i,j]'];%存储点坐标elseap=abs(p)+1;%若p小于0,则将点存储在(0,d)空间 s(k,ap)=s(k,ap)+1;%(a,p)相应的累加器单元加一z{k,ap}=[z{k,ap},[i,j]'];%存储点坐标endendendendendfor i=1:afor j=1:d*2 %检查每个累加器单元中存储数量if(s(i,j) >70) %将提取直线的阈值设为70lp=z{i,j};%提取对应点坐标for k=1:s(i,j)%对满足阈值条件的累加器单元中(a,p)对应的所有点进行操作o(lp(1,k),lp(2,k),1)=255; %每个点R分量=255,G分量=0,B分量=0o(lp(1,k),lp(2,k),2)=0;o(lp(1,k),lp(2,k),3)=0; %结果为在原图上对满足阈值要求的直线上的点赋红色endendendendfigure,imshow(o);title('hough变换提取直线');5、实验结果附:两个参数的调节1.二值化图像的细节多少可以通过对二值化的阈值调节来控制,阈值越大,细节越少。
霍夫变换找直线 matlab 高分课程论文代码

for i=1:n %对于画板上所有的点
if(yr(i)>=1 && yr(i)<=m) %在1~m的值才有效和用&&符号,减少计算量
if I(xr(i),yr(i)) ==0 %当是黑点的时候
%程序到这一步,基本求出了所在的直线方程,但是,由于生成直线的时候
%也是相对粗糙近似将列下标取整,使得对于每条直线,计算出来的可能会
%返回几组直线数据,但是对于每一条直线的几组数据rho或theta很接近。
%下边的工作就是将每条直线的几组相近数据归一到一对rho跟theta上,
%大致方法是:对于生成出来的r2跟theta2中,同一直线的几组相近数据
if xmin == 0 %把第一个黑点的x坐标记录下来
xmin=i; %记录结果为i刚好是对应的x坐标值
end
xmax=i;%在循环到最后一个黑点时,记录相应的i则为对应的x坐标值
function [theta,rho] = find_Line(I)
% 二值图像中识别出所有线段
% I : 输入二值图像,其中0表示黑点,1表示白点
% rho : 列向量,每个元素表示直线与原点的垂直线的长度
% theta : 列向量,每个元素表示直线与原点的垂直线的角度
[a,b]=find(I==0); %黑点的坐标
s=sum(sum(I==0)); %黑点的个数
[aa,bb]=size(I); %图像的大小
thr=ceil(length(I)/10); %阈值取图像的十分之一长度
cc=ceil(sqrt(aa^2+bb^2));%由于rho有负值,此处先给定负值可能的最
霍夫直线检测matlab

霍夫直线检测matlab霍夫直线检测——matlab实现一、霍夫直线检测是什么?霍夫直线检测又称“霍夫变换”,是一种运用数学形态学的技术,用于对图像中的线条进行检测的一种算法。
它是一种非常有用的图像处理算法,常被用于机器视觉、机器人导航、边界检测以及机器学习等领域。
二、matlab中的霍夫直线检测1、利用matlab中的函数实现霍夫直线检测matlab中有专用于实现霍夫直线检测的函数,名为houghlines。
其格式为:[H,theta,rho] = houghlines(BW,theta,rho,peaks) 其中BW是要检测的二值图像,theta是取值范围0~pi,rho是取值范围0~Inf,peaks是一个由高累计峰值的行列对组成的矩阵,可以通过houghpeaks函数进行计算得到。
调用houghlines函数时可以将上述几个参数传递给函数,函数会返回一个H矩阵,它是hough 变换投影的累积值的矩阵,用来定位图像中的直线,theta和rho是检测出来的直线的所有参数。
2、用HCircles函数实现霍夫圆检测matlab中还有一个用于实现霍夫圆检测的函数,名为houghcircles。
其格式为:[centers, radii] = houghcircles( BW, mindist,edgesensitivity, suppressradius, suppresscenter, pixelspacing )其中,BW是要检测的二值图像,minDist是圆心之间的最小间距,edgeSensitivity是控制边缘检测强度,suppressRadius是控制圆半径的最小系数,suppressCenter是控制圆心的最小系数,pixelSpacing是控制圆检测的精度。
调用houghcircles函数传递上述参数,函数会返回识别出来的圆心和其半径的参数,从图像中检测出圆的信息。
hough变换检测曲线的原理matlab

Hough变换是一种常用于检测曲线、直线等几何形状的图像处理算法。
其原理是利用数学变换将图像空间中的像素点映射到参数空间中,从而使得在参数空间中的形状更加容易被检测出来。
在matlab中,可以通过使用内置的hough函数来实现Hough变换,下面将介绍Hough变换检测曲线的原理以及在matlab中的实现步骤。
一、Hough变换检测曲线的原理1. 直线检测原理Hough变换最常用于检测直线,在直线检测中,我们需要将图像空间中的像素点映射到参数空间中,其中直线的参数表示为(r,θ),其中r表示直线与图像原点的距离,θ表示直线与x轴的夹角。
对于图像空间中的每一个边缘点,我们可以通过一定的计算得到其对应的参数空间中的曲线,然后通过计数器来统计每条直线曲线上的交点数,最终可以得到图像中的直线。
2. 曲线检测原理除了直线检测,Hough变换也可以用于检测曲线。
在曲线检测中,我们需要使用更复杂的参数表示来描述曲线,常见的参数表示方法包括极径-极角表示、直角坐标-曲率表示等。
同样地,通过将图像空间中的像素点映射到参数空间中,并进行统计计数,最终可以得到图像中的曲线。
二、在matlab中实现Hough变换检测曲线的步骤1. 读取图像我们需要使用matlab内置的imread函数来读取待处理的图像,将其转换为灰度图像,并进行边缘检测,以便后续的Hough变换处理。
2. Hough变换通过使用matlab内置的hough函数,可以对边缘图像进行Hough变换处理,得到参数空间中的曲线信息。
在使用hough函数时,需要设置合适的参数,包括极坐标参数的取值范围、极坐标参数空间的分辨率等。
3. 边缘检测从Hough变换的结果中,我们可以得到曲线在参数空间中的曲线,通过进一步的处理和阈值设定,可以将曲线的交点进行统计并筛选出来。
4. 反变换通过对参数空间中的曲线进行反变换,可以将得到的曲线参数转换回图像空间中的曲线,从而在原始图像中标出检测到的曲线。
边缘检测与Hough变换实验报告Matlab

边缘检测与Hough变换实验目的:写一段代码实现一幅图像,其中分为以下两个步骤1.使用Matlab中的canny算子进行边缘检测,可以让使用者交互式的输入不同的Sigma的值实现边缘检测。
2.运用Hough变换来找到最突出的边缘,在图像中找到并画出最长的直线。
实验原理:canny算子边缘检测的基本原理是:采用二维高斯函数的任一方向上的一阶方向导数为噪声滤波器,通过与图像f(x,y)卷积进行滤波,然后对滤波后的图像寻找图像梯度的局部极大值,以确定图像边缘。
Canny边缘检测算子是一种最优边缘检测算子。
其实现步骤如下:1)用高斯滤波器平滑图像2)计算滤波后图像梯度的幅值和方向3)对梯度幅值应用非极大值抑制,其过程为找出图像梯度中的局部极大值点,把其他非局部极大值置零,以得到细化的边缘;4)再用双阈值算法检测和连接边缘;使用canny算子的edge函数调用格式为BW=edge(I,'canny');BW=edge(I,'canny',thresh,sigma);BW=edge(I,'canny',thresh);[BW,threshold]=edge(I,'canny',…);2.Hough变换时最常用的直线提取方法,它的基本思想是:将直线上每一个数据点变换为参数平面中的一条直线或曲线,利用共线的数据点对应的参数曲线相交于参数空间中一点的关系,使得直线提取问题转化为计数问题。
Hough变换提取直线的主要优点是受直线中的间隙和噪声影响较小。
Hough检测直线的Matlab实现:在Matlab图像处理工具箱中提供了3个与Hough变换有关的函数,分别为hough函数,houghpeaks函数和houghlines函数。
hough函数的调用格式为[H,theta,rho]=hough(BW);其中BW为二值图像,H为Hough变换矩阵,theta为变换轴间隔θ,rho为元素个数。
Houghpeaks函数是用来提取Hough变换后参数平面上的峰值点。
基于改进hough变换的直线图形快速提取算法

基于改进hough变换的直线图形快速提取算法图形识别是计算机视觉中一个重要的研究方向,在计算机视觉中,图像识别技术对其他研究有重要意义,这个技术用于图像中的直线特征快速提取至关重要。
Hough变换是一种常用的用于直线特征提取的算法,它能够正确地检测出图像中的线段特征,但在图像中的噪声度较高的情况下,其提取效果可能会受到影响。
2、究方法为了提高Hough变换的检测效果,采用改进的Hough变换算法,进行图像中的直线特征提取。
该算法通过添加有限块阈值,大大减少了检测线段特征时,需要处理的像素点个数,进而提高了计算效率,减少了计算负荷。
在实验中,采用MATLAB编程语言,针对改进的Hough 变换算法,对实际的图像进行直线特征的快速提取,分析了噪声环境下,改进的Hough变换算法的精度和提取速度。
二、验结果1、验过程首先,通过设置有限块阈值,完成了计算机图像图像处理和检测轮廓线。
然后采用改进的Hough变换算法,对图像中的线段特征进行快速提取,再按照预定的标准,检测线段特征的位置与方向,最后汇总实验结果,并对实验结果进行分析。
2、度分析结果表明,在添加有限块阈值的情况下,使用改进Hough变换算法,能够有效地减少检测时,需要处理的像素点数量,进而提高算法的检测精度,有效地抵抗高噪声环境的影响,使得检测精度更高。
3、度分析通过实验,发现改进的Hough变换算法,能够有效地提高算法的执行效率,与传统Hough变换算法相比,改进Hough变换算法的算法执行效率可提高50%以上,提高了直线特征提取算法的效率。
三、结以上算法成功地提取了图像中的线段特征,有效地抵抗噪声环境的影响。
改进的Hough变换算法,主要是通过添加有限块阈值的方式,减少了检测线段特征时,需要处理的像素点个数,进而提高了计算效率,提高了检测精度,且提高了算法执行效率。
可以准确地识别出图像中的线段特征,为计算机视觉方向的研究提供了新的思路。
四、论经过实验,改进的Hough变换算法的效果优于传统的Hough变换算法,能够有效地提高检测精度和算法执行效率,准确地识别出图像中的线段特征,为计算机视觉研究提供了新的思路。
数字图像处理课程设计——Hough变换提取直线

摘要为能够有效解决实时直线图形提取问题,提出了一种基于Hough变换(HT)的直线提取算法。
该算法首先分析了数字图像中直线边缘的三种结构特征,提出采用基元结构表示目标边缘点,并在约束条件下计算基元结构的基元倾角。
在此基础上,结合传统的HT的思想对基元结构进行极角约束HT,以获得最终的直线参数。
最后,再用MATLAB软件对该算法进行编程仿真。
实验结果表明,对合成图像和自然图像,该算法能够有效的识别图像中的直线段。
关键词:直线提取;Hough变换;MATLAB;图像处理目录1.课程设计目的 (1)2.课程设计要求 (1)3.MATLAB软件介绍 (1)4.设计背景及基本原理 (2)4.1 Hough变换检测直线的基本原理 (3)4.2 Hough变换的几种基本算法 (4)4.3几种算法的比较与选择 (6)6. MATLAB程序设计与仿真 (7)6.1 MATLAB程序 (7)6.2运行结果与分析 (10)7.总结体会 (11)参考文献 (12)1.课程设计目的数字图像处理课程设计是电子信息工程专业实践教学的一个重要环节,通过本课程设计使学生运用所学知识进行图像处理的实际训练;是对所学知识的提高和综合应用。
通过综合设计,使得学生进一步理解数字图像处理的基本概念、基本原理和基本方法(如掌握图像增强算法、图像复原以及图像压缩方法等),扩展理论知识,培养学生的综合设计能力。
2.课程设计要求1、查阅资料,介绍系统中所设计的主要功能和原理方法;2、介绍各个功能的实现程序及结果;3、附各个功能的实现程序,在程序中做适当的注释,附处理前后效果图;4、测试和调试:按课程设计要求,选用多幅图像对程序进行测试,并提供系统的主要功能实现的效果图。
并在调试中发现的问题做说明;5、说明课程设计中学到的东西和取得的经验总结,心得体会。
3.MATLAB软件介绍MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室),是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Hough变换提取直线
一、实验目标
实现用Hough变换检测直线的算法
二、实验内容
1、读入图像
选取有较多直线及部分曲线以作对比的图像作为实验素材,这里我们必须使用彩色图像(有些看似灰度图像的实际属性也是彩色图像),原因下面有详解。
2、检测图像边缘
如果一个像素落在图像中某一个物体的边界上,那么它的邻域将成为一个灰度级变化的带。
对这种变化最有用的两个特征是灰度的变化率和方向,他们分别用梯度向量的幅度和方向来表示。
边缘检测算子检查每个像素的邻域并对灰度变化率进行量化,通常也包括方向的确定。
有若干种算子可以使用,大多数是基于方向导数掩模求卷积的方法。
如Roberts算子,Sobel算子,Prewitt算子,Log算子等。
这里采用Log算子提取图像边缘,再用均值滤波去除边缘图像噪声。
3、实现Houg变换,检测出图像中的直线
Hough变换是一种利用图像的全局特征将特定形状的边缘连接起来,形成连续平滑边缘的一种方法。
它通过将源图像上的点影射到用于累加的参数空间,实现对已知解析式曲线的识别。
这里先对边缘图像进行二值化处理,然后再用hough变换提取直线,最后用红色标记之。
因为处理过程中需使用灰度图像,但最后无法给灰度图像赋颜色(会出错或效果不好),只能给彩色图像赋颜色,故最初输入时请使用彩色图像。
4、Matlab代码如下:
f=imread('3.png');%读入彩色图像,注意不能使用灰度图像
o=f; %保留彩色原图
f=rgb2gray(f);%将彩色图像转换为灰度图像,
f=im2double(f);
figure();
subplot(2,2,1);imshow(o);title('原图');
[m,n]=size(f);%得到图像矩阵行数m,列数n
for i=3:m-2
for j=3:n-2%处理领域较大,所以从图像(3,3)开始,在(m-2,n-2)结束l(i,j)=-f(i-2,j)-f(i-1,j-1)-2*f(i-1,j)-f(i-1,j+1)-f(i,j-2
)-2*f(i,j-1)+16*f(i,j)-2*f(i,j+1)-f(i,j+2)-f(i+1,j-1)-2*f
(i+1,j)-f(i+1,j+1)-f(i+2,j);%LoG算子
end
end
subplot(2,2,2);imshow(l);title('LoG算子提取图像边缘');
[m,n]=size(l);
for i=2:m-1
for j=2:n-1
y(i,j)=l(i-1,j-1)+l(i-1,j)+l(i-1,j+1)+l(i,j-1)+l(i,j)+l(i,j+1)+l( i+1,j-1)+l(i+1,j)+l(i+1,j+1);
y(i,j)=y(i,j)/9; %LoG算子提取边缘后,对结果进行均值滤波以去除噪
声,为下一步hough变换提取直线作准备
end
end
subplot(2,2,3);imshow(y);title('均值滤波器处理后')
q=im2uint8(y);
[m,n]=size(q);
for i=1:m
for j=1:n
if q(i,j)>80; %设置二值化的阈值为80
q(i,j)=255; %对图像进行二值化处理,使图像边缘更加突出清晰
else
q(i,j)=0;
end
end
end
subplot(2,2,4);imshow(q);title('二值化处理后');
%Hough变换检测直线,使用(a,p)参数空间,a∈[0,180],p∈[0,2d]
a=180; %角度的值为0到180度
d=round(sqrt(m^2+n^2)); %图像对角线长度为p的最大值
s=zeros(a,2*d); %存储每个(a,p)个数
z=cell(a,2*d); %用元胞存储每个被检测的点的坐标
for i=1:m
for j=1:n%遍历图像每个点
if(q(i,j)==255)%只检测图像边缘的白点,其余点不检测
for k=1:a
p = round(i*cos(pi*k/180)+j*sin(pi*k/180));%对每个点从1到180度遍历一遍,取得经过该点的所有直线的p值(取整) if(p > 0)%若p大于0,则将点存储在(d,2d)空间
s(k,d+p)=s(k,d+p)+1;%(a,p)相应的累加器单元加一 z{k,d+p}=[z{k,d+p},[i,j]'];%存储点坐标
else
ap=abs(p)+1;%若p小于0,则将点存储在(0,d)空间 s(k,ap)=s(k,ap)+1;%(a,p)相应的累加器单元加一
z{k,ap}=[z{k,ap},[i,j]'];%存储点坐标
end
end
end
end
end
for i=1:a
for j=1:d*2 %检查每个累加器单元中存储数量
if(s(i,j) >70) %将提取直线的阈值设为70
lp=z{i,j};%提取对应点坐标
for k=1:s(i,j)%对满足阈值条件的累加器单元中(a,p)对应的所
有点进行操作
o(lp(1,k),lp(2,k),1)=255; %每个点R分量=255,G分量=0,
B分量=0
o(lp(1,k),lp(2,k),2)=0;
o(lp(1,k),lp(2,k),3)=0; %结果为在原图上对满足阈值要求
的直线上的点赋红色
end
end
end
end
figure,imshow(o);title('hough变换提取直线');
5、实验结果
附:两个参数的调节
1.二值化图像的细节多少可以通过对二值化的阈值调节来控制,阈值越大,细节越少。
2.最后提取直线的阈值越小,可被赋红色的直线的越多,但更多的无关细节也可能被赋红色;阈值越大,可被赋红色的直线的越少,同时无关细节也会减少。
通过对这个两个参数的适当调节可使提取直线的效果更好。