目录
2.使用MATLAB工具箱中的Hough变换函数进行边缘检测
一、Hough变换简介
- 霍夫变换(Hough Transform)是数字图像处理中的一种特征提取技术
- 常用于判断图像中哪些点共线
- 可以检测直线,也可以检测圆或椭圆
二、Hough变换的数学理解
1.x-y变量空间至k-b参数空间的变换
已知一条直线在直角坐标系下可以用表示,霍夫变换的主要思想是将方程的参数与变量交换,从变量空间x,y变换到参数空间k,b来对直线进行表示。在变量空间中的一个点在参数空间中就表示为一条直线,这样在参数空间y-x中的“点共线”问题就转换为了参数空间k-b中的“线相交”问题,且有几个点共线就有几条线相交。(如图1)
图1 变量空间--->参数空间的转换
2.x-y变量空间至-空间的变换
可以用极坐标来表示参数(如图2)
图2 参数空间为极坐标空间
直线 用极坐标表示为
其中,为从原点到直线最近距离的向量,为向量与x轴的夹角。
对于竖直方向的直线,,为正的x的截距;对于水平直线,,为正的y的截距;或,为负的y的截距。
图2(右)中的两条正弦曲线,分别表示过特定点、的两个直线族,交点对应于通过、的直线。
由此,-空间中,某点处相交的正弦曲线的数量等于相应的x-y空间中共线的点的数量。
三、Hough变换应用于线检测(MATLAB实现)
1.检测步骤
- 对图像进行Hough变换;
- 找出变换域中的峰值数据(相交直线最多的点);
- 根据峰值数据的空域坐标绘出对应直线。
-
%%Hougn变换
-
I=imread('coloredChips.png');
-
f=rgb2gray(I);%RGB-->gray
-
f=f(round(
end/
2)
:end,
1
:round(
end/
2));
-
BW=edge(f,
'canny'); %
edge:以灰度图像为输入,
'canny'为边缘检测算子
-
% 输出BW为二值图像,边缘处为白(
255)其余部分为黑(
0)
-
imshow(f)
-
title(
'原始图像')
-
[row,col]=size(BW);
-
rhomax=round((row*row+col*col)^
0.
5);
-
A=zeros(
2*rhomax,
180); %这里,实际上rho的取值范围为[-rhomax,rhomax],
-
%但是为了后面进行数量统计,转变为[
1,
2rhomax]
-
for m=
1
:row
-
for n=
1
:col
-
if BW(m,n)>
0 %判断为边缘
-
for theta=
1
:
180
-
r=theta/
180*pi; %角度转换
-
rho=round(m*cos(r)+n*sin(r));
-
%Hough变换
-
rho=rho+rhomax+
1; %坐标平移
-
%这里的理解,首先matlab中数组是从
1开始计数,所以+
1;
-
%数组坐标不能<
0,所以 +rhomax
-
A(rho,theta)=A(rho,theta)+
1; %数量统计
-
end
-
end
-
end
-
end
-
[rho,theta]=find(A>
130); %超过
130个点视为共线,rho列号,theta行号
-
nma=length(rho);
-
figure,imshow(BW)
-
for i=
1
:nma
-
hold on
-
m=
1
:row;
-
r=theta(i)/
180*pi;
-
n=(rho(i)-rhomax-m*cos(r))/(
0.
0001+sin(r));
-
plot(n,m,
'w-',
'LineWidth',
6);
-
end
-
title(
'hough线检测');
2.使用MATLAB工具箱中的Hough变换函数进行边缘检测
-
%%MATLAB工具箱中的Hough变换函数进行边缘检测
-
I=imread(
'circuit.tif');
-
rotI=imrotate(I,
33,
'crop');
-
BW=edge(rotI,
'canny');
-
imshow(BW);
-
title(
'原图');
-
%对图像进行Hough变换
-
[H,T,R]=hough(BW); %[H,theta,rho]
-
%显示变换域
-
figure,imshow(imadjust(rescale(H)),
'XData',T,
'YData',R,...
-
'InitialMagnification',
'fit');
-
xlabel(
'\theta');ylabel(
'\rho');
-
axis
on,axis normal,hold
on
-
title(
'变换域');
-
%计算变换域峰值
-
P=houghpeaks(H,
5,
'threshold',ceil(
0.3*max(H(:))));
-
x=T(P(:,
2));y=R(P(:,
1));
-
plot(x,y,
's',
'color',
'red');
-
%标记直线
-
lines=houghlines(BW,T,R,P,
'FillGap',
5,
'MinLength',
7);
-
figure,imshow(rotI),hold
on
-
max_len=
0;
-
for k=
1:length(lines)
-
xy=[lines(k).point1;lines(k).point2];
-
plot(xy(:,
1),xy(:,
2),
'LineWidth',
2,
'Color',
'white');
-
%Plot beginning
and ends
of lines
-
plot(xy(
1,
1),xy(
1,
2),
'xw',
'LineWidth',
2);
-
plot(xy(
2,
1),xy(
2,
2),
'xw',
'LineWidth',
2);
-
%Determine the endpoints
of the longest line segment
-
len=norm(lines(k).point1-lines(k).point2);
-
if(len>max_len)
-
max_len=len;
-
xy_long=xy;
-
end
-
end
-
title(
'检测结果')
附:MATLAB hough函数使用指南 https://ww2.mathworks.cn/help/search.html?qdoc=hough&submitsearch=