logo资料库

Matlab 边缘检测与Hough变换.docx

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
实验目的:写一段代码实现一幅图像,其中分为以下两个步骤 边缘检测与 Hough 变换 1. 使用 Matlab 中的 canny 算子进行边缘检测,可以让使用者交互式的输入不同 的 Sigma 的值实现边缘检测。 2. 运用 Hough 变换来找到最突出的边缘,在图像中找到并画出最长的直线。 实验原理: canny 算子边缘检测的基本原理是:采用二维高斯函数的任一方向上的一阶方向 导数为噪声滤波器,通过与图像 f(x,y)卷积进行滤波,然后对滤波后的图像 寻找图像梯度的局部极大值,以确定图像边缘。 Canny 边缘检测算子是一种最优边缘检测算子。其实现步骤如下: 1) 用高斯滤波器平滑图像 2) 计算滤波后图像梯度的幅值和方向 3) 对梯度幅值应用非极大值抑制,其过程为找出图像梯度中的局部极大值 点,把其他非局部极大值置零,以得到细化的边缘; 4) 再用双阈值算法检测和连接边缘; 使用 canny 算子的 edge 函数调用格式为 BW=edge(I,'canny'); BW=edge(I,'canny',thresh,sigma); BW=edge(I,'canny',thresh); [BW,threshold]=edge(I,'canny',…); 2.Hough 变换时最常用的直线提取方法,它的基本思想是:将直线上每一个 数据点变换为参数平面中的一条直线或曲线,利用共线的数据点对应的参数 曲线相交于参数空间中一点的关系,使得直线提取问题转化为计数问题。 Hough 变换提取直线的主要优点是受直线中的间隙和噪声影响较小。 Hough 检测直线的 Matlab 实现:在 Matlab 图像处理工具箱中提供了 3 个与 Hough 变换有关的函数,分别为 hough 函数,houghpeaks 函数和 houghlines 函数。 hough 函数的调用格式为[H,theta,rho]=hough(BW);其中 BW 为二值图像, H 为 Hough 变换矩阵,theta 为变换轴间隔θ,rho 为元素个数。 Houghpeaks 函数是用来提取 Hough 变换后参数平面上的峰值点。其调用格 式为 peaks=houghpeaks(H,numpeaks),其中,H 为 Hough 函数的输出,参数平 面的技术结果矩阵,参数 numpeaks 为指定要提取的峰值数目,默认值为 1; 输出参数 peaks 为 Q*2 维峰值位置矩阵,其中 Q 为提取的峰值数目,peaks 的第 q 行分别存储第 q 个峰值的行和列坐标。 Hough 函数用于在图像中提取参数平面上的峰值点对应的直线。其调用格 式为 lines=houghlines(BW,theta,rho,peaks) Lines=houghlines(…,param1,val1,param2,val2) 其中,BW 与 Hough 函数的 BW 相同,为二值图象。theta 和 rho 为 hough 函数返回的输出,指示θ轴和ρ轴各个单元对应的值。Peaks 为 houghpeaks 函数返回的输出,指示峰值的行和列坐标,houghlines 函数将根据这些峰值 提取直线。Param 和 val 是参数对,用于指定是否合并或保留直线段的相关 参数,其取值有两种。当 param=’MinLength’时,bal 指定合并后的直线被保 留的门限长度,长度小于 val 的直线被舍去。当 param=’FillGap’时,val 指定 直线段被合并的门限间隔。如果两条斜率和截距均相同的直线段间隔小于
%edge 调用 Canny 为检测算子判别阈值为 0.5 %edge 调用 Canny 为检测算子判别阈值为 0.8 %edge 调用 Canny 为检测算子判别阈值为 1 val 给点的值,则它们被合并为一条直线。 实验程序与实验结果如下: %canny 算子边缘检测 clear all; I1=imread('F:\robot\Images\sniper.jpg'); I=rgb2gray(I1);% 彩色图像灰度化 imshow(I1); title('原始图像'); BW1= edge(I,'Canny',0.4,0.5) ; figure,imshow(BW1); title( '阈值为 0.4,sigma 值为 0.5 的 Canny 算子边缘检测图像 '); BW2= edge(I,'Canny',0.4,0.8) ; figure,imshow(BW2); title( '阈值为 0.4,sigma 值为 0.8 的 Canny 算子边缘检测图像'); BW20= edge(I,'Canny',0.4,1) ; figure,imshow(BW20); title( '阈值为 0.4,sigma 值为 1 的 Canny 算子边缘检测图像'); BW21= edge(I,'Canny',0.4,1.5) ; figure,imshow(BW21); title( '阈值为 0.4,sigma 值为 1.5 的 Canny 算子边缘检测图像 '); BW22= edge(I,'Canny',0.4,2) ; figure,imshow(BW22); title( '阈值为 0.4,sigma 值为 2 的 Canny 算子边缘检测图像 '); %Hough 变换检测直线程序 rotI=I; BW=edge(rotI,'canny',0.4,1.5); %用 canny 算子提取图像边缘 [H,T,R]=hough(BW); figure; imshow(H,[ ],'XData',T,'YData',R,... %对图像进行 Hough 变换 %edge 调用 Canny 为检测算子判别阈值为 1.5 %edge 调用 Canny 为检测算子判别阈值为 2 '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',58,'MinLength',5); figure,imshow(BW), title('直线标记结果'); 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','yellow'); 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','r'); 程序结果:
Hough 检测直线结果:
人机交互的实现: 使用 Matlab 的 GUI,可以让使用者输入不同的 Sigma 值得到不同的边缘检测效果。 创 建 的 人 机 交 互 界 面 , 如 下 图 gui 然后将代码导入相应的按钮所对应的函数中, 运行后如下图:
点击显示“原始图像”按钮,输入 Sigma 值为 1.5,点击“显示边缘检测后的图像”按钮, 和“显示标记最长直线图像”的按钮,显示结果如下: 。
分享到:
收藏