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*');
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*');
相关文章推荐
- Hough变换实现图像纠偏-从matlab到c++实现
- Hough变换直线检测的MATLAB实现
- 基于Hough 变换的直线检测(Matlab实现)
- Matlab实现Hough变换检测图像中的直线 分类: 图像处理 2014-06-14 22:07 641人阅读 评论(0) 收藏
- 图像进行Sobel算子、Hough变换检测圆的matlab实现
- Hough变换 直线检测原理及其Matlab实现
- Matlab实现Hough变换检测图像中的直线
- DSP实现快速Hough变换圆检测算法
- Hough变换检测圆(附:MATLAB程序)
- matlab实现信号的变换
- Hough变换检测圆(附:MATLAB程序)
- 距离变换 matlab实现 opencv实现
- 基于K-L变换的人脸识别的MATLAB实现
- 击中击不中变换Matlab实现
- FFT变换的MATLAB实现
- OpenCV2马拉松第22圈——Hough变换直线检测原理与实现
- OpenCV2马拉松第22圈——Hough变换直线检測原理与实现
- DCT变换及matlab实现
- Hough变换的实现
- 利用Hough变换实现直线检测的代码