Hough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的一个点。这样就把原始图像中给定曲线的检测问题转化为寻找参数空间中的峰值问题。也即把检测整体特性转化为检测局部特性。比如直线、椭圆、圆、弧线等。
下面给出在matlab中用Hough变化检测直线的实现,文章末尾提供相关资源的下载。
其中先用log(laplacian of gaussian)算子检测图像边界:
sourcePic=imread('D: \matlab程序\Hough变换检测直线\curve.bmp');
[height,width,l]=size(sourcePic);
grayPic=zeros(height,width);
for i=1:height %转换成灰度图象
for j=1:width
grayPic(i,j)=(sourcePic(i,j,1)+sourcePic(i,j,2)+sourcePic(i,j,3))/3;
end
end
logNum=0; %log算子的计算值
edgePic=zeros(height,width);
for i=3:height-2 %log算子提取边界
for j=3:width-2
logNum=16*grayPic(i,j)-grayPic(i-2,j)-grayPic(i-1,j-1)-2*grayPic(i-1,j)-grayPic(i-1,j+1)-grayPic(i,j-2)-2*grayPic(i,j-1)-2*grayPic(i,j+1)-grayPic(i,j+2)-grayPic(i+1,j-1)-2*grayPic(i+1,j)-grayPic(i+1,j+1)-grayPic(i+2,j);
if(logNum > 0)
edgePic(i,j)=255;
else
edgePic(i,j)=0;
end
end
end
% Hough变换检测直线,g(x)=(a,p)为边界点对应的平面
ma=180; %a的值为0到180度
mp=round(sqrt(height^2+width^2)); %对应P的最大值
npc=zeros(ma,2*mp); %用于记录(a,p)对应的点的个数
npp=cell(ma,2*mp); %用于记录(a,p)对应的点的坐标
for i=1:height %计算(a,p)的值,并做相应记录
for j=1:width
if(edgePic(i,j)==255)
for k=1:ma
p = round(i*cos(pi*k/180)+j*sin(pi*k/180));
if(p > 0)
%npc(k,mp*2)=npc(k,mp*2)+1;
%npp{k,mp*2}=[npp{k,mp*2},[i,j]'];
%2010.01.05修正
npc(k,mp+p)=npc(k,mp+p)+1;
npp{k,mp+p}=[npp{k,mp+p},[i,j]'];
else
ap=abs(p)+1;
npc(k,ap)=npc(k,ap)+1;
npp{k,ap}=[npp{k,ap},[i,j]'];
end
end
end
end
end
for i=1:ma %根据(a,p)对应的点的个数,用红色标出相应直线
for j=1:mp*2
if(npc(i,j) > 90) %将提取直线的阈值设为90
lp=npp{i,j};
for k=1:npc(i,j)
sourcePic(lp(1,k),lp(2,k),1)=255;
sourcePic(lp(1,k),lp(2,k),2)=0;
sourcePic(lp(1,k),lp(2,k),3)=0;
end
end
end
end
figure,imshow(sourcePic);
Resources & Reference:
1、图像处理技术—直线检测.pdf
2、数字图像处理与分析—用Hough变换检测直线(含matlab代码).doc
3、演示处理图片:curve.bmp
4、All Files




SOFT
有点疑惑,第32和35行的代码,是不是因为p可能是负数,而在matlab中坐标不能为负,所以将正数*2,负数取绝对值。但这样有一个问题,比如p=-10,和p=5,都能使npc(k,10)+1,而小弟认为这样累加是错误的
@wistertan:确实存在你描述的问题,现已对代码进行了修改。非常感谢!
您的附件 代码不给了?还是文章中的代码就是全部代码?
hao
Thank you very much!
你好,想请教几个关于图像处理的问题,方便的话发给我发个邮件!我的邮箱sdaulj@163.com。先谢谢了
请问可以给发一下你改进之后的代码吗 ?谢谢了 guangjin.gis@gmail.com 不胜感激 QQ:112228711 要是方便可否加我 想你请教探讨