核心关系:两条相互垂直直线斜率乘积为-1
这个公式的含义:
==========================分割线=======================================
close all;
clear;
clc;
plotRowNum = 2;
plotClmNum = 2;
%构建笛卡尔坐标系下面的一个直线
%直线的斜率k:2,截距:3
k = 5;
b = 1;
x = 0:0.1:5;
y = k.*x + b + rand(1,size(x,2));
figure;
subplot(plotRowNum,plotClmNum,1);
plot(x,y,”r+”);
xlim([0 5]);
ylim([0 27]);
xlabel(“x”);
ylabel(“y”);
title(“图像空间:y=2x+3”);
%变换到hough极坐标空间
%将原来笛卡尔空间中直线上的每一个点,都变换到Hough极坐标空间下面
%在Hough空间下面,自变量和因变量都已经发生了改变
%y = kx+b ==> b = -kx + y ==> q = px + y
%Hough空间下,自变量是p,因变量是q
%原始笛卡尔坐标系下的一个点对应在Hough空间下是一条直线;那么笛卡尔坐标系下面的很多个点,在Hough空间下就是很多根线…
%在原始笛卡尔坐标系下有多少个点,在Hough空间下就有多少根线
%而这些线的自变量和因变量变成了p和q;生成的是一系列的线簇
Hough_p = -10:0.01:5;
%Hough_q中行数表示笛卡尔坐标中的点个数;列数表示Hough空间中每一条直线的点个数
Hough_q = zeros(size(x,2),size(Hough_p,2));
%在原始笛卡尔坐标系下有多少个点,在Hough空间下就有多少根线,所以Hough_q是一个矩阵,
for outLoopIndex = 1:1:size(x,2)
curr_q = x(outLoopIndex).*Hough_p + y(outLoopIndex);
Hough_q(outLoopIndex,:) = curr_q;
end
subplot(plotRowNum,plotClmNum,2);
plot(Hough_p,Hough_q);
xlabel(“Hough_p”);
ylabel(“Hough_q”);
title(“Hough空间:直角空间 Hough_q = Hough_p*x + y”);
%Hough空间的一条直线在极坐标空间下rho = L(theta)下的展示
%ρ= xcosθ + ysinθ 证明详见文档
Hough_theta = 0:0.01:2pi;
Hough_rhoSP = zeros(1,size(Hough_p,2));
Hough_rhoSP = x(1).cos(Hough_theta) + y(1).*sin(Hough_theta);
subplot(plotRowNum,plotClmNum,3);
plot(Hough_theta,Hough_rhoSP);
xlabel(“θ”);
ylabel(“ρ”);
title(“Hough空间中过单点的可能直线的极坐标参数对(θ,ρ)”);
%Hough空间中过所有边缘点的可能直线的参数对(θ,ρ)
%由上面的显示可以知道,每一个点都有一个系列的参数对;有多少个点就有多少个系列的参数对
%行数表示图片上边缘点的个数
%列数表示单系列的参数对个数,列数也就是每行元素的个数
Hough_rho = zeros(size(x,2),size(Hough_theta,2));
for outLoopIndex = 1:1:size(x,2)
Hough_rho(outLoopIndex,:) = x(outLoopIndex).cos(Hough_theta) + y(outLoopIndex).sin(Hough_theta);
end
subplot(plotRowNum,plotClmNum,4);
plot(Hough_theta,Hough_rho);
xlabel(“θ”);
ylabel(“ρ”);
title(“Hough空间中过所有边缘点的可能直线的极坐标参数对(θ,ρ)”);
运行效果图
Original: https://blog.csdn.net/wanshouwujiang11/article/details/124165457
Author: bryce_liang
Title: 关于Hough变换的公式证明与Matlab展示
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/642070/
转载文章受原作者版权保护。转载请注明原作者出处!