一、Hough变换的定义
霍夫变换是一种从图像空间到参数空间的变换。对于直线检测问题,参数空间是一个二维直角坐标系(ρ, θ),其中ρ表示原点到直线的距离,θ表示该直线与水平轴的夹角。对于圆检测问题,参数空间则是径向距离和极角(r, θ)组成的三维空间。霍夫变换通过统计图像空间中每个像素点对
二、霍夫变换的原理
在直线检测中,对于图像中的每一个点(x, y),可以找出所有可能经过这个点的直线在参数空间(ρ, θ)中的表示。当图像中有大量共线的像素点时,它们在参数空间中对应的(ρ, θ)值会在某一点(或一条线上)积累大量的投票,从而形成了明显的峰值,这个峰值就对应于图像中的直线参数。
具体步骤如下:
- 对图像中的每个像素点进行遍历。
- 对于每个像素点,计算出所有可能经过该点的直线在参数空间(ρ, θ)中的坐标。
- 在参数空间中对应的坐标位置进行累加计数,形成累积直方图。
- 查找累积直方图中的峰值,这些峰值对应的参数(ρ, θ)就是图像中潜在的直线参数。
霍夫变换的优点在于它对图像中的断裂、缺失、噪声等情况有一定的鲁棒性,因为即使直线在图像中被打断,只要打断的部分仍属于同一直线,它们在参数空间中累积的计数仍然会在一起形成峰值。
三、Hough变换实现尺寸测量
尺寸测量的整体流程
(1)输入原始图像
输入一张图像,图像左上角为3mm的标度尺
(2)Sobel边缘检测
边缘检测模块使用Sobel算子,Sobel算子是一种用于图像边缘检测的微分算子,它通过计算图像中像素灰度值在水平和垂直方向上的梯度来检测图像中的边缘。Sobel算子在水平、垂直方向上的模板是一个3x3的卷积核,其系数如图所示。
计算结果表示的是该像素点处图像水平方向上的梯度强度,即左右两边像素灰度值的变化程度。当像素点处于水平边缘时,由于两侧像素灰度差异较大,所以该点的水平梯度值将会很高。同样地,垂直方向上的模板应用于图像时,也是对每个像素点与其上下邻域内的像素进行加权求和,反映的是该像素点处图像垂直方向上的梯度强度,即上下两边像素灰度值的变化情况。当像素点处于垂直边缘时,其垂直梯度值将显著增大。综合这两个方向的结果,可以得到一个像素点的梯度幅度(通常采用欧氏距离或者幅角的方式来表征),以及可能的方向信息。最终通过设定阈值可以确定哪些像素点位于边缘,并根据梯度方向得到边缘的方向。得到边缘检测的图像:
MATLAB自编函数实现Sobel边缘检测
% 边缘检测 - Sobel 算法
for i = 2:rows-1
for j = 2:cols-1
% 提取当前像素周围的区域
region = gray(i-1:i+1, j-1:j+1);
% 计算梯度
gradient_x = sum(sum(Gx .* region)); % 二维卷积 .*只能与双精度类型或者同类的整数间使用
gradient_y = sum(sum(Gy .* region));
% 计算梯度幅度
gradient(i, j) = sqrt(gradient_x^2 + gradient_y^2);
end
end
% 阈值处理 - 仅保留大于阈值的梯度
% 可以根据需要调整此阈值
threshold_bw = 120;
edges = gradient > threshold_bw;
BW = edges;
% 显示边缘检测后的图像
figure(4); imshow(edges); title('边缘检测后的图像');
% 结束计时并获取处理时间
processingTime = toc;
% 输出处理时间
fprintf('边缘检测用时: %.3f 秒\n', processingTime);
(3)Hough变换检测直线
自编Hough变换函数,首先输入图像必须是二值图像:函数首先使用assert函数确保输入图像是二值图像,即只包含黑白两种颜色的图像。函数定义了极坐标参数的范围。theta表示角度,范围为-90到89度,共180个角度。rho表示极径,范围为从负的最大极径到正的最大极径,共2