Android opencv(三) 边缘检测Sobel、Canny

标签: opencv android
374人阅读 评论(0) 收藏 举报
分类:

Sobel

Sobel是检测边缘的一阶导数,在检测边缘前需要通过滤波(blur)去噪来使图片光滑,一般使用高斯滤波,大小取7x7.

  //高斯滤波
    public static Mat removeNoiseGaussianBlur(Mat srcMat){
        final Mat blurredImage=new Mat();
        Size size=new Size(7,7);
        Imgproc.GaussianBlur(srcMat,blurredImage,size,0,0);
        return blurredImage;
    }

之后进行灰度处理

  //灰度处理
    public static Mat grayImage(Mat srcMat){
        Mat grayImg=new Mat();
        Imgproc.cvtColor(srcMat,grayImg,Imgproc.COLOR_RGB2GRAY);
        return grayImg;
    }

下面是sobel进行过程

         //声明x,y的一阶导数
        Mat xDervative=new Mat();
        Mat yDervative=new Mat();
        /*一般输入图片的depth与输出图片的depth值相同,但是当我们一阶导数的时候会出现负数-255—255,使用unsignded 8-bit depth只能包含0-255,因此采用了16-bit
        */
        int ddepth= CvType.CV_16S;
        //计算x,y的一阶导数,参数1,0来设置x,y轴
        Imgproc.Sobel(srcMat,xDervative,ddepth,1,0);
        Imgproc.Sobel(srcMat,yDervative,ddepth,0,1);
        Mat absXD=new Mat();
        Mat absYD=new Mat();
        //Mat转换
        Core.convertScaleAbs(xDervative,absXD);
        Core.convertScaleAbs(yDervative,absYD);
        //根号(x*x+y*y)
        Mat edgeImage=new Mat();
        Core.addWeighted(absXD,0.5,absYD,0.5,0,edgeImage);

Canny

canny检测仅在灰度图下,同时滤波只能采用高斯滤波,原因如下:
Canny算子在选择滤波器时有两个标准,首先滤波器在频域中应该是有限带宽的,这样才能保证减少由于频率的变化而导致的图像函数的变化;其次,canny经典论文中“Good Localization”标准要求滤波器的响应需要来自于图像中邻近的点。要知道,上述两个标准相互间是矛盾的,频域有限说明时域无限,而高斯分布可以较好的使上述两个标准得到优化,因为高斯函数的离中心超过3倍标准差以外的像素的影响可以忽略不计,同时高斯函数在频域上也是有限带宽的,因此才使用高斯滤波

在Canny边缘检测算法中,将图像中的点归为三类:

被抑制点

灰度梯度值 < 低阈值

弱边缘点

低阈值 <= 灰度梯度值 <= 高阈值

强边缘点
高阈值 < 灰度梯度值
ps:canny边缘检测是通过梯度与夹角进行检测,具体原理参考下面链接,大于最大阈值的线被确认是边缘线条,小于最小阈值的线被抛弃,在最大阈值与最小阈值之间的线条如果线条的边缘有明确的边缘线交点则被认为是在一条线上,从而被保留,否则被抛弃。

https://docs.opencv.org/3.3.1/da/d22/tutorial_py_canny.html

 //canny边缘检测
    public static Mat cannyEdge(Mat srcMat){
        final Mat edgeImage=new Mat();
        //100低阈值 200:高阈值
        Imgproc.Canny(srcMat,edgeImage,100,200);
        return edgeImage;
    }

自适应阈值Canny边缘检测
http://blog.csdn.net/tianzhaixing2013/article/details/53504426

查看评论

OpenCV,三大边缘检测Canny,Sobel,Laplacian,及MFC实现

Sobel 使用扩展 Sobel 算子计算一阶、二阶、三阶或混合图像差分 void cvSobel( const CvArr* src, CvArr* dst, int xorder, int yo...
  • EbowTang
  • EbowTang
  • 2015-01-19 14:56:49
  • 3641

【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

本篇文章中,我们将一起学习OpenCV中边缘检测的各种算子和滤波器——Canny算子,Sobel算子,Laplace算子以及Scharr滤波器。文章中包含了五个浅墨为大家准备的详细注释的博文配套源代码...
  • zhmxy555
  • zhmxy555
  • 2014-05-11 22:14:01
  • 105239

OpenCV-Python教程(6)(7)(8): Sobel算子 Laplacian算子 Canny边缘检测

OpenCV-Python教程(6、Sobel算子) 本篇文章介绍如何用OpenCV-Python来使用Sobel算子。 提示: 转载请详细注明原作者及出处,谢谢! 本...
  • GarfieldEr007
  • GarfieldEr007
  • 2016-05-05 20:58:30
  • 3897

vim+python+OpenCV学习七 : Sobel算子、Laplacian算子和Canny边缘检测

#coding=utf-8 ''' Sobel算子 Sobel算子依然是一种过滤器,只是其是带有方向的。在OpenCV-Python中, 使用Sobel的算子的函数原型如下: dst = cv2...
  • shawncheer
  • shawncheer
  • 2016-03-06 12:07:08
  • 2188

canny算子、sobel算子边缘检测python代码

  • 2012年06月17日 10:39
  • 1KB
  • 下载

Python + OpenCV边沿检测(Edge Detection)

Python + OpenCV边沿检测(Edge Detection) senchenrui@126.com OpenCV提供了3种边沿检测算法 Laplacian sobel canny 本文分别采...
  • chevroletss
  • chevroletss
  • 2015-11-11 19:03:48
  • 6359

OpenCV边缘检測:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处。   文章链接: http://blog.csdn.net/poem_qianmo/article/details/2556...
  • yansmile1
  • yansmile1
  • 2015-06-07 17:28:40
  • 1604

基于Sobel和Canny边缘检测

SOBEL CANNY算子学习总结
  • mingtian715
  • mingtian715
  • 2016-11-25 23:19:06
  • 2648

opencv边缘检测(robert,prewitt,sobel,canny,laplacian)

常用的边缘检测都是用图像中小的领域来构造边缘检测算子,常用的方法有robert,prewitt,sobel,canny,laplacian。 1.robert使用局部差分检测比较陡峭的边缘,对噪声敏...
  • chaoquan3
  • chaoquan3
  • 2013-11-04 19:46:21
  • 2893

unity3d shader之Roberts,Sobel,Canny 三种边缘检测方法

三种边缘判断的算法应用到unity3d,用shader表现
  • wolf96
  • wolf96
  • 2015-02-09 14:48:38
  • 4784
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 38万+
    积分: 6696
    排名: 4412
    博客专栏
    最新评论