实验要求
选取一副图像(如房屋图像),利用hough变换检测,计算获得矢量化的边缘特征。
写下实验设计思路
- 读取图像:使用 imread 函数读取选定的房屋图像,将其存储在变量 I 中。
- 灰度化处理:对读取的彩色图像进行灰度化处理,通过 rgb2gray 函数将彩色图像转换为灰度图像。这一步是为了简化处理,同时保留图像的边缘信息。
- 边缘检测:利用 Sobel 算子进行边缘检测,得到二值化的边缘图像 BW。可以尝试不同的边缘检测算法,比如 Prewitt、Canny 等,并比较它们的效果。
- 执行 Hough 变换:对得到的二值化边缘图像 BW 执行 Hough 变换,得到 Hough 变换空间 H、角度参数数组 theta 和极径参数数组 rho。
- 寻找峰值:在 Hough 变换空间中寻找峰值,这些峰值对应着图像中的直线。可以通过调整阈值等参数来影响峰值的数量和质量,比如调整 houghpeaks 函数中的阈值参数。
- 寻找边界:利用之前得到的峰值信息,在边缘图像上使用 houghlines 函数寻找直线段,可以根据实际需求调整参数如 FillGap 和 MinLength 来控制直线段的连接和最小长度。
-
绘制图像和检测出的直线:最后,绘制原始图像并标记检测到的直线,可以通过 imshow 函数显示原始图像,再利用 plot 函数在图像上绘制检测到的直线。
代码实现(包含具体模块的注释等)
% 读取图像
I = imread('house2.jpg');
I = rgb2gray(I);
% 边缘检测
BW = edge(I, 'sobel');
% 执行Hough变换
[H,theta,rho] = hough(BW);
% 找到峰值
P = houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));
% 寻找边界
lines = houghlines(BW,theta,rho,P,'FillGap',5,'MinLength',7);
% 绘制图像和检测出的直线
figure, imshow(I), hold on
for k = 1:length(lines)
xy = [lines(k).point1; lines(k).point2];
plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');
end
实验结果
原图:
Hough变换后:
实验总结
通过本次实验,我加深了对Hough变换和边缘检测在图像处理中的重要性的认识。通过Sobel算子进行边缘检测,成功提取出了图像中的边缘信息,为后续的直线检测提供了基础。Hough变换能够将图像中的直线转化到参数空间中,并通过参数空间中的峰值来检测图像中的直线。合理选择Hough变换的阈值和最小线段长度等参数对于获得准确的直线检测结果至关重要。
在实际应用中,需要针对不同类型的图像进行参数调节,以平衡灵敏度和准确性。针对复杂背景和噪声干扰较大的图像,可以考虑引入其他图像处理技术,如去噪或形态学操作,以提高直线检测的鲁棒性。