Matlab 使用Hough霍夫变换进行直线检测+寻找最长直线

本文介绍了一种基于霍夫变换检测图像中最长直线的方法。首先利用Prewitt算子进行边缘检测,然后通过Matlab的hough函数计算霍夫变换矩阵。接着使用houghpeaks函数找出峰值点,最后通过houghlines函数确定直线段,从而找出图像中最长的直线。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本思路

先使用上文介绍的Prewitt算子将输入的图像边缘化处理,再使用霍夫变换检测直线。
其中使用到了matlab的hough,houghpeaks,houghlines等函数.

  1. 函数hough
    [H, theta, rho] = hough(f) 或 [H, theta, rho] = hough(f, ‘ThetaRes’, val1, ‘RhoRes’, val2)
    其中,H是霍夫变换矩阵,theta(以度计)和rho是ρ和θ值向量,在这些值上产生霍夫变换。输入f是二值图像,val1是0到90的标量,指定了沿θ轴霍夫变换的间距(默认是1),val2是0。

  2. 函数houghpeaks
    线检测和连接用的霍夫变换的第一步是用高的计数寻找累加单元(工具箱文本把高的计数单元作为峰值)。因为存在霍夫变换参数空间中的量化和典型图像的边缘并不是很完美的直线这样的事实,霍夫变换的峰值倾向于相比霍夫变换单元更多。函数houghpeaks用任意默认语法来寻找指定的峰值数:
    peaks = houghpeaks(H, NumPeaks) 或peaks = houghpeaks(…, ‘Threshold’, val1, ‘NHoodSize’, val2)

  3. 函数houghlines
    一旦一组候选的峰值在霍夫变换中被识别出来,如果存在与这些峰值相关的有意义的线段,剩下的就是决定线的起始点和终点。函数houghlines用默认的语法执行这个任务:
    lines = houghlines(f, theta, rho, peaks) 或lines = houghlines(…, ‘FillGap’, val1, ‘MinLength’, val2)
    其中,theta和rho是来自函数hough的输出,peaks是函数houghpeaks的输出。输出lines是结构数组(可能检测到多条直线),长度等于找到的线段数。结构中的每个元素可以看成一条线,并含有下列字段:
    point1:两元素向量[r1, c1],指定了线段起点的行列坐标。
    point2:两元素向量[r2, c2],指定了线段终点的行列坐标。
    theta:与线相关的霍夫变换的以度计量的角度。
    rho:与线相关的霍夫变换的ρ轴位置。

寻找最长直线将每个两个点坐标遍历一遍记录最长距离的两个点并输出。

代码实现

mian.m

% Find the longest line segment based on Hough transform.
[x, y] = mylineextraction(f);
% Plot the line in the image
figure; imshow(Im, [min(min(Im)) max(max(Im))]), hold on
plot([x(1) y(1)], [x(2) y(2)],'LineWidth',2,'Color','blue');
plot(x(1),x(2),'x','LineWidth',2,'Color','red');
plot(y(1),y(2),'x','LineWidth',2,'Color','red');
hold off

mylineextraction.m

function [bp, ep] = mylineextraction(BW)
%   The function extracts the longest line segment from the given binary image
%       Input parameter:
%       BW = A binary image.
%
%       Output parameters:
%       [bp, ep] = beginning and end points of the longest line found
%       in the image.
[n, m] = size(BW);
[H,T,R] = hough(BW);
P  = houghpeaks(H,8,'threshold',ceil(0.2*max(H(:))));
lines= houghlines(BW,T,R,P,'FillGap',20,'MinLength',7);
maxLength = 0;
for k = 1:length(lines)  
    xy = [lines(k).point1; lines(k).point2];
    if (((xy(1,1) - xy(2,1))^2 + (xy(1,2) - xy(2,2))^2) > maxLength) 
        maxLength = (xy(1,1) - xy(2,1))^2 + (xy(1,2) - xy(2,2))^2;
        bp = xy(1,:);
        ep = xy(2,:);
    end
end  

示例输入与输出

输入图片

输入图片

输出图片 已找到图片中最长的直线

输出图片

### 使用 MATLABHough 变换检测图像中的最长直线MATLAB 中,可以通过结合 `hough`、`houghpeaks` 和 `houghlines` 函数来检测图像中的最长直线。以下是实现此功能的详细方法: 1. **读取图像进行边缘检测** 使用 `edge` 函数对输入图像进行边缘检测,生成二值边缘图像。这一步是霍夫变换的基础,因为霍夫变换主要用于处理二值化后的边缘图像[^1]。 2. **执行霍夫变换** 使用 `hough` 函数计算霍夫变换矩阵 `H`,返回角度向量 `theta` 和距离向量 `rho`。这些参数将用于后续的峰值检测和线段提取。 3. **检测霍夫变换中的峰值** 使用 `houghpeaks` 函数从霍夫变换矩阵中找到最强的峰值点。可以通过设置参数 `N` 来限制检测到的峰值数量。例如,若只想检测直线,则可以设置 `N=1`。 4. **提取直线信息** 使用 `houghlines` 函数基于检测到的峰值提取直线信息。通过设置 `'FillGap'` 和 `'MinLength'` 参数,可以进一步优化线段提取的结果[^2]。 5. **筛选最长直线** 如果检测到多直线,可以通过计算每直线的长度,选择最长的一直线长度可以通过其起点和终点坐标计算得出。 以下是一个完整的 MATLAB 示例代码,展示如何使用霍夫变换检测图像中的最长直线: ```matlab % 读取图像 I = imread('your_image.jpg'); imshow(I); title('Original Image'); % 转换为灰度图像进行边缘检测 BW = edge(rgb2gray(I), 'canny'); figure, imshow(BW); title('Edge Detected Image'); % 执行霍夫变换 [H, theta, rho] = hough(BW); % 显示霍夫变换结果 figure, imshow(imadjust(mat2gray(H)), [], 'XData', theta, 'YData', rho,... 'InitialMagnification','fit'); title('Hough Transform'); xlabel('\theta'), ylabel('\rho'); axis on, axis normal; % 检测霍夫变换中的峰值 P = houghpeaks(H, 10, 'threshold', ceil(0.3*max(H(:)))); % 提取直线信息 lines = houghlines(BW, theta, rho, P, 'FillGap', 5, 'MinLength', 7); % 筛选最长直线 maxLength = 0; longestLine = []; for k = 1:length(lines) % 获取起点和终点坐标 point1 = lines(k).point1; point2 = lines(k).point2; % 计算直线长度 length_k = norm(point2 - point1); % 更新最长直线 if length_k > maxLength maxLength = length_k; longestLine = lines(k); end end % 在原图上绘制最长直线 figure, imshow(I), hold on; x = [longestLine.point1(1), longestLine.point2(1)]; y = [longestLine.point1(2), longestLine.point2(2)]; plot(x, y, 'LineWidth', 2, 'Color', 'green'); title('Longest Line Detected'); hold off; ``` ### 注意事项 - 上述代码假设输入图像为彩色图像。如果输入为灰度图像,可以直接跳过 `rgb2gray` 转换。 - `'FillGap'` 和 `'MinLength'` 参数可以根据具体需求调整,以获得更准确的结果[^2]。 - 若图像中存在多相似长度的直线,可能需要进一步分析或设定更严格的阈值件。 ### 结果解释 最终输出的 `longestLine` 包含最长直线的相关信息,包括起点坐标 `point1`、终点坐标 `point2`、角度 `theta` 和距离 `rho`[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值