您的位置:首页 > 编程语言 > MATLAB

MATLAB 实现Hough变换

2017-02-27 16:28 357 查看
在对图像进行 横向 或者 纵向的sobel 滤波后,我们可以使用Hough 变换来进行直线的检测,用于修正旋转某些图形。

matlab有自带的hough变换的函数。这里我就简要说一下,我们用我们自己的方式实现hough 变换。

首先来看一个参数方程

p=x*cos(θ)+y*sin(θ)

x y 代表直角坐标系的参数

p 就是“rho”,θ是“theta”,代表极坐标的参数

对于极坐标 我们有

x=p*cos(θ)

y=p*sin(θ)

我们可以发现

p*cos(θ)*cos(θ)+p*sin(θ)*sin(θ)=p

代换过来就是 

p=x*cos(θ)+y*sin(θ)

好了 现在针对这个方程
我们把xy 当作这个极坐标方程的 常量 假设 在直角坐标系中 有(x1,y1)  (x2,y2) 这两个点

那么我们可以得到两个方程

p=x1*cos(θ)+y1*sin(θ) (参数是p
和 theta)

p=x2*cos(θ)+y2*sin(θ)
(参数是p 和 theta)

当我们让θ
从 -pi/2 到 pi/2 依次变化的时候

我们可以算出 不同的 P的值, 画出 P关于 theta 的曲线

上面的两个方程可以得到两个 曲线 (因为(x1,y1)  (x2,y2) 这两个点),只要 这两个点不是相同的重合的点,两条曲线就一定有一个相交的点 也就是 (θ,p)

θ在这里代表什么? 代表 以(x1,y1)  (x2,y2)为断点的一条直线 的夹角

如果有三个点  (x1,y1)
 (x2,y2),(x3,y3) 变换到极坐标域里面,并且三条曲线都相交于一点呢? 这就说明这三条曲线在极坐标域中取相同的 theta, 相同的p 。而我们知道 在极坐标域里面,定义一条直线 只需要 theta,和p就行了,因此我们可以断定 这三个点处于一条直线 

下面这个程序 是测试hough变化的

程序生成了一条散点直线,和一个hough变化的图。

%编写hough变换,测试Dot中的点
%Dot=[0,0;0,1;1,2;3,4]';
%Dot=rand(100,2)'*10;
clear all
Dot=[0:0.1:pi;2*(0:0.1:pi)];
hold on
theta=[-90:90]/180*pi;
%rho=-10:10;
% for i=1 : length(theta)
% for j=1 : length(Dot)
% x=Dot(1,j);
% y=Dot(2,j);
%
% plot(theta(i),x*cos(theta(i))+y*sin(theta(i)),'r.');
% end
% end
for i=1 : length(Dot)
x=Dot(1,i);
y=Dot(2,i);
plot(theta,x.*cos(theta)+y.*sin(theta));
last=length(theta);
x_=num2str(x);
y_=num2str(y);
text(theta(last),x.*cos(theta(last))+y.*sin(theta(last)),[x_,',',y_]);
end
figure
plot(Dot(1,:),Dot(2,:),'b*');





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息