数字图像处理Hough变换直线检测matlab实现

合集下载

Hough变换直线检测MatLab代码.doc

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代码

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 变换直线检测,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例程

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`函数找到图像中的直线,并将其绘制在原始图像上。

利用matlab进行图像检测--直线提取

利用matlab进行图像检测--直线提取

H a r b i n I n s t i t u t e o f T e c h n o l o g y图像工程导论课程名称:图像工程导论设计题目:《图像检测:直线提取》院系:班级:设计者:学号:哈尔滨工业大学教务处图像工程导论任务书二〇一五年柒月哈尔滨工业大学一、课题详细描述:提取图像中所有长度>8,<80像素的水平、垂直和对角直线。

二、课题设计思路:读取图片后将其转化为灰度图后记为二值图像,对其进行边缘检测后通过霍夫变换检测直线,并将符合像素要求的水平、垂直和对角直线绘制在屏幕上。

三、代码清单及注释x=imread('D:2.jpg');%读取图片BW=rgb2gray(x);%转化为灰度图imshow(BW);thresh=[0.01,0.17];sigma=2; %定义高斯参数f=edge(double(BW),'canny',thresh,sigma);%canny边缘检测figure,imshow(f);[H,T,R]=hough(f,'ThetaResolution',89,'RhoResolution',10); %霍夫变换P=houghpeaks(H,400,'Threshold',80,'NHoodSize',[1,1]);lines=houghlines(f,T,R,P,'FillGap',1,'Minlength',8);for k = 1:length(lines)xy = [lines(k).point1; lines(k).point2];len = norm(lines(k).point1 - lines(k).point2);Len(k)=lenif ( len > 8& len < 80) %限定像素范围plot(xy(:,1),-xy(:,2),'LineWidth',2,'color','Red'); %绘制图像hold on;endend四、代码运行结果及自评所需处理的图片:处理结果:从图中可以看到本程序确是找到了满足要求的所有直线并将其呈现在了新的窗口中,完成了设计要求。

hough变换检测直线原理matlab

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实现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 %设定直线的最小值。

边缘检测与Hough变换实验报告Matlab

边缘检测与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变换后参数平面上的峰值点。

Matlab实现——霍夫变换直线检测(2)

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);实验结果:原图:未优化的霍夫变换:优化后:。

hough变换提取直线(Matlab实现)

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:m2for j=3:n2%处理范畴较大,所以从图像(3,3)开端,在(m2,n2)停止l(i,j)=f(i2,j)f(i1,j1)2*f(i1,j)f(i1,j+1)f(i,j2)2*f(i,j1)+16*f(i,j)2*f(i,j+1)f(i,j+2)f(i+1,j1)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:m1forj=2:n1y(i,j)=l(i1,j1)+l(i1,j)+l(i1,j+1)+l(i,j1)+l(i,j)+l(i, j+1)+l(i+1,j1)+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.二值化图像的细节若干可以经由过程对二值化的阈值调节来掌握,阈值越大,细节越少.2.最后提取直线的阈值越小,可被赋红色的直线的越多,但更多的无关细节也可能被赋红色;阈值越大,可被赋红色的直线的越少,同时无关细节也会削减.经由过程对这个两个参数的恰当调节可使提取直线的后果更好.。

matlab练习程序(霍夫变换检测直线斜率)

matlab练习程序(霍夫变换检测直线斜率)

matlab练习程序(霍夫变换检测直线斜率) 这个过去⽤就,这次正好有⼈问这个算法,所以在这⾥⼜把C代码改为了matlab了。

霍夫变换是把原图像中的直线上的每⼀个点转换到参数空间对应的曲线上,由于每⼀个点对应⼀条曲线,因此在参数空间中所有曲线会相交到⼀个点,形成⼀个最值。

因此原图寻找直线斜率的问题就变成了参数空间寻找最值的问题了。

代码如下:clear all;close all;clc;%%%以下只是做⼀个带直线的图像⽽已r=300;jiaodu=30; %更改这个值测试,90度270度时不管⽤jiaodu1=mod(jiaodu,360);flag=0;if jiaodu1>=0 && jiaodu1<90jiaodu1=jiaodu1;flag=1;endif jiaodu1>=90 && jiaodu1<180jiaodu1=180-jiaodu1;flag=2;endif jiaodu1>=180 && jiaodu1<270jiaodu1=jiaodu1-180;flag=3;endif jiaodu1>=270 && jiaodu1<360jiaodu1=360-jiaodu1;flag=4;endH=floor(r*sin(jiaodu1*pi/180));W=floor(r*cos(jiaodu1*pi/180));if mod(H,2)==0H=H+1;endif mod(W,2)==0W=W+1;endw=zeros(H,W);if jiaodu1 ~= 90 && jiaodu1 ~= 270for i=1:Hfor j=1:Wtmp=floor(j*tan(jiaodu1*pi/180));if tmp+1==iw(i,j)=r;endendendelsefor i=1:Hw(i,1)=r;endendif flag==1 || flag==3 %如果⾓度在1,3象限,卷积矩阵上下翻转w=flipud(w);end%%%下⾯是真正的霍夫变换img=mat2gray(w); %处理这个图像[m n]=size(img);imshow(img);data=zeros(314,2*(m+n));for i=1:m %将图像⼆维空间的⼀个点映射到p=x*cos(theta)+y*sin(theta)⽅程对应的参数空间的⼀条曲线for j=1:nif img(i,j)==1for theta=0.01:0.01:3.14data(round(theta*100),round(i*sin(theta)+j*cos(theta)+m+n))= ...data(round(theta*100),round(i*sin(theta)+j*cos(theta)+m+n))+1;endendendendtheta=0;ma=0;for i=1:314 %寻找曲线相交最多的那个点,即找最⼤值for j=1:2*(m+n)if data(i,j)>mama=data(i,j);theta=i/100;rou=j-m-n;endendendfigure;imshow(data) %形象的显⽰参数空间曲线sr_k=tan(jiaodu*pi/180) %设置的斜率re_k=cos(theta)/sin(theta) %求得的斜率做出的⼀条直线参数空间中的曲线30度时斜率是0.5774,霍夫变换求得的斜率是0.5736。

用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时,将其合二为一。

matlab 数字图像处理 实验二

matlab 数字图像处理 实验二

实验二基于MATLAB的数字图像处理二改进型数字图像中直线特征的快速检测方法姓名-胡青李班级-信息与计算科学11-1班学号-10114590一、实验目的与要求学会如何将图像中的直线特征快速提取出来的方法,并运用图像的Hough变换及小波变换的基础知识实现改进型数字图像中直线特征的快速检测方法。

二、实验内容及步骤1.Hough变换是对二值图像进行直线检测的有效方法,其实质是对图像进行坐标变换,将图像空间的点映射到参数空间,使变换后的结果便于检测和识别。

图像空间的一条直线l 可以有下式所示的参数方程表示:p=xcosa+ysina (0<=a<=pie)其中,排位坐标原点O到直线l的距离,a为坐标原点到直线l的垂线与x轴正方向的夹角。

根据该式,可以将图像空间中的任意一点(x,y)转换到以p、a为坐标的参数空间。

先将参数空间量化成m*n个累加单元,并将每个累加单元的初始值设为0。

对于图像空间的每一个非零点在角度参数的每个区间内根据公式计算方向的长度,并将对应参数空间的累加单元加1。

最后统计参数空间中所有累加单元的值,大于阈值的累加单元所对应的长度和角度的值便是图像空间内直线的参数。

2、小波变换是一种时频分析方法,具有多变分析功能,被誉为“数字放大镜”。

改进的直线检测算法步骤示意图小波提升实现步骤:改进的Hough变换具体实现步骤:三、实验结果1.Rgb2gray和im2bw的使用。

2、改进型数字图像中直线特征的快速检测四、实验小结1、运用Hough变换来检测直线具有较强的鲁棒性,可以有效的排除噪声的干扰和解决图像经过二值化后线条出现的间断现象,但其运算量过大,占用内存多。

2、鲁棒性是指控制系统在一定(结构,大小)的参数摄动下,维持其它某些性能的特性。

3、通过实验实验结果可以知道,直线检测确实可以检测出图片中的直线,因此可以被广泛的应用于基于机器视觉的目标检测中。

4、小波提升和改进型Hough相结合,可以有效的抑制高频噪声,提高数字图像中想直线的检测速率;改进了基于Hough变换检测直线的原理,按照从局部到整体的检测顺序,将二值化后图像空间中非零点映射到参数空间中具有较大存在概率的累加单元,而不是所有可能的累加单元。

霍夫变换找直线 matlab 高分课程论文代码

霍夫变换找直线   matlab  高分课程论文代码
xmax=0; %这是算法精髓,首先给定一个初值,方便下面计算
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有负值,此处先给定负值可能的最

史上最详细的Hough直线检测

史上最详细的Hough直线检测

史上最详细的Hough 直线检测所以这⾥再次回顾⼀下检测直线的算法之——Hough变换。

Hough 直线检测1.直线坐标参数空间在图像x −y坐标空间中,经过点(,)的直线表⽰为:其中,参数a为斜率,b为截矩。

通过点(,)的直线有⽆数条,且对应于不同的a和b值。

如果将和视为常数,⽽将原本的参数a和b看作变量,则式⼦(1)可以表⽰为:这样就变换到了参数平⾯a −b。

这个变换就是直⾓坐标中对于(,)点的Hough变换。

该直线是图像坐标空间中的点(,)在参数空间的唯⼀⽅程。

考虑到图像坐标空间中的另⼀坐标(,),它在参数空间中也有相应的⼀条直线,表⽰为:这条直线与点(,)在参数空间的直线相交于⼀点(,),如图所⽰:图像坐标空间中过点(,)和点(,)的直线上的每⼀点在参数空间a −b上各⾃对应⼀条直线,这些直线都相交于点,⽽a0、b0就是图像坐标空间x −y中点(,))和点(,)所确定的直线的参数。

反之,在参数空间相交于同⼀点的所有直线,在图像坐标空间都有共线的点与之对应。

根据这个特性,给定图像坐标空间的⼀些边缘点,就可以通过Hough变换确定连接这些点的直线⽅程。

具体计算时,可以将参数空间视为离散的。

建⽴⼀个⼆维累加数组A(a,b),第⼀维的范围是图像坐标空间中直线斜率的可能范围,第⼆维的范围是图像坐标空间中直线截矩的可能范围。

开始时A(a,b)初始化为0,然后对图像坐标空间的每⼀个前景点(xi,yi),将参数空间中每⼀个a的离散值代⼊式⼦(2)中,从⽽计算出对应的b值。

每计算出⼀对(a,b),都将对应的数组元素A(a,b)加1,即A(a,b)=A(a,b)+1。

所有的计算结束之后,在参数计算表决结果中找到A(a,b)的最⼤峰值,所对应的a0、b0就是原图像中共线点数⽬最多(共A(a,b)个共线点)的直线⽅程的参数;接下来可以继续寻找次峰值和第3峰值和第4峰值等等,它们对应于原图中共线点略少⼀些的直线。

数字图像中的Hough变换应用--直线检测

数字图像中的Hough变换应用--直线检测

数字图像中的Hough变换应用--直线检测摘要为能够有效解决实时直线图形提取问题,提出了一种基于Hough 变换(HT)的直线提取算法。

它所实现的是一种从图像空间到参数空间的映射关系。

由于具有一些明显优点和可贵性质,它引起了许多国内外学者和工程技术人员的普遍关注。

由于其根据局部度量来计算全面描述参数,因而对于区域边界被噪声干扰或被其他目标遮盖而引起边界发生某些间断的情况,具有很好的容错性和鲁棒性。

多年来,专家们对Hough变换的理论性质和应用方法进行了深入而广泛的研究,目前应用于生物医学、自动化和机器人视觉、空间技术和军事防御、办公自动化等各个方面。

本次课称设计首先分析了数字图像中直线边缘的三种结构特征,提出采用基元结构表示目标边缘点,并在约束条件下计算基元结构的基元倾角。

在此基础上,结合传统的HT的思想对基元结构进行极角约束HT,以获得最终的直线参数。

最后,再用MATLAB软件对该算法进行编程仿真。

实验结果表明,对合成图像和自然图像,该算法能够有效的识别图像中的直线段。

关键词:直线提取;Hough变换;MATLAB目录1. 课程设计的目的 (1)2. MATLAB简介及应用 (1)2.1 MATLAB简介 (1)2.2 MATLAB应用 (1)2.3 MATLAB特点 (2)3. Hough变换原理 (2)3.1 Hough变换的基本原理 (2)3.2 Hough变换的不足之处 (4)3.3 Hough变换的应用 (4)4. Hough变换检测直线设计 (5)4.1 Hough变换检测直线基本原理 (5)4.2 Hough变换的几种基本算法 (6)4.3 Hough变换算法的比较与选择 (7)4.4 Hough变换检测直线的算法流程图 (9)4.5 Hough变换检测直线算法的实现 (9)5. 仿真结果及分析 (11)5.1 仿真结果 (11)5.2 结果分析 (14)结论 (15)参考文献 (16)数字图像中的Hough变换应用——直线的检测1.课程设计的目的本次课程设计的目的在于提高发现问题、分析问题、解决问题的能力,进一步巩固数字图像处理系统中的基本原理与方法。

数字图像中的Hough变换应用 直线的检测

数字图像中的Hough变换应用 直线的检测

Hough变换是一种使用表决原理的参数估计技术。

其原理是利用图像空间和Hough参数空间的点-线对偶性,把图像空间中的检测问题转换到参数空间。

通过在参数空间里进行简单的累加统计,然后在Hough参数空间寻找累加器峰值的方法检测直线。

Hough变换的实质是将图像空间内具有一定关系的像元进行聚类,寻找能把这些像元用某一解析形式联系起来的参数空间累积对应点。

在参数空间不超过二维的情况下,这种变换有着理想的效果。

理论与实践向来是形影不离,相辅相成,Hough变换之所以有如此长足的发展,主要原因还是在于实践应用上的广泛需求。

而在实践中所暴露出的不足又进而促进了它的发展,循环往复,就如同生命的演化。

Hought变换主要应用在生物医学、自动化、机器人视觉空间技术、军事防御办公自动化等方面。

本文主要是根据所学的数字图象处理知识,在MATLAB环境下,通过系统编程的方式,实现用Hough变换检测直线的算法。

关键词:Hough变换;对偶性;MATLAB1 课程设计目的与要求 (1)1.1课程设计目的 (1)1.2课程设计要求 (1)2 Hough直线检测的原理 (2)3 设计内容 (4)3.1 读入图像 (4)3.2 检测图像边缘 (4)3.3 实现Houg变换,检测出图像中的直线 (4)4 程序代码 (5)5 仿真结果分析 (9)5.1 仿真结果 (9)5.2分析 (11)结束语 (12)参考文献 (13)1 课程设计目的与要求1.1课程设计目的(1)熟悉和掌握MATLAB程序设计方法;(2)学习和熟悉MATLAB图像处理工具箱;(3)学会运用MATLAB工具箱对图像进行处理和分析;(4)了解Hought变换的原理;(5)实现用Hough变换检测直线的算法。

1.2课程设计要求利用Hough变换检测直线通常先进行边缘检测,得到只包含边缘的二值图像。

再通过Hough变换,在参数空间检测图像共线点的数量得到直线参数,从而实现直线检测。

houghlines函数matlab -回复

houghlines函数matlab -回复

houghlines函数matlab -回复题目为[houghlines函数matlab],以中括号内的内容为主题,写一篇1500-2000字文章,一步一步回答。

在计算机视觉和图像处理中,霍夫变换(Hough transform)是一种常用的技术,用于检测图像中的直线。

霍夫变换的核心思想是将图像中的像素点映射到霍夫空间中的曲线。

MATLAB提供了一个方便的函数,称为houghlines,它可以直接实现霍夫变换。

首先,我们需要了解霍夫变换的基本原理。

在二维空间中,直线可以用Hessian normal form 或极坐标表示。

霍夫变换则采用极坐标表示,即直线可以通过在参数空间(r, θ) 上的曲线来表示。

接下来,我们需要明确两个关键概念:极坐标参数空间和累加器。

参数空间是由两个参数组成的,分别是角度θ和距离ρ。

在MATLAB中,θ的范围一般为-90到90度,而ρ的范围则根据图像的尺度来确定。

累加器是霍夫变换的核心,用来记录图像中直线的频率。

在集合表示的图形学中,可以将累加器看作一个二维矩阵。

矩阵的行对应于θ的离散值,而列对应于ρ的离散值。

初始状态下,所有的累加器元素都被初始化为0。

通过霍夫变换,我们可以利用累加器中的值来检测直线。

检测直线的过程可以分为以下几个步骤:步骤一:边缘检测在应用霍夫变换之前,通常需要对图像进行边缘检测。

边缘检测可以使用Sobel算子、Canny算子等。

在MATLAB中,可以使用边缘检测函数(如edge)来实现。

步骤二:创建累加器在MATLAB中,我们可以使用函数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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数字图像处理—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) )>2
f=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:row
for n=1:col
if j(m,n)>0
for thera=1:180
r=thera/180*pi; % 角度转弧度
rho=round(m*cos(r)+n*sin(r));% p =cos 0 +sin 0
rho=rho+pinfang+1;%-l:l 转换到1:2l+1
A(rho,thera)=A(rho,thera)+1;
end
end
end
end
[rho,the⑻二仙d(A>40);% 交点超过60条线的点,ma,na为参数空间的坐标点nma=length(rho);
for i=1:nma
hold on
m=1:row;
%rho=ma(i)-1;
r=thera(i)/180*pi;
n=(rho(i)-pinfang-m*cos(r))/(0.00001+sin(r));
end。

相关文档
最新文档