精华内容
下载资源
问答
  • 边缘提取

    千次阅读 2017-04-23 17:25:18
    今天学习的内容是图像的边缘提取边缘提取其实也是一种滤波,不同的算子有不同的提取效果。比较常用的方法有三种,Sobel算子,Laplacian算子,Canny算子。在opencv中,这几个算子被封装成函数。 (1)Sobel算子是...

    今天学习的内容是图像的边缘提取。边缘提取其实也是一种滤波,不同的算子有不同的提取效果。比较常用的方法有三种,Sobel算子,Laplacian算子,Canny算子。在opencv中,这几个算子被封装成函数。

    (1)Sobel算子是通过求取像素的一阶导来获取边缘,如果变化大则像素值高,Sobel算子有x和y方向之分。

    Sobel(源Mat对象,目标Mat对象,输出图像深度,x方向阶数,y方向阶数,区域大小)//如果是x方向的Sobel则x方向阶数是1,否则是0,y方向类似。往往求取x和y方向的Sobel结果后,用addWeighted函数将它们合并成一张完整的边缘提取图。

    (2)Laplacian算子则是通过求取像素的二阶导来获取边缘,Laplacian算子没有方向之分。

    Laplacian(源Mat对象,目标Mat对象,输出图像深度,区域大小)//得到的结果有可能存在负数值,需要convertScaleAbs函数进行取绝对值操作。

    (3)Canny算子的原理是非最大信号抑制。

    Canny(源Mat对象,目标Mat对象,低阈值,高阈值,区域大小)//Canny算子产生的是二值图,产生的方法是利用高低阈值,高过高阈值的保留,低于低阈值的舍弃,高低阈值之间的且相互连接的保留(不太懂)。

    在使用这些函数之前都有两个步骤,一是将图像转换成灰度图像,二是进行简单的模糊降噪。

    演示代码:

    #include<opencv2\opencv.hpp>
    #include<iostream>
    #include<math.h>
    #include<algorithm>
    #include<stdlib.h>
    
    using namespace std;
    using namespace cv;
    
    Mat src, src_gray, dst_Sobel, dst_Laplacian, dst_Canny, dst;
    
    int main()
    {
    	src = imread("1.jpg", 1);
    	if (src.empty())
    	{
    		printf("cannot load!!\n");
    		system("pause");
    		return -1;
    	}
    	imshow("原图", src);
    
    	cvtColor(src, src_gray, CV_BGR2GRAY);
    	blur(src_gray, src_gray, Size(3, 3));
    
    	//Sobel
    	Mat xSobel;
    	Sobel(src_gray, xSobel, -1, 1, 0, 3);
    	Mat ySobel;
    	Sobel(src_gray, ySobel, -1, 0, 1, 3);
    	addWeighted(xSobel, 0.5, ySobel, 0.5, 0, dst_Sobel);
    	imshow("Sobel", dst_Sobel);
    
    	//Laplacian
    	Laplacian(src_gray, dst_Laplacian, -1, 3);
    	convertScaleAbs(dst_Laplacian, dst_Laplacian);
    	imshow("Laplacian", dst_Laplacian);
    
    	//Canny
    	Canny(src_gray, dst_Canny, 50, 100, 3);
    	imshow("Canny", dst_Canny);
    
    
    	waitKey(0);
    	return 0;
    }
    演示效果:






    展开全文
  • 图像边缘提取算法的分析;概述;Roberts算子;抗噪性能;性能分析;Sobel算子;抗噪性能;Prewitt算子;抗噪性能;性能分析;Kirsch算子;抗噪性能;Robinson算子;抗噪性能;二阶算子检测;抗噪性能;性能分析;LOG算子;抗噪性能;...
  • 边缘提取算子 一阶: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');  %保存图像到当前目录

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

    展开全文
  • 算法原理由于边缘提取的算法有很多种,而提取的精度在相同阈值的情况下也会有不同的结果。这次我的边缘提取使用索贝尔算子(Sobel operator)。该算子会把图像每一点的灰度矢量计算出来。而分别为横向及纵向,将之与...

    利用java打开一张图片,并提取其边缘。功能有打开文件,以及提取边缘。

    算法原理

    由于边缘提取的算法有很多种,而提取的精度在相同阈值的情况下也会有不同的结果。

    这次我的边缘提取使用索贝尔算子(Sobel operator)。

    该算子会把图像每一点的灰度矢量计算出来。而分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。

    算法核心:

    public int getGrayPoint(int x, int y) {

    return grayData[y * width + x];

    }

    protected final int GradientX(int x, int y) {

    return getGrayPoint(x - 1, y - 1) + 2*getGrayPoint(x - 1, y)+ getGrayPoint(x - 1, y + 1) - getGrayPoint(x + 1, y - 1)- 2*getGrayPoint(x + 1, y) - getGrayPoint(x + 1, y + 1);

    }

    protected final int GradientY(int x, int y) {

    return getGrayPoint(x - 1, y - 1) + 2*getGrayPoint(x, y - 1)+ getGrayPoint(x + 1, y - 1) - getGrayPoint(x - 1, y + 1)- 2*getGrayPoint(x, y + 1) - getGrayPoint(x + 1, y + 1);

    而利用JAVA 的GUI界面将图片打开且直接进行操作:

    setTitle("Test");

    setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

    label = new JLabel();

    add(label);

    chooser = new JFileChooser();

    chooser.setCurrentDirectory(new File("."));

    JMenuBar menubar = new JMenuBar();

    setJMenuBar(menubar);

    JMenu menu = new JMenu("文件");

    JMenu menu2 = new JMenu("操作");

    menubar.add(menu);

    menubar.add(menu2);

    JMenuItem openItem = new JMenuItem("打开");

    JMenuItem Clicktime = new JMenuItem("提取边缘");

    menu.add(openItem);

    menu2.add(Clicktime);

    JMenuItem exitItem = new JMenuItem("关闭");

    menu.add(exitItem);

    SobelEdgeDetect tp=new SobelEdgeDetect(50);

    openItem.addActionListener(new ActionListener() {

    @Override

    public void actionPerformed(ActionEvent arg0) {

    // TODO Auto-generated method stub

    int result = chooser.showOpenDialog(null);

    if(result == JFileChooser.APPROVE_OPTION){

    String name = chooser.getSelectedFile().getPath();

    label.setIcon(new ImageIcon(name));

    try {

    tp.readImage(name);

    } catch (IOException ex) {

    Logger.getLogger(ImageViewerFrame.class.getName()).log(Level.SEVERE, null, ex);

    }

    }

    }

    });

    exitItem.addActionListener(new ActionListener() {

    @Override

    public void actionPerformed(ActionEvent arg0) {

    // TODO Auto-generated method stub

    System.exit(0);

    }

    });

    Clicktime.addActionListener(new ActionListener() {

    private int heightWMI;

    @Override

    public void actionPerformed(ActionEvent e) {

    String desImageName = "1.jpg";

    tp.createEdgeImage(desImageName);

    label.setIcon(new ImageIcon(desImageName));

    }

    });

    }

    private JLabel label;

    private JFileChooser chooser;

    private static final int DEFAULT_WIDTH = 1280;

    private static final int DEFAULT_HEIGHT =800;

    执行后可将图片边缘提取:(这里设定阈值为50)

    预览:

    0a441fef8a5e1926ab7d18d837d4cb27.png

    展开全文
  • 边缘保留滤波及边缘提取边缘保留滤波及边缘提取边缘保留滤波及边缘提取 1.视频教程: B站、网易云课堂、腾讯课堂 2.代码地址: Gitee Github 3.存储地址: Google云 百度云: 提取码: 1. 2. 3.

    边缘保留滤波及边缘提取

    1.视频教程:
    B站、网易云课堂、腾讯课堂
    2.代码地址:
    Gitee
    Github
    3.存储地址:
    Google云
    百度云:
    提取码:

    1.边缘保留滤波

    ## 高斯双边滤波

    在这里插入图片描述

    非局部均值去噪(NLM)

    在这里插入图片描述

    #include <opencv2/opencv.hpp>
    #include <iostream>
    
    using namespace cv;
    using namespace std;
    
    void add_salt_and_pepper_noise(Mat &image);
    void add_gaussion_noise(Mat &image);
    
    int main(int argc, char** argv) {
    
    	Mat src = imread("E:/cats.jpg", IMREAD_COLOR);
    
    	if (src.empty()) {
    		printf("image is empty!!!");
    		return -1;
    	}
    	imshow("src", src);
    	add_gaussion_noise(src);
    	// 高斯滤波
    	Mat dst;
    	GaussianBlur(src, dst, Size(5, 5), 0);
    	imshow("gaussian denoise demo", dst);
    
    	// 双边滤波
    	Mat dst1;
    	bilateralFilter(src, dst1, 0, 100, 10);
    	imshow("bilateral denoise", dst1);
    	// NLM
    	Mat gray, result2;
    	cvtColor(src, gray, COLOR_BGR2GRAY);
    	fastNlMeansDenoising(gray, result2, 15, 10, 30);
    	imshow("NLM denoise", result2);
    	waitKey(0);
    	destroyAllWindows();
    	return 0;
    }
    
    void add_salt_and_pepper_noise(Mat &image) {
    	RNG rng(12345);
    	int h = image.rows;
    	int w = image.cols;
    	int nums = 10000;
    	for (int i = 0; i < nums; i++) {
    		int x = rng.uniform(0, w);
    		int y = rng.uniform(0, h);
    		if (i % 2 == 1) {
    			image.at<Vec3b>(y, x) = Vec3b(255, 255, 255);
    
    		}
    		else {
    			image.at<Vec3b>(y, x) = Vec3b(0, 0, 0);
    		}
    	}
    	imshow("salt and pepper noise", image);
    }
    
    void add_gaussion_noise(Mat &image) {
    	// 高斯噪声
    	Mat noise = Mat::zeros(image.size(), image.type());
    	randn(noise, Scalar(15, 15, 15), Scalar(30, 30, 30));
    	Mat dst;
    	add(image, noise, dst);
    	imshow("gaussian noise", dst);
    	dst.copyTo(image);
    
    }
    

    在这里插入图片描述

    2.边缘提取

    2.1 图像边缘定义与类型

    在这里插入图片描述

    1. 边缘法线-单位向量在该方向上图像像素强度变化最大
    2. 边缘方向-与边缘法线垂直的向量方向
    3. 边缘位置或者中心-图像边缘所在位置
    4. 边缘强度-跟沿法线方向的图像局部对比相关,对比越大,越是边缘。

    边缘类型

    1 跃迁类型
    在这里插入图片描述

    2 屋脊类型

    在这里插入图片描述

    基于梯度的边缘提取

    在这里插入图片描述

    存在一个比较严重的问题,那就是阈值T,无论怎么设,都会有遗漏

    所以提出了Canny边缘提取算法

    2.2 Canny边缘提取算法

    1. 模糊去噪声–高斯模糊
    2. 提取梯度与方向
    3. 非最大信号抑制
    4. 高低阈值链接

    在这里插入图片描述

    高低阈值链接规则

    在这里插入图片描述

    #include <opencv2/opencv.hpp>
    #include <iostream>
    
    using namespace cv;
    using namespace std;
    int t1 = 50;
    Mat src;
    void canny_demo(int,void*) {
    	Mat edges;
    	Canny(src,edges,t1,t1*3,3,false);
    	imshow("edges", edges);
    }
    
    int main(int argc, char** argv) {
    
    	src = imread("E:/cats.jpg", IMREAD_COLOR);
    
    	if (src.empty()) {
    		printf("image is empty!!!");
    		return -1;
    	}
    	namedWindow("src", WINDOW_AUTOSIZE);
    	imshow("src", src);
    	
    	// Canny
    	createTrackbar("threshold value:","src",&t1,100, canny_demo);
    	canny_demo(0, 0);
    	waitKey(0);
    	destroyAllWindows();
    	return 0;
    }
    
    

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • android图片边缘提取

    2016-11-10 15:00:51
    android图片边缘提取
  • 基于数学形态学和Canny算子的边缘提取方法-基于数学形态学和Canny算子的边缘提取方法.pdf 基于数学形态学和Canny算子的边缘提取方法.
  • 这篇文章主要介绍了opencv python Canny边缘提取实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下Canny是边缘提取算法,在1986年提出的是一个很好的...
  •  经典的边缘提取算法中有一类算法是基于设计边缘提取算子(或者也可以叫卷积模板),然后经过阈值处理得到二值化的边缘图,下面就具体介绍这种思路相关的内容。 边缘提取(一):传统的边缘提取算子(1) 传统的...
  • opencv 边缘提取

    2015-04-11 11:13:41
    就是一个边缘提取的,还是挺好的,恩,就是这样,还不错的
  • matlab 轮廓 边缘提取

    2015-12-15 11:22:03
    matlab 轮廓 边缘提取 可用
  • 提出一种通过种子边缘点提取闭合点云...通过实验分析邻域半径和搜索视角对算法边缘提取效果的影响,并采用合适的半径与搜索视角,对尖锐边缘与相交边缘进行点云提取,获得了准确的点云边缘,从而证明了该算法的有效性。
  • 文字边缘提取素材

    2014-06-29 18:26:58
    文字图像边缘提取素材,给学习中的同学们一个非常簡単的边缘提取素材
  • 边缘提取 canny

    2019-08-15 10:35:07
    # 边缘提取 canny import cv2 as cv def canny_gass_demo(src): # 高斯模糊 降低噪声 blurred = cv.GaussianBlur(src, (3, 3), 0) # canny 边缘提取 最小阀值50 最大阀值150 edge_output = cv.Canny(blurred, ...
  • 亚像素边缘提取

    2016-11-08 10:20:08
    亚像素边缘提取、matlab代码。文档里包括插值法、拟合法、基于灰度矩法、基于zernike矩法
  • 介绍了四种经典的笔迹边缘提取算法,通过实验结果分析得出Sobel算子在提取维吾尔文笔迹边缘时效果较好。提出一种与文本无关、特征融合的笔迹鉴别方法,融合的特征包括改进网格窗口微结构特征和笔迹曲向特征,该方法采用...
  • 图像边缘提取

    2020-09-27 10:34:00
    基于边缘颜色变化的边缘提取: 原理是该位置的像素值与周边像素值得R G B存在较大差别,即判定其为边缘像素 #include<opencv2\opencv.hpp> #include<vector> #include<iostream> using ...
  • 点云边缘提取MATLAB

    热门讨论 2014-09-17 16:18:54
    MATLAB下点云边缘提取,点云数据需要保存为TXT,然后放在同一目录下运行。
  • 基于高斯映射聚类边缘提取算法提出了一种快速而精确的新方法,通过凝聚聚类和估计法线将高斯球中的法线进行聚类,通过分析每个点最近邻域点的协方差矩阵特征值来检测边缘特征。对不同的点云对象进行边缘提取对比实验,...
  • 对已有图片进行导入,无论是彩色图片还是灰度图片都可以直接操作。进行边缘提取,再进行锐化操作,增强图像的特征。
  • halcon边缘提取缺陷检测的思路 一、边缘提取 二、BLOB分析检测
  • Sobel:将矩阵拆分为两个[1,2,1]T 和[-1,0,1],前面的是高斯核,后面的是边缘提取,也就是说在边缘提取之前先做了一个平滑处理。这个核是可分离的,Sobel算子受到的影响更小。 Roberts:Mx检测的是135度方向的线,而...
  • 基于小波的图像边缘提取技术 基于小波的图像边缘提取技术

空空如也

空空如也

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

边缘提取