抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

NingLi's Blog

Stay foolish, Stay hungry

通过Hough变换在二值图像中检测直线需要3个步骤:

(1)利用hough()函数执行霍夫变换,得到霍夫矩阵;

(2)利用houghpeaks()函数在霍夫矩阵中寻找峰值点;

(3)利用houghlines()函数在之前2步结果的基础上得到原二值图像中的直线信息

1.霍夫变换

在MATLAB中,hough函数用于执行霍夫变换,该函数的调用方法如下:

1
[H, theta, rho] = hough(BW, param1, vall, param2, val2)

其中BW是边缘检测后的二值图像。param1value1以及param2value2为可选参数对。H是变换得到的Hough矩阵。thetarho为分别对应于Hough矩阵每一列和每一行的θ和ρ值组成的向量。

2.寻找峰值

在MATLAB中,houghpeaks函数用于在霍夫矩阵中寻找峰值点。该函数的调用方法如下:

1
peaks = houghpeaks(H, numpeaks, param1, val1, param2, val2)

其中,H是由hough()函数得到的Hough矩阵;numpeaks是要寻找的峰值数目,默认为1; peaks是一个Q×2的矩阵,每行的两个元素分别为某一峰值点在Hough矩阵中的行、列索引;Q为找到的峰值点的数目。

3.提取直线段

在MATLAB中,houghlines函数在之前2步结果的基础上得到原二值图像中的直线信息。该函数的调用方法如下:

1
lines = houghlines(BW, theta, rho, peaks, param1, val1, param2, val2)

其中,BW是边缘检测后的二值图像;thetarho是Hough矩阵每一列和每一行的θ和ρ值组成的向量,由hough函数返回;peaks是一个包含峰值点信息的Q×2的矩阵,由houghpeaks函数返回;lines是一个结构体数组,数组长度是找到的直线条数。

利用霍夫变换来对图像进行处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
I=imread('pears.png');             %读取图像
rotI=rgb2gray(I);
subplot(2,2,1);
imshow(rotI);
title('灰度图像');
axis([50,250,50,200]);
grid on;
axis on;
BW=edge(rotI, 'prewitt'); %prewitt算子边缘检测
subplot(2,2,2);
imshow(BW);
title('prewitt算子边缘检测后图像');
axis([50,250,50,200]);
grid on;
axis on;
[H, T, R]=hough(BW); %霍夫变换
subplot(2,2,3);
imshow(H, [], 'XData', T, 'YData', R, 'InitialMagnification', 'fit');
title('霍夫变换图');
xlabel('\theta'), ylabel('\rho');
axis on , axis normal, hold on;
P=houghpeaks(H,5, 'threshold', ceil(0.3*max(H(:))));
x=T(P(:,2)); y=R(P(:,1));
plot(x, y, 's', 'color', 'white');
lines=houghlines(BW, T, R, P, 'FillGap',5, 'MinLength',7);
subplot(2,2,4); , imshow(rotI);
title('霍夫变换图像检测');
axis([50,250,50,200]);
grid on;
axis on;
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', 'green');
plot(xy(1,1), xy(1,2), 'x', 'LineWidth',2, 'Color', 'yello');
plot(xy(2,1), xy(2,2), 'x', 'LineWidth',2, 'Color', 'red');
len=norm(lines(k).point1-lines(k).point2);
if(len>max_len)
max_len=len;
xy_long=xy;
end
end
plot(xy_long(:,1), xy_long(:,2), 'LineWidth',2, 'Color', 'cyan');

评论