代码打卡(1)——基于hough变换的图像边缘提取

引言:

在计算机视觉和图像处理领域,图像边缘提取是一个重要的任务,它对于图像分析和特征提取具有重要意义。本文介绍了一种基于霍夫变换的图像边缘提取方法,并给出了实验结果和代码实现。图像分割的依据是基于图像中各区域具有不同的特性(比如,灰度、颜色、纹理)。图像分割的目的是将图像划分成若干具有相近或相同特性的子区域,以便继续在分割成的相关区域中提取目标,并进而根据目标的特征或结构信息对其进行分类和识别,最后再给出对整幅图像分析结果的描述信息。所以,图像分割就显得尤为重要。

hough变换原理

说白了,就是将图像上的点映射到累加的参数空间,实现对已知解析式曲线的识别。让我细细跟你道来,我们都知道,要确认一条直线y=qx+p,我们需要知道斜率q和截距p,这时候我们可以把这条直线映射到参数空间,就是变换成p=y-xq,我们就可以把直线上的每一个点映射到参数空间变成一条直线,这时候我们会发现,每条直线都会相交于一个点(q,p),而这两个点又恰恰是原直线的截距和斜率,因此便可以确认那条直线了。(自己根据老师上课说的理解)

实验设计思路

本次实验的目的是利用霍夫变换来提取图像的边缘信息。实验步骤如下:

  1. 读取图像:使用imread函数读取指定路径下的图像文件。

  2. 将图像转换为灰度图像:使用rgb2gray函数将读取到的彩色图像转换为灰度图像,以便进行边缘检测。

  3. 对图像进行边缘检测:使用edge函数对灰度图像进行边缘检测,这里使用了Canny算子。

  4. 进行霍夫变换并检测直线:使用hough函数进行霍夫变换,并使用houghpeaks函数选择前20个峰值点作为直线的候选点。然后使用houghlines函数根据选择的峰值点检测直线,参数'FillGap'和'MinLength'用于控制直线的连接和最小长度。

  5. 计算矢量化的边缘特征:根据检测到的直线的起点和终点坐标,计算直线的方向向量,并将其归一化,最后存储到edgeFeatures矩阵中。

  6. 显示图像和检测到的直线:使用subplot函数将原始图像和边缘检测结果显示在同一个窗口中,然后使用imshow函数显示图像,使用plot函数在图像上绘制检测到的直线。

具体代码实现

% 读取图像
image = imread('F:/imge/house.jpg');

% 将图像转换为灰度图像
grayImage = rgb2gray(image);

% 对图像进行边缘检测
edges = edge(grayImage, 'Canny');

% 进行霍夫变换并检测直线
[H,theta,rho] = hough(edges);
peaks = houghpeaks(H, 20); % 选择前20个峰值点
lines = houghlines(edges, theta, rho, peaks, 'FillGap', 20, 'MinLength', 50);

% 计算矢量化的边缘特征
edgeFeatures = zeros(length(lines), 2);
for k = 1:length(lines)
    % 获取直线的起点和终点坐标
    startPoint = lines(k).point1;
    endPoint = lines(k).point2;
    
    % 计算直线的方向向量
    directionVector = endPoint - startPoint;
    
    % 归一化方向向量
    normalizedVector = directionVector / norm(directionVector);
    
    % 存储矢量化的边缘特征
    edgeFeatures(k, :) = normalizedVector;
end

% 显示图像和检测到的直线
figure;
subplot(1, 2, 1);
imshow(image);
title('Original Image');
subplot(1, 2, 2);
imshow(edges);
title('Edge Detection');

figure;
imshow(image);
hold on;
for k = 1:length(lines)
    xy = [lines(k).point1; lines(k).point2];
    plot(xy(:, 1), xy(:, 2), 'LineWidth', 2, 'Color', 'red');
end
hold off;
title('Detected Lines');

我们需要先准备一张图片,这里我准备了一张房子的图片(house.jpg);其中引用了:imread()、rgb2gray()、edge()、hough()、houghpeaks()、houghlines()等函数实现。

实验结果

运行该程序后,得到图像的边缘信息。通过霍夫变换提取的边缘,可以用于图像分析、特征提取等应用。实验结果表明,该方法能够有效地提取图像中的边缘信息。运行该程序后,得到两张图像。第一张是原始图像与边缘图像的对比,第二张是原始图像,并在其上绘制了检测到的直线。

结果如下:

实验总结

本次实验基于霍夫变换实现了图像边缘检测和直线检测的功能,通过Matlab进行编程实现。主要的步骤包括读取图像、转换为灰度图像、使用Canny算子进行边缘检测、使用霍夫变换进行直线检测、计算直线的矢量化特征、在图像上绘制检测到的直线并输出结果。

通过本次实验,我们学习到了以下内容:

  1. 图像处理基础:了解了图像处理的基本原理和常用算法,如边缘检测、霍夫变换等。

  2. Matlab编程技巧:掌握了一些Matlab编程的技巧和方法,如读取图像、图像处理和可视化等,并应用这些技巧完成了本次实验。

  3. 实际操作经验:通过实践操作,更好地理解了图像处理和编程的相关知识,同时也增加了自己的实际操作经验。

总的来说,本次实验让我们更加深入地了解了图像处理的基本原理和常用算法,并通过实践操作提高了自己的编程能力和实际操作经验,对于今后的研究和工作也会有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值