用hough变换算法

用hough变换算法,第1张

霍夫变换在图像处理里常用来在黑白图像里检测直线,matlab里有相应的几个函数,使用方便,这里把matlab帮助里介绍的例子演示一下。matlab里霍夫变换主要包含一下三个函数:hough:实现霍夫变换,得到霍夫变换矩阵,用法如下[H,theta,rho]=hough(BW)[H,theta,rho]=hough(BW,ParameterName,ParameterValue)houghpeaks:在霍夫变换矩阵里找极值点peaks=houghpeaks(H,numpeaks)peaks=houghpeaks(,param1,val1,param2,val2)houghlines:从霍夫变换矩阵中提取线段lines=houghlines(BW,theta,rho,peaks)lines=houghlines(,param1,val1,param2,val2)下面以一个例子来看看霍夫变换的效果,代码如下:%测试霍夫变换clcclearcloseall%读岁并取图像I=imread('circuit.tif')rotI=imrotate(I,80,'crop')%旋转33度,保持原图片大小fig1=imshow(rotI)%提取边BW=edge(rotI,'canny')figure,imshow(BW)%霍夫变换[H,theta,rho]=hough(BW)%计算二值图像的标准霍夫变换,H为霍夫变换矩阵,theta,rho为计算霍夫变换的角度和半径值figure,imshow(imadjust(mat2gray(H)),[],'XData',theta,'YData',rho,'InitialMagnification','fit')xlabel('\theta(degrees)'),ylabel('\rho')axison,axisnormal,holdoncolormap(hot)%显示霍夫变换矩阵中的极值点P=houghpeaks(H,50,'threshold',ceil(0.3*max(H(:))))%从霍夫变换矩阵H中提取5个极值点x=theta(P(:,2))y=rho(P(:,1))plot(x,y,'s','color','black')%找原图中的线lines=houghlines(BW,theta,rho,P,'FillGap',18,'MinLength',180)figure,imshow(rotI),holdonmax_len=0fork=1:length(lines)%绘制各条线xy=[lines(k).point1lines(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')%计算线的长度,找最长线段len=norm(lines(k).point1-lines(k).point2)if(len>max_len)max_len=lenxy_long=xyendend%以红色线高亮显示最长的线plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','red')其中,同一条线段由于某些原因(比如光照、噪音等)变成了不连续的两条较短的线段,所以要进项合并,至于多少长度的才合并成同一条直线,是依据不同的图像而言的,由fillgap参数决定。而有些线段可能是噪声,所以小于7的舍去,这个也么有标准喊宏,需要根据不同的图像而定。

clc

clear

close

%BW=imread('D:\picture\9dafa605d53eea243812bb29.jpg')

rgb=imread('lena.jpg')

BW=rgb2gray(rgb)

thresh=[0.01,0.17]

sigma=2%定义高晌银斯参数

f = edge(double(BW),'canny',thresh,sigma)

figure(1),

imshow(f,[])

title('canny 边缘检测')

[H, theta, rho]= hough(f,'RhoResolution', 0.5)

axis on,

axis normal

xlabel('\theta'),ylabel('rho')

p=houghpeaks(H,5)

hold on

lines=houghlines(f,theta,rho,p)

figure,

imshow(f,[]),

title('Hough Transform Detect Result'简谨薯),

hold on

for k=1:length(lines)

xy=[lines(k).point1lines(k).point2]

plot(xy(:,1),xy(:,2),'LineWidth',4,'拦者Color',[.6 .6 .6])

end

Hough变换是1962年由Hough提出来的,用于检测图像中直线、圆、抛物线、椭圆等形状能够用一定函数关系描述的曲线。

在这里我们重点研究的是 利用Hough变换检测图中的直线。

对于上图中的直线L,用常规方程表示

L: y=ax+b

那么用极坐标怎么表示呢?

对于任意的R,都有

R×cos(β-θ)=ρ

展开得

R×cosβcosθ+R×sinβsinθ=ρ

又x=R×cosβ y=R×sinβ(这个就不用解释了吧 高中知识了 O(∩_∩)O)

x×cosθ+y×sinθ=ρ

从这个极坐标表示的式子来看,是不是在一条直线上面所有的(x,y)都对应一个ρ、θ呢?

所以这个就是hough变换的: 点-线对偶性

通俗的讲:在直角坐标系中的一条直线,在极坐标下,其实就是一个点,坐标为(ρ,θ)

由a、b两图:位于一条直线上的两点,在极坐标会产生一个交点,说明他们共线。隐渗

可是在直角坐标系中明明只有两个点,b图中反而是两条曲线?

对于任意一点,过该点有无数条直线,每条直线都有一个(ρ,θ)值,那么无数条直线,就会组成连续的(ρ,θ)值,就会构成极坐标系下的一条连续曲线。

这样,我们对一副图像所有点进行同样的 *** 作,得到一副(ρ,θ)图像。

如果我们需要找出图像中最长的那条直线,那么肯定组成该直线的点最多,那么在极坐标系中肯定有个(ρ,θ)点是有最多条直线相交得到的猜猜。

如下图,利用函数就可以找到 相交曲线数 最多的一个点。

那么找到该点有什么用呢?

找到该点,就可以得到(ρ,θ)值、直线起始、终止点坐标。(MATLAB提供函数支持)

这里来说说,计算机是怎么由(ρ,θ)坐标图找到相交曲线最多的那个点。

首先,提供一个坐标轴

这里就说简单些:在基础二我们可以得出 一个点在极坐标系下的一条曲线

然后我们 对该穗携型曲线进行细分,分成很多个点 (得到坐标)

在第一步提供的坐标轴里面,凡是前面分出来的点坐标,该位置的值就累加1

重复所有点,就可以得出一副累加图

如果需要找到曲线相交最多那个点,就只需要在该坐标轴中找到值最大的点坐标即可。

结果


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12232959.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-22
下一篇 2023-05-22

发表评论

登录后才能评论

评论列表(0条)

保存