精华内容
下载资源
问答
  • 图像边缘提取算法的分析;概述;Roberts算子;抗噪性能;性能分析;Sobel算子;抗噪性能;Prewitt算子;抗噪性能;性能分析;Kirsch算子;抗噪性能;Robinson算子;抗噪性能;二阶算子检测;抗噪性能;性能分析;LOG算子;抗噪性能;...
  • (4)光照不连续 作用: (1)改良图像质量(2)理解和重构视觉场景 )分离对象 (4)识别特征 (5)其他 201810/14 Roberts算子 是一种利用局部差分算子寻找边缘的算子, 两个模板分别为 算法步骤(两种处理方法) (1)T,D=Va D-f...
  • 基于高斯映射聚类边缘提取算法提出了一种快速而精确的新方法,通过凝聚聚类和估计法线将高斯球中的法线进行聚类,通过分析每个点最近邻域点的协方差矩阵特征值来检测边缘特征。对不同的点云对象进行边缘提取对比实验,...
  • 图像边缘提取算法

    2012-06-21 15:13:30
    实现图像边缘提取算法,采用robert算子、prewitt算子、sobel算子对图像进行边缘提取。matlab实现。
  • 介绍了四种经典的笔迹边缘提取算法,通过实验结果分析得出Sobel算子在提取维吾尔文笔迹边缘时效果较好。提出一种与文本无关、特征融合的笔迹鉴别方法,融合的特征包括改进网格窗口微结构特征和笔迹曲向特征,该方法采用...
  • 针对此问题,本文提出基于Canny算子并结合图像增强和数学形态学的综合边缘提取算法。该算法首先对原始图像进行增强,以便于计算机的分析;然后利用Canny算子对CT图片进行边缘提取,该算子具有非极大值抑制和双阈值法...
  • 图像边缘提取算法源程序
  • 一种基于八邻域深度差的点云边缘提取算法.pdf,提出了一种基于八邻域深度差(8N DD)的点云边缘提取算法。算法根据目标特征的点云,对每个特征点沿深度方向进行垂直投影并对投影点进行栅格划分,计算出每个栅格内投影...
  • 基于DSP实现图像边缘提取算法,齐立荣,任建华,在研究了当前数字视频图像技术发展的基础上,本文提出了基于DSP 的数字图像采集与处理系统,并在该系统上实现了经典数字图像边缘��
  • 介绍了四种经典的笔迹边缘提取算法,通过实验结果分析得出Sobel算子在提取维吾尔文笔迹边缘时效果较好。提出一种与文本无关、特征融合的笔迹鉴别方法,融合的特征包括改进网格窗口微结构特征和笔迹曲向特征,该方法...
  • 提出一种通过种子边缘点提取闭合点云...通过实验分析邻域半径和搜索视角对算法边缘提取效果的影响,并采用合适的半径与搜索视角,对尖锐边缘与相交边缘进行点云提取,获得了准确的点云边缘,从而证明了该算法的有效性。
  • 针对蚁群算法在图像边缘提取中经常出现收敛速度慢、检测精度低、停滞等问题,提出一种结合Powell法的排序加权蚁群(rank weighted ant colony optimization,RWACO)图像边缘提取算法。该算法将RWACO与Powell法相...
  • 一种用于噪声图像边缘提取的算法首先对噪声图像进行小尺度高斯滤波,使用新型边缘检测...实验结果表明,该算法能够有效地从噪声图像中提取物体的真实边缘,并能最大限度地保留细节信息,性能优于经典的边缘提取算法
  • 边缘提取算法.pdf

    2020-04-23 23:54:58
    public class EdgeDetect : ImageInfo { /* * * Roberts, Sobel, Prewitt, Kirsch, GaussLaplacian * 水平检测垂直检测边缘增强边缘均衡化 * * / /// <summary> /// 对两幅图像进行梯度运算 /// </summary> /// 位图...
  • 边缘提取算法.doc

    2020-03-01 17:10:33
    public class EdgeDetect : ImageInfo ? { ? /* ? * ? * Roberts, Sobel, ... * 水平检测垂直检测边缘增强边缘均衡化 ? * ? */ ? ? /// <summary> ? /// 对两幅图像进行梯度运算 ? /// </summary> ? /// <param na
  • 边缘提取算子 一阶:Roberts算子、Sobel算子、Prewitt算子、Kirsch算子、Robinson算子 二阶: Laplacian算子、Canny算子、Marr-Hildreth(LoG算子) Roberts 算子 在(i+1/2,j+1/2)处差分 转化为模板即为 ...

    边缘提取算子

    一阶:  Roberts算子、Sobel算子、Prewitt算子、Kirsch算子、Robinson算子

    二阶: Laplacian算子、Canny算子、Marr-Hildreth(LoG算子)

     

    Roberts 算子

    在(i+1/2,j+1/2)处差分

    转化为模板即为

    Roberts算子,又称罗伯茨算子,是一种最简单的算子,是一种利用局部差分算子寻找边缘的算子。他采用对角线方向相邻两象素之差近似梯度幅值检测边缘。检测垂直边缘的效果好于斜向边缘,定位精度高,对噪声敏感,无法抑制噪声的影响。

    Roberts算子检测方法对具有陡峭的低噪声的图像处理效果较好,但是提取边缘的结果是边缘比较粗,因此边缘的定位不是很准确。

     

    Sobel算子

    Sobel算法是一个离散的一阶差分算子,用来计算图像亮度函数的一阶梯度之近似值。在图像的任何一点使用此算子,将会产生该点对应的梯度矢量或是其法矢量。

     

    Prewitt算子

    Prewitt算子是一种一阶微分算子边缘检测,利用像素点上下、左右邻点的灰度差,在边缘处达到极值检测边缘,去掉部分伪边缘,对噪声具有平滑作用。

    其原理是在图像空间利用两个方向模板与图像进行邻域卷积来完成的,这两个方向模板一个检测水平边缘,一个检测垂直边缘。

    Prewitt算子检测方法对灰度渐变和噪声较多的图像处理效果较好。但边缘较宽,而且间断点多。

    对数字图像f(x,y),Prewitt算子的定义如下:

    G(i)={[f(i-1,j-1)+f(i-1,j)+f(i-1,j+1)]-[f(i+1,j-1)+f(i+1,j)+f(i+1,j+1)]}

    G(j)={[f(i-1,j+1)+f(i,j+1)+f(i+1,j+1)]-[f(i-1,j-1)+f(i,j-1)+f(i+1,j-1)]}

    则P(i,j)=max[G(i),G(j)]或 P(i,j)=G(i)+G(j)

     

    Kirsch算子

    Kirsch算子是R.Kirsch提出来一种边缘检测算法,它采用8个3*3的模板对图像进行卷积,这8个模板代表8个方向,并取最大值作为图像的边缘输出,8个模板如下,它在保持细节和抗噪声方面都有较好的效果。

     

     

    Robinson算子

    规则同上,也是8个模板。

     

    Laplacian算子

    Laplacian算子法对噪声比较敏感,所以很少用该算子检测边缘,而是用来判断边缘像素视为与图像的明区还是暗区。

    Laplacian 算子是n维欧几里德空间中的一个二阶微分算子,定义为梯度grad的散度div。可使用运算模板来运算这定理定律。

    函数的拉普拉斯算子也是该数的黑塞矩阵的迹,可以证明,它具有各向同性,即与坐标轴方向无关,坐标轴旋转后梯度结果不变。

    Laplacian 算子对噪声比较敏感,所以图像一般先经过平滑处理,因为平滑处理也是用模板进行的,所以,通常的分割算法都是把Laplacian 算子和平滑算子结合起来生成一个新的模板。

    如果邻域系统是4 邻域,Laplacian 算子的模板为:

    如果邻域系统是8 邻域,Laplacian 算子的模板为:

     

    Canny算子

    Canny方法不容易受噪声干扰,能够检测到真正的弱边缘。

    优点在于,使用两种不同的阈值分别检测强边缘和弱边缘,并且当弱边缘和强边缘相连时,才将弱边缘包含在输出图像中。

    该算子效果较好,但是它实现起来较为麻烦,Canny算子是一个具有滤波,增强,检测的多阶段的优化算子,在进行处理前,Canny算子先利用高斯平滑滤波器来平滑图像以除去噪声,Canny分割算法采用一阶偏导的有限差分来计算梯度幅值和方向,在处理过程中,Canny算子还将经过一个非极大值抑制的过程,最后Canny算子还采用两个阈值来连接边缘。

    Canny边缘检测算法

    step1: 用高斯滤波器平滑图象;

    step2: 用一阶偏导的有限差分来计算梯度的幅值和方向;

    step3: 对梯度幅值进行非极大值抑制

    step4: 用双阈值算法检测和连接边缘

    参考:

    https://blog.csdn.net/fengye2two/article/details/79190759

    https://blog.csdn.net/jiachen0212/article/details/80078685

    https://www.cnblogs.com/zhuifeng-mayi/p/9563947.html

    https://www.cnblogs.com/techyan1990/p/7291771.html

     

    Marr-HildrethLoG算子

    LoG可以看成是一个高斯模板的拉普拉斯变换   Laplace of Gaussian

    (图像的高斯拉普拉斯(LoG),可利用差分高斯(DoG)近似)

    参考:

    好:LOG高斯-拉普拉斯算子 https://blog.csdn.net/touch_dream/article/details/62237018 

    DoG算子和LoG算子 https://blog.csdn.net/dreamguard/article/details/83988814

    好:LoG算子 https://blog.csdn.net/songzitea/article/details/12851079

    LOG边缘检测--Marr-Hildreth边缘检测算法 https://blog.csdn.net/bettyshasha/article/details/51757185  

    好:SIFT特征点检测,特征点描述,特征点匹配理解 https://blog.csdn.net/ds0529/article/details/79617619

    matlab代码

     

    matlab自带edge函数

    matlab中edge函数提供了很多算子,函数原型和算子包括:

    matlab自带edge函数 使用代码:

    clear;clc;
    
    %读取图像
    I=imread('Lena512.png');
    %I=rgb2gray(I);
    figure;imshow(I,[]);title('Original Image');
    
    %sobel----------------------
    sobelBW = edge(I,'sobel',0.06);  %可以省去0.06,系统会默认。
    figure;imshow(sobelBW,[]);title('Sobel 0.06')
    
    %roberts----------------------
    robertsBW=edge(I,'roberts');
    figure;imshow(robertsBW);title('Roberts Edge');
    
    %prewitt----------------------
    prewittBW=edge(I,'prewitt');
    figure;imshow(prewittBW);title('Prewitt Edge');
    
    %Laplacian----------------------
    logBW=edge(I,'log');
    figure;imshow(logBW);title('Laplasian of Gaussian Edge');
    
    %canny----------------------
    cannyBW=edge(I,'canny');
    figure;imshow(cannyBW);title('Canny Edge');
    
    %高斯滤波 再 canny ----------------------
    h=fspecial('gaussian',5);%高斯滤波
    I2=imfilter(I,h,'replicate');
    GcannyBW=edge(I2,'canny');%高斯滤波后使用Canny算子进行边缘检测
    figure;imshow(GcannyBW);title('Gaussian & Canny Edge');

     

    非matlasb自带 :梯度法、roberts算子、prewitt算子、sobel算子、krisch算子、LoG算子

    %% 非matlasb自带 :梯度法、roberts算子、prewitt算子、sobel算子、krisch算子、LoG算子
    clear;clc;close all
    f=imread('Lena512.png');
    T=20;%阈值
    [m,n]=size(f);
    %------梯度法-------
    f_g=zeros(m,n);
    for i=2:m-1
        for j=2:n-1
            f_g(i,j)=abs(f(i+1,j)-f(i,j))+abs(f(i,j+1)-f(i,j));
            if f_g(i,j)<T
                f_g(i,j)=0;
            else
                f_g(i,j)=255;
            end
        end
    end
    figure(1);
    subplot(2,3,1);imshow(uint8(f_g));title('梯度法');
    %------roberts算子-------
    f_r=zeros(m,n);
    for i=2:m-1
        for j=2:n-1
            f_r(i,j)=abs(f(i+1,j+1)-f(i,j))+abs(f(i,j+1)-f(i+1,j));
            if f_r(i,j)<T
                f_r(i,j)=0;
            else
                f_r(i,j)=255;
            end
        end
    end
    %f_r=imbinarize(imfilter(f,r),T);
    subplot(2,3,2);imshow(uint8(f_r));title('Roberts算子');
     
    %------prewitt算子-------
    f_p=zeros(m,n);
    for i=2:m-1
        for j=2:n-1
            f_p(i,j)=abs(f(i-1,j-1)+f(i,j-1)+f(i+1,j-1)-f(i-1,j+1)-f(i,j+1)-f(i+1,j+1))+abs(f(i+1,j-1)+f(i+1,j)+f(i+1,j+1)-f(i-1,j-1)-f(i-1,j)-f(i-1,j+1));
            if f_p(i,j)<15
                f_p(i,j)=0;
            else
                f_p(i,j)=255;
            end
        end
    end
    subplot(2,3,3);imshow(uint8(f_p));title('Prewitt算子');
     
    %------sobel算子-------
    f_s=zeros(m,n);
    for i=2:m-1
        for j=2:n-1
            f_s(i,j)=abs(f(i-1,j-1)+2*f(i,j-1)+f(i+1,j-1)-f(i-1,j+1)-2*f(i,j+1)-f(i+1,j+1))+abs(f(i+1,j-1)+2*f(i+1,j)+f(i+1,j+1)-f(i-1,j-1)-2*f(i-1,j)-f(i-1,j+1));
            if f_s(i,j)<T
                f_s(i,j)=0;
            else
                f_s(i,j)=255;
            end
        end
    end
    subplot(2,3,4);imshow(uint8(f_s));title('Sobel算子');
     
    %------krisch算子-------
    k(:,:,1)=[-3,-3,-3;
        -3,0,5;
        -3,5,5];
    k(:,:,2)=[-3,-3,5;
        -3,0,5;
        -3,-3,5];
    k(:,:,3)=[-3,5,5;
        -3,0,5;
        -3,-3,-3];
    k(:,:,4)=[-3,-3,-3;
        -3,0,-3;
        5,5,5];
    k(:,:,5)=[5,5,5;
        -3,0,-3;
        -3,-3,-3];
    k(:,:,6)=[-3,-3,-3;
        5,0,-3;
        5,5,-3];
    k(:,:,7)=[5,-3,-3;
        5,0,-3;
        5,-3,-3];
    k(:,:,8)=[5,5,-3;
        5,0,-3;
        -3,-3,-3];
    kk=zeros(size(f));
    I=double(f);
    for i=1:8
        f_k(:,:,i)=conv2(I,k(:,:,i),'same');
        kk=max(kk,f_k(:,:,i));
    end
    f_kk=imbinarize(kk,600);
    subplot(2,3,5);imshow(f_kk);title('Krisch算子');
     
    %------LoG算子-------
    log1=[0 0 -1 0 0;
        0 -1 -2 -1 0;
        -1 -2 16 -2 -1;
        0 -1 -2 -1 0;
        0 0 -1 0 0];
     
    f_l=conv2(f,log1,'same');
    f_ll=imbinarize(abs(f_l),300);
    subplot(2,3,6);imshow(f_ll);title('LoG算子');

     

    非matlab自带   Kirsch算子

    (参考https://blog.csdn.net/u014485485/article/details/78339420

    clear;clc;close all
    
    %读取图像
    bw1=imread('Lena512.png');
    %bw1=rgb2gray(bw1);
    figure;imshow(bw1,[]);title('Original Image');
    
    %均值滤波
    bw2=filter2(fspecial('average',3),bw1);
    %高斯滤波
    bw3=filter2(fspecial('gaussian'),bw2);
    %利用小波变换对图象进行降噪处理
    [thr,sorh,keepapp]=ddencmp('den','wv',bw3);     %获得除噪的缺省参数
    bw4=wdencmp('gbl',bw3,'sym4',2,thr,sorh,keepapp);%图象进行降噪处理
    
    %提取图象边缘
    t=[0.8 1.0 1.5 2.0 2.5].*10^5 ;     %设定阈值
    bw5=double(bw4);            
    [m,n]=size(bw5);             
    g=zeros(m,n); 
    d=zeros(1,8);
    %利用Kirsch算子进行边缘提取
    for i=2:m-1
       for j=2:n-1
           d(1) =(5*bw5(i-1,j-1)+5*bw5(i-1,j)+5*bw5(i-1,j+1)-3*bw5(i,j-1)-3*bw5(i,j+1)-3*bw5(i+1,j-1)-3*bw5(i+1,j)-3*bw5(i+1,j+1))^2; 
           d(2) =((-3)*bw5(i-1,j-1)+5*bw5(i-1,j)+5*bw5(i-1,j+1)-3*bw5(i,j-1)+5*bw5(i,j+1)-3*bw5(i+1,j-1)-3*bw5(i+1,j)-3*bw5(i+1,j+1))^2; 
           d(3) =((-3)*bw5(i-1,j-1)-3*bw5(i-1,j)+5*bw5(i-1,j+1)-3*bw5(i,j-1)+5*bw5(i,j+1)-3*bw5(i+1,j-1)-3*bw5(i+1,j)+5*bw5(i+1,j+1))^2; 
           d(4) =((-3)*bw5(i-1,j-1)-3*bw5(i-1,j)-3*bw5(i-1,j+1)-3*bw5(i,j-1)+5*bw5(i,j+1)-3*bw5(i+1,j-1)+5*bw5(i+1,j)+5*bw5(i+1,j+1))^2; 
           d(5) =((-3)*bw5(i-1,j-1)-3*bw5(i-1,j)-3*bw5(i-1,j+1)-3*bw5(i,j-1)-3*bw5(i,j+1)+5*bw5(i+1,j-1)+5*bw5(i+1,j)+5*bw5(i+1,j+1))^2; 
           d(6) =((-3)*bw5(i-1,j-1)-3*bw5(i-1,j)-3*bw5(i-1,j+1)+5*bw5(i,j-1)-3*bw5(i,j+1)+5*bw5(i+1,j-1)+5*bw5(i+1,j)-3*bw5(i+1,j+1))^2; 
           d(7) =(5*bw5(i-1,j-1)-3*bw5(i-1,j)-3*bw5(i-1,j+1)+5*bw5(i,j-1)-3*bw5(i,j+1)+5*bw5(i+1,j-1)-3*bw5(i+1,j)-3*bw5(i+1,j+1))^2; 
           d(8) =(5*bw5(i-1,j-1)+5*bw5(i-1,j)-3*bw5(i-1,j+1)+5*bw5(i,j-1)-3*bw5(i,j+1)-3*bw5(i+1,j-1)-3*bw5(i+1,j)-3*bw5(i+1,j+1))^2;      
           g(i,j) = max(d);
        end
    end 
    
    %显示边缘提取后的图象
    figure(2)
    for k=1:5
        for i=1:m
            for j=1:n
                if g(i,j)>t(k)
                    bw5(i,j)=255;           
                else
                    bw5(i,j)=0;
                end
            end
        end
        subplot(1,5,k)
        imshow(bw5,[])
        title(['Kirsch' '   ' num2str(t(k))])
    end

    最后我之前自己写的梯度法:

    I=imread('1.jpg');
    I=rgb2gray(I);
    T=10;%阈值
    [x,y]=gradient(double(I));   %获取梯度
    t=sqrt(x.^2+y.^2);  
    I(t>=T)=255;           %梯度提取边缘 画黑
    I(t<T)=0;
    I=uint8(I);
    imshow(I);
    
    imwrite(I,'my开方梯度.jpg');  %保存图像到当前目录

    本人水平有限,难免有错误疏漏,还望大佬多多批评指正。

    展开全文
  • 图像边缘提取算法论文,有多个pdf文件,多种边缘提取的算法,仅作参考。
  • 为了得到清晰、可靠的熔池边缘, 提出了一种新的基于组件树模型的MAG焊图像熔池边缘提取算法。对获取的焊缝区域图像, 使用区域粗定位方法获得关注的熔池区域, 输出标准的梯度级图像后, 使用组件树模型提取出熔池边缘...
  •  对边缘角度进行量化处理算法 ↑ ④ 根据边缘角度对边缘强度进行非极大值抑制(Non-maximum suppression),使图像边缘变得更细  非极大值抑制算法:0°时取(x,y)、(x+1,y)、(x-1,y) 中的最大值,其它角度类似 ↑...
  • 用Canny算法提取图像边缘程序 可用于提取图像边缘信息
  • 一个实现了图像边缘提取以及相关图像特征提取算法的程序,主要提供了图像边缘,hough直线提取,轮廓跟踪等算法,适合图像处理初学者的图像处理入门哦
  • Canny边缘提取算法

    2020-07-06 20:33:20
    非极大值抑制是一种边缘稀疏技术,非极大值抑制的作用在于“瘦”边,对图像进行梯度计算后,梯度值提取边缘仍然很模糊(边缘比较厚),而非极大值抑制则可以帮助将局部最大值之外的所有梯度值抑制为0 1.将当前像素...

    原理祥解

    • 彩色图像转换为灰色图像
    • 高斯滤波,滤除噪声点
    • 计算图像梯度,根据梯度计算边缘幅值与角度
    • 非极大值抑制
    • 双阀值边缘连接处理
    • 二值化图像输出结果
    非极大值抑制

    非极大值抑制是一种边缘稀疏技术,非极大值抑制的作用在于“瘦”边,对图像进行梯度计算后,梯度值提取的边缘仍然很模糊(边缘比较厚),而非极大值抑制则可以帮助将局部最大值之外的所有梯度值抑制为0
    1.将当前像素的梯度强度与沿正负梯度方向上的两个像素进行比较
    2.如果当前像素的梯度强度与另外两个像素相比最大,则该像素点保留为边缘点,否则该像素点将被抑制。
    NMS

    双阀值边缘连接处理

    这个阶段决定哪些边缘是真正的边缘,为此,我们需要两个阀值,minVal和maxVal,强度梯度大于maxVal的边缘肯定是边缘,而minVal以下的边缘肯定是非边缘的,因此被丢弃,两者之间的值要判断是否与真正的边界相连,相连就保留,不相连就舍弃。
    双阀值

    import cv2
    import numpy as np
    
    src = cv2.imread('6.jpg',0)
    dst = cv2.GaussianBlur(src,(3,3),0)
    canny = cv2.Canny(dst,50,150)
    
    cv2.imshow('src show',src)
    cv2.imshow('dst show',canny)
    
    cv2.waitKey(0)
    

    Canny

    展开全文
  • 亚像素边缘提取算法

    2014-08-17 20:47:07
    这是MATLAB的亚像素边缘提取程序,经过我的验证,能够实现相应的功能。
  • Sobel边缘提取算法(DSP)

    2012-05-22 21:04:17
    Sobel边缘提取算法(DSP) 分类: DM642 图像处理 2009-10-08 13:44 536人阅读 评论(1) 收藏 举报 1.  把数据从视频通道通过一维方式传送到片内RAM中并作Sobel边缘提取算法。 我们只对摄像头...

    Sobel边缘提取算法(DSP)

    分类: DM642 图像处理 536人阅读 评论(1) 收藏 举报

    1.  把数据从视频通道通过一维方式传送到片内RAM中并作Sobel边缘提取算法。

    我们只对摄像头采集的一块数据进行Sobel边缘提取。采用一维EDMA传送方式,每一次传送采集的一行中的部分数据(DAT_copy()函数)。在PAL制式下,先把一行数据放到nMemTemp数组中,比如我们要把从144行到432行,从180列到435列的图像进行Sobel边缘提取,最后把变换后的数据输出到显示缓冲区。     

    unsigned char nMemTemp[720];

    for ( i = 0; i < numLines; i ++ )   {  m_nID=DAT_copy(capFrameBuf->frame.iFrm.y1+i*capLinePitch,nMemTemp,numPixels);

         DAT_wait(m_nID);

         if ( i>144 && i<432 )

         Sobel();     DAT_copy(nMemTemp,disFrameBuf->frame.iFrm.y1+i*disLinePitch,numPixels);

    }

    因为Sobel算法需要三行数据,我们可以开辟一个可以存放三行数据的缓冲区,通过指针的交换把从视频通道过来的数据分别放到缓冲区中。保存的三行图像使用翻卷的缓冲区管理,三个变量分别指示当前使用的y行、y-1行和y-2行在缓冲区中的起始偏移量。我们可以这样来做:轮流往三块缓存区拷贝数据。只要拷贝的指针变化就可以。在我们拷贝当前这一块的时候,已经拷贝的另外两块数据依然没有变化,所以我们就可以实现三块数据保存采集图像中的相邻的三行数据。如下:

     

    缓冲区1

    cLines[0-255]

    缓冲区2

    cLines[256-512]

    缓冲区3

    cLines[513-768]

                    缓存区分配

    三个指针*pImg1,*pImg2,*pImg3分别轮流指向三个缓冲区。

        m_nOffset1=0;

        m_nOffset2=256;

        m_nOffset3=512;

    unsigned char cLines[256*3];

    void Sobel()

    {

        unsigned int m_nID;

        m_nID=DAT_copy(nMemTemp+180,cLines+m_nOffset3,256);

        pImg1=cLines; pImg1+=m_nOffset1;

        pImg2=cLines; pImg2+=m_nOffset2;

        pImg3=cLines; pImg3+=m_nOffset3;

        x1=(*pImg1); pImg1++; x2=(*pImg1); pImg1++;

        x4=(*pImg2); pImg2++; x5=(*pImg2); pImg2++;

        x7=(*pImg3); pImg3++; x8=(*pImg3); pImg3++;

        for ( mi=0;mi<256;mi++,pImg1++,pImg2++,pImg3++ )

        {

            x3=(*pImg1); x6=(*pImg2); x9=(*pImg3);

            m_nWork1=x7+x8+x8-x2-x2-x3;

            m_nWork2=x3+x6+x6-x4-x4-x7;

            if ( m_nWork1<m_nWork2 )

                m_nWork1=m_nWork2;

            m_nWork2=m_nWork1+x9-x1;

            if ( m_nWork2>255 ) m_nWork2=1;

            else if ( m_nWork2<0 )  m_nWork2=0;

            nMemTemp[mi+180]=m_nWork2;

            x1=x2; x2=x3;

            x4=x5; x5=x6;

            x7=x8; x8=x9;

        }

    nMemTemp[mi]=0;

        m_nWork=m_nOffset1; m_nOffset1=m_nOffset2;

        m_nOffset2=m_nOffset3; m_nOffset3=m_nWork;

    }

    2.  把数据从视频通道通过二维方式传送到SDRAM并作Sobel边缘提取算法。

    我们可以通过DAT_copy2d()函数直接把采集的一幅图像亮度分量存放到SDRAM中,如下:

    DAT_copy2d(DAT_2D2D,

                    capFrameBuf->frame.iFrm.y1,

                        m_dbFrameBufferTemp,

                            numPixels,

                              numLines,

                                numPixels);

    其中:m_dbFrameBufferTemp是指向SDRAM中缓冲区的指针,numPixels是一行的象素数,numLines是行数。当把数据存放到SDRAM的一个数组中后,Sobel算法的实现就非常简单了。当然也可以参照一维的方法来实现。

    展开全文
  • 边缘提取算法介绍

    千次阅读 2019-10-31 20:58:46
     经典的边缘提取方法是考察图像的每个像素的某个邻域内灰度的变化,利用边缘邻近一阶或二阶方向导数变化规律,用简单的方法检测边缘,称为 微分算子法 。 导数算子具有突出灰度变化的作用, 对图像运用导数算子...

    1、Matlab简述

    Matlab是国际上最流行的科学与工程计算的软件工具,它起源于矩阵运算,已经发展成一种高度集成的计算机语言。有人称它为“第四代”计算机语言,它提供了强大的科学运算、灵活的程序设计流程、高质量的图形可视化界面设计、便捷的与其它程序和语言接口的功能。随着Matlab语言功能越来越强大,不断适应新的要求并提出新的解决方法,可以预见,在科学运算,自动控制与科学绘图领域,Matlab语言将长期保持其独一无二的地位。

    2、几种常用的边缘检测算子

    边缘是图像的最重要的特征,。边缘是指周围像素灰度有阶跃变化或屋顶变化的那些像素的集合。边缘检测主要是灰度变化的度量、检测和定位。有很多种不同的边缘检测方法,同一种方法使用的滤波器也不尽相同。图像边缘检测就是研究更好的边缘检测方法和检测算子。

    边缘检测的基本思想首先是(1)利用边缘增强算子,突出图像中的局部边缘,(2)然后定义象素的“边缘强度”,通过设置阈值的方法提取边缘点集。由于噪声和模糊的存在,监测到的边界可能会变宽或在某点处发生间断。因此,边界检测包括两个基本内容:

    i.         用边缘算子提取出反映灰度变化的边缘点集

    ii.        在边缘点集合中剔除某些边界点或填补边界间断点,并将这些边缘连接成完整的线

    常用的检测算子有微分算子、拉普拉斯高斯算子和canny算子。

    在Matlab图像处理工具箱中,提供了edge函数利用以上算子来检测灰度图像的边缘。

    2.1微分算子法

       经典的边缘提取方法是考察图像的每个像素的某个邻域内灰度的变化,利用边缘邻近一阶或二阶方向导数变化规律,用简单的方法检测边缘,称为微分算子法

    导数算子具有突出灰度变化的作用,对图像运用导数算子,灰度变化较大的点处算得的值较高,因此我们将图像的导数算子运算值作为相应的边界强度,所以可以通过对这些导数值设置阈值,提取边界的点集。

    一阶导数是最简单的导数算子。已知在点f(x,y)处,梯度grad(F(x,y))的幅度为:



    它们分别求出了灰度在x和y方向上的变化率,但是要对每一个像素进行以上的运算,运算量较大,所以在实际应用中常用小区域模板卷积运算来进行近似计算。模板运算的想法是将赋予某一个像素的值作为它本身灰度值和相邻象素灰度值的函数。运用中,对x,y方向各用一个模板。

    2.1.1 Sobel算子

    Sobel算子是滤波算子的形式来提取边缘。X,Y方向各用一个模板,两个模板组合起来构成1个梯度算子。X方向模板对垂直边缘影响最大,Y方向模板对水平边缘影响最大。


    图1 Sobel算子模板

    2.1.2 robert算子

       Robert算子是一种梯度算子,它用交叉的差分表示梯度,是一种利用局部差分算子寻找边缘的算子,对具有陡峭的低噪声的图像效果最好:

    模板如图:

                      

        

    图2 Robert算子模板


    2.1.3 prewitt算子 

       prewitt算子是加权平均算子,对噪声有抑制作用,但是像素平均相当于对图像进行地同滤波,所以prewitt算子对边缘的定位不如robert算子。模板如图;

         

    图3 prewitt算子模板

    代码如下:

    原始图像为三位编织复合材料二维截面图,对原始图像进行前期处理

    i=imread('d1.jpg');

    i2=im2double(i);

    ihd=rgb2gray(i2);

    [thr,sorh,keepapp]=ddencmp('den','wv',ihd);

    ixc=wdencmp('gbl',ihd,'sym4',2,thr,sorh,keepapp);

    figure,imshow(ixc),title('消噪后图像 ');

    k2=medfilt2(ixc,[7 7]);

    figure,imshow(k2),title('中值滤波');

    isuo=imresize(k2,0.25,'bicubic');

      

    %sobert、robert和prewitt算子检测图像边缘

    esobel=edge(isuo,'sobel');

    erob=edge(isuo,'roberts');

    eprew=edge(isuo,'prewitt');

    subplot(2,2,1);

    imshow(isuo);title('前期处理图像');

    subplot(2,2,2);

    imshow(esobel);title('sobel算子提取');

    subplot(2,2,3);

    imshow(erob);title('roberts算子提取');

    subplot(2,2,4);

    imshow(eprew);title('prewitt算子提取');


     图4 微分算子边缘检测结果

    2.2 Laplacian算子
       拉普拉斯高斯算子是一种二阶导数算子,将在边缘处产生一个陡峭的零交叉。前面介绍的几种梯度法具有方向性,不能对各种走向的边缘都具有相同的增强效果。但是Laplacian算子是各向同性的,能对任何走向的界线和线条进行锐化,无方向性。这是拉普拉斯算子区别于其他算法的最大优点。

    对一个连续函数,它在位置的拉普拉斯算子定义如下:


    在图像边缘检测中,为了运算方便,函数的拉普拉斯高斯算子也是借助模板来实现的。其模板有一个基本要求:模板中心的系数为正,其余相邻系数为负,所有系数的和应该为零。


          5 Laplacian算子模板

    2.3  Canny边缘检测法

         Canny边缘检测是一种比较新的边缘检测算子,具有很好的边缘监测性能,在图像处理中得到了越来越广泛的应用。它依据图像边缘检测最优准则设计canny边缘检测算法:

    (1)       首先用2D高斯滤波模板进行卷积以消除噪声

    (2)       利用导数算子找到图像灰度地沿着两个方向的偏导数,并求出梯度的大小:  

    (3)       利用(2)的结果计算出梯度的方向

    (4)       一旦知道了边缘的方向,就可以把边缘的梯度方向大致分为四种:水平、竖直、45度方向、135度方向。通过梯度的方向,就可以找到这个像素梯度方向的邻接像素。

    (5)       遍历图像,若某个像素的灰度值与其梯度方向上前后两个像素的灰度值相比不是最大的,那么这个像素值置为0,即不是边缘。

    (6)       使用累计直方图计算两个阈值,大于高阈值的一定是边缘,小于低阈值的一定不是边缘,介于之间的,看这个像素的邻接像素中有没有超过高阈值的边缘像素,如果有的话那么它

    就是边缘了,否则它就不是边缘。

    调用Laplacian算子、canny算子检测法检测图像边缘的程序如下:

    elog=edge(isuo,'log');

    ecanny=edge(isuo,'canny');

    subplot(1,2,1);

    imshow(elog);title('log算子提取');

    subplot(1,2,2);

    imshow(ecanny);title('canny算子提取');

    图6 canny算子、Laplacian算子检测结果

    3.边缘检测结果比较

    Roberts算子检测方法对具有陡峭的低噪声的图像处理效果较好,但是利用roberts算子提取边缘的结果是边缘比较粗,因此边缘的定位不是很准确。

    Sobel算子检测方法对灰度渐变和噪声较多的图像处理效果较好,sobel算子对边缘定位不是很准确,图像的边缘不止一个像素。

    Prewitt算子检测方法对灰度渐变和噪声较多的图像处理效果较好。但边缘较宽,而且间断点多。

    Laplacian算子法对噪声比较敏感,所以很少用该算子检测边缘,而是用来判断边缘像素视为与图像的明区还是暗区。

    Canny方法不容易受噪声干扰,能够检测到真正的弱边缘。优点在于,使用两种不同的阈值分别检测强边缘和弱边缘,并且当弱边缘和强边缘相连时,才将弱边缘包含在输出图像中。

    参考文献

    [1] 赵春晖.现代图像处理技术及Matlab实现[M].北京:人民邮电出版社,2001.

    [2] 阮秋琦.数字图像处理学[M].北京:电子工业出版社,2001.

    [3] 何斌.数字图像处理[M].北京:人民邮电出版社,2001


    I=imread('lena.bmp');%  提取图像

    BW1=edge(I,'sobel'); %SOBEL算子进行边缘检测

    BW2=edge(I,'roberts');%Roberts算子进行边缘检测

    BW3=edge(I,'prewitt'); %prewitt算子进行边缘检测

    BW4=edge(I,'log'); %log算子进行边缘检测

    BW5=edge(I,'canny'); %canny算子进行边缘检测

    h=fspecial('gaussian’,5);

    BW6=edge(I,’canny’);

    subplot(2,3,1), imshow(BW1);

    title(‘sobel edge check’);

    subplot(2,3,2), imshow(BW2);

    title(‘sobel edge check’);

    subplot(2,3,3), imshow(BW3);

    title(‘prewitt edge check’);

    subplot(2,3,4), imshow(BW4);

    title(‘log edge check’);

    subplot(2,3,5), imshow(BW5);

    title(‘canny edge check’);

    subplot(2,3,6), imshow(BW6);

    title(‘gasussian&canny edge check’);%此为用高斯滤波后Canny算子边缘检测结果

    (注意:代码中有一些标点是中文模式,若输入代码后标点显示红色,则为中文标点,改回来就行了)


    展开全文
  • susan边缘提取算法

    2009-09-17 17:12:00
    在图像识别时边缘提取算子中,susan特色算子是非常好的一种方法。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,224
精华内容 889
关键字:

边缘提取算法