Hough变换
通过Hough变换在二值图像中检测直线需要3个步骤:
(1)利用hough()
函数执行霍夫变换,得到霍夫矩阵;
(2)利用houghpeaks()
函数在霍夫矩阵中寻找峰值点;
(3)利用houghlines()
函数在之前2步结果的基础上得到原二值图像中的直线信息
1.霍夫变换
在MATLAB中,hough
函数用于执行霍夫变换,该函数的调用方法如下:
[H, theta, rho] = hough(BW, param1, vall, param2, val2)
其中BW
是边缘检测后的二值图像。param1
、value1
以及param2
、value2
为可选参数对。H
是变换得到的Hough矩阵。theta
和rho
为分别对应于Hough矩阵每一列和每一行的θ和ρ值组成的向量。
2.寻找峰值
在MATLAB中,houghpeaks
函数用于在霍夫矩阵中寻找峰值点。该函数的调用方法如下:
peaks = houghpeaks(H, numpeaks, param1, val1, param2, val2)
其中,H是由hough()
函数得到的Hough矩阵;numpeaks
是要寻找的峰值数目,默认为1; peaks
是一个Q×2的矩阵,每行的两个元素分别为某一峰值点在Hough矩阵中的行、列索引;Q
为找到的峰值点的数目。
3.提取直线段
在MATLAB中,houghlines
函数在之前2步结果的基础上得到原二值图像中的直线信息。该函数的调用方法如下:
lines = houghlines(BW, theta, rho, peaks, param1, val1, param2, val2)
其中,BW
是边缘检测后的二值图像;theta
和rho
是Hough矩阵每一列和每一行的θ和ρ值组成的向量,由hough函数返回;peaks
是一个包含峰值点信息的Q×2的矩阵,由houghpeaks
函数返回;lines
是一个结构体数组,数组长度是找到的直线条数。
利用霍夫变换来对图像进行处理
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');