您现在的位置是:首页 >技术交流 >【图像处理】图像的边缘检测(Matlab代码实现)网站首页技术交流

【图像处理】图像的边缘检测(Matlab代码实现)

荔枝科研社 2023-05-26 16:00:02
简介【图像处理】图像的边缘检测(Matlab代码实现)

 👨‍🎓个人主页:研学社的博客  

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现


💥1 概述

自然图像中检测边缘与对象边界一直都是计算机视觉中的一项基本问题,边缘检测在一些视觉领域,如图像分割、物体检测/ 识别、跟踪和运动分析、医学成像、3D 重建等传统任务,和现代应用自动驾驶中发挥着重要作用。多年来,许多研究者致力于提高边缘检测评估标准:单图最佳阈值(optimal image scale OIS )、全局最佳阈值(optimal dataset scale ODS )、平均准确率
average precision AP )。随着神经网络的快速发展,边缘检测分化为两个阵营:传统检测方法和基于深度学习的检测方法。图 1 显示了两种方法执行边缘检测任务的一般流程。
一些边缘检测 [1] 方法仅基于颜色、文本或其他低级特征来预测边界:
1 )早期梯度算子方法,如一阶边缘检测算子 Sobel 算子 [2] Robert 算子 [3] ,二阶边缘检测算
Laplacian 算子 [4] ,还有工业界中常用的 Canny 算子 [5] 。 

2)基于人工设计特征方法,如统计边缘[6] 、概率边界 (probability boundaryPb)PMI(pointwise mutual information),和结构化边缘检测算法,如 SE(struc-tured forests edge detection)算法[9] 等。传统的边缘检测方法提取边缘已经取得了相当大的进步,但是对噪声

抑制、边缘定位和精细边缘的处理仍得不到改善。

边缘检测是一个经典的计算机视觉问题,需要识别图像中的边缘以建立对象边界并分离感兴趣的目标。 一张 M × N 的灰度图片表示为一个由二元函数组成的 二维矩阵:

 

彩色图像中,每一个像素点又包含 RGB 三个通道,其强度范围都在 0~255 之间。把图像某一行中的所有像素绘制成三条曲线,可以得到由像素强度绘制的波形图,如图2 所示。

 

图中曲线的波动幅度表示为颜色等特征的变化程度,采样区域变化剧烈(如 pixels 坐标 130 处,图 2 (a)中 白色网格框所示)。这表明变化剧烈的波可能是包含边缘的区域,也进一步说明波和图像之间联系紧密,图像的本质就是各种色彩波的叠加。利用图像滤波器将低频过滤,保留变化剧烈的区域,即图像中的边缘。边缘一般是指在像素强度局部剧烈变化的区域。其强度变化主要有两类:
1 )阶跃变化,表示强度由暗到亮渐变的过程;
2 )屋顶变化,表示由暗到亮,再由亮到暗的过程。把边缘检测的目标总结为找到具有阶跃变化或屋顶变化像素点的集合。计算某像素点及其邻域的微分找到变化剧烈的像素点,对于具有阶跃变化的像素点,其一阶微分最大或二阶微分为0 则为边缘点;具有屋顶变化的像素点,其一阶微分为0 或二阶微分最大则为边缘点。继而引出传统边缘检测基于梯度(一阶与二阶微分)的方法,如Sobel [2] Canny [5] 等经典算法。

📚2 运行结果

 

 

 

 

 

 

 

 

 

部分代码:

function idxLocalMax=cannyFindLocalMaxima(direction,ix,iy,mag)
%功能:实现非极大抑制功能
%输入:direction-4个方向
%      ix-图像在x方向滤波结果
%      iy-图像在y方向滤波结果
%      mag-滤波幅度

[m,n,o]=size(mag);
%根据梯度幅度确定各点梯度的方向,并找出四个方向可能存在的边缘点的坐标。
switch direction
    case 1
        idx=find((iy<=0&ix>-iy)|(iy>=0&ix<-iy));
    case 2
        idx=find((ix>0&-iy>=ix)|(ix<0&-iy<=ix));
    case 3
        idx=find((ix<=0&ix>iy)|(ix>=0&ix<-iy));
    case 4
        idx=find((iy<0&ix<=iy)|(iy>0&ix>=iy));
end
%去除图像边界以外点
if~isempty(idx)
    v=mod(idx,m);
    extIdx=find(v==1|v==0|idx<=m|idx>(n-1)*m);
    idx(extIdx)=[];
end
%求出可能的边界点的滤波值
ixv=ix(idx);
iyv=iy(idx);
gradmag=mag(idx);
%计算4个方向的梯度幅度
switch direction
    case 1
        d=abs(iyv./ixv);
        gradmag1=mag(idx+m).*(i-d)+mag(idx+m-1).*d;
        gradmag2=mag(idx-m).*(i-d)+mag(idx-m+1).*d;
    case 2
         d=abs(ixv./iyv);
        gradmag1=mag(idx+1).*(i-d)+mag(idx+m-1).*d;
        gradmag2=mag(idx-1).*(i-d)+mag(idx-m+1).*d;
    case 3
        d=abs(ixv./iyv);
        gradmag1=mag(idx-1).*(i-d)+mag(idx-m-1).*d;
        gradmag2=mag(idx+1).*(i-d)+mag(idx+m+1).*d;
    case 4
        d=abs(iyv./ixv);
        gradmag1=mag(idx-m).*(i-d)+mag(idx-m-1).*d;
        gradmag2=mag(idx+m).*(i-d)+mag(idx+m+1).*d;
end
%进行非极大抑制
idxLocalMax=idx(gradmag>=gradmag1&gradmag>=gradmag2);

🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。

[1]肖扬,周军.图像边缘检测综述[J].计算机工程与应用,2023,59(05):40-54.

[2]刘仲驰.基于果蝇算法的网络图像边缘检测方法[J].自动化应用,2022(11):81-83+86.DOI:10.19769/j.zdhy.2022.11.020.

🌈4 Matlab代码实现

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。