霍夫变换在
图像处理里常用来在黑白图像里检测
直线,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
重复所有点,就可以得出一副累加图
如果需要找到曲线相交最多那个点,就只需要在该坐标轴中找到值最大的点坐标即可。
结果
评论列表(0条)