图像特征提取:Sobel边缘检测

前言

点和线是做图像分析时两个最重要的特征,而线条往往反映了物体的轮廓,对图像中边缘线的检测是图像分割与特征提取的基础。文章主要讨论两个实际工程中常用的边缘检测算法:Sobel边缘检测和Canny边缘检测,Canny边缘检测由于算法复杂将在另一篇文章中单独介绍,文章不涉及太多原理,因为大部分的图像处理书籍都有相关内容介绍,文章主要通过Matlab代码,一步一步具体实现两种经典的边缘检测算法。

Sobel边缘检测

Soble边缘检测算法比较简,实际应用中效率比canny边缘检测效率要高,但是边缘不如Canny检测的准确,但是很多实际应用的场合,sobel边缘却是首选,尤其是对效率要求较高,而对细纹理不太关心的时候。

Soble边缘检测通常带有方向性,可以只检测竖直边缘或垂直边缘或都检测。

所以我们先定义两个梯度方向的系数:

kx=0;ky=1;% horizontal 
kx=1;ky=0;% vertical 
kx=1;ky=1;% both

然后我们来计算梯度图像,我们知道边缘点其实就是图像中灰度跳变剧烈的点,所以先计算梯度图像,然后将梯度图像中较亮的那一部分提取出来就是简单的边缘部分。

Sobel算子用了一个3*3的滤波器来对图像进行滤波从而得到梯度图像,这里面不再详细描述怎样进行滤波及它们的意义等。

竖起方向的滤波器:y_mask=op = [-1 -2 -1;0 0 0;1 2 1]/8;

水平方向的滤波器:op的转置:x_mask=op’;

定义好滤波器后,我们就开始分别求垂直和竖起方向上的梯度图像。用滤波器与图像进行卷积即可:

bx = abs(filter2(x_mask,a)); 
by = abs(filter2(y_mask,a));

上面bx为水平方向上的梯度图像,by为垂直方向上的梯度图像。为了更清楚的说明算法过程,下面给出一张示例图像的梯度图像。

原图:

竖直方向梯度图像:by

水平方向梯度图像:bx

而最终的梯度图像为:b = kx*bx.*bx + ky*by.*by;当然这里如果定义了检测方向,就会得到对应上面的图像。

这里值得注意的是为了计算效率并没有对b开平方。而涉及滤波等操作时对图像边界的处理是值得注意的一个地方。我们这里应该将梯度图像的四周1像素点都设置为0。

得到梯度图像后,我们需要的是计算阈值,这是Sobel算法很核心的一部分,也是对效果影响较大的地方,同理讲到canny边缘检测时,用到的双阈值法也是canny算法的核心。

同样这里,我并不太多的介绍算法原理,相关文献可以直接百度。阈值也可以通过自己期待的效果进行自定义阈值,如果没有,则我们计算默认阈值。

scale = 4; 
cutoff = scale*mean2(b); 
thresh = sqrt(cutoff);

其中mean2函数是求图像所有点灰度的平均值。scale是一个系数。

有了阈值后,我们就可以地得到的梯度图像进行二值化。二值化过程,不做详细说明,遍历图像中的像素点,灰度大于阈值的置为白点,灰度小于阈值的则置为黑点。

下面是示例图像梯度图像二值化后的效果:

其实很多介绍Soble算法的文章介绍到这里就结束了,印象中OpenCv的算法也是到此步为止。但是我们注意到上面的边缘图像,边缘较粗,如果我们在做边界跟踪或轮廓提取时,上面图像并不是我们期望的结果。

所以下面要介绍一个很重要的算法,用非极大值抑制算法对边缘进行1像素化。本人在开始的时候也一直以为这里用一个普通的细化算法就可以了,可是总得到到想要的结果,最后查找matlab早期版本的源码才找到方法,其实跟canny算法里原理差不多。

我们需要遍历刚才得到的梯度图像二值化结果b,对于b内的任意一点(i,j),如果满足下面条件,则保持白点,否则置为黑点。条件简单的说即是:如果是竖直边缘,则它的梯度值要比左边和右边的点都大;如果是水平连续,则该点的梯度值要比上边和下边的都大。

bx(i,j)>kx*by(i,j) && b(i,j-1)<b(i,j) && b(i,j+1)<b(i,j)

或者

by(i,j)>ky*bx(i,j) && b(i-1,j)<b(i,j) &&b (i+1,j)<b(i,j)

经过这样的非极大值抑制我们就可以得到比较理想的边缘图像。

下面给出利用OpenCV里的一些滤波函数,从新写的一个Sobel边缘检测的函数:

 1 bool Sobel(const Mat& image,Mat& result,int TYPE)2 {3     if(image.channels()!=1)4         return false;5     // 系数设置6     int kx(0);7     int ky(0);8     if( TYPE==SOBEL_HORZ ){9         kx=0;ky=1;
10     }
11     else if( TYPE==SOBEL_VERT ){
12         kx=1;ky=0;
13     }
14     else if( TYPE==SOBEL_BOTH ){
15         kx=1;ky=1;
16     }
17     else
18         return false;
19
20     // 设置mask
21     float mask[3][3]={{1,2,1},{0,0,0},{-1,-2,-1}};
22     Mat y_mask=Mat(3,3,CV_32F,mask)/8;
23     Mat x_mask=y_mask.t(); // 转置
24
25     // 计算x方向和y方向上的滤波
26     Mat sobelX,sobelY;
27     filter2D(image,sobelX,CV_32F,x_mask);
28     filter2D(image,sobelY,CV_32F,y_mask);
29     sobelX=abs(sobelX);
30     sobelY=abs(sobelY);
31     // 梯度图
32     Mat gradient=kx*sobelX.mul(sobelX)+ky*sobelY.mul(sobelY);
33
34     // 计算阈值
35     int scale=4;
36     double cutoff=scale*mean(gradient)[0];
37
38     result.create(image.size(),image.type());
39     result.setTo(0);
40     for(int i=1;i<image.rows-1;i++)
41     {
42         float* sbxPtr=sobelX.ptr<float>(i);
43         float* sbyPtr=sobelY.ptr<float>(i);
44         float* prePtr=gradient.ptr<float>(i-1);
45         float* curPtr=gradient.ptr<float>(i);
46         float* lstPtr=gradient.ptr<float>(i+1);
47         uchar* rstPtr=result.ptr<uchar>(i);
48         // 阈值化和极大值抑制
49         for(int j=1;j<image.cols-1;j++)
50         {
51             if( curPtr[j]>cutoff && (
52                 (sbxPtr[j]>kx*sbyPtr[j] && curPtr[j]>curPtr[j-1] && curPtr[j]>curPtr[j+1]) ||
53                 (sbyPtr[j]>ky*sbxPtr[j] && curPtr[j]>prePtr[j] && curPtr[j]>lstPtr[j]) ))
54                 rstPtr[j]=255;
55         }
56     }
57
58     return true;
59 }

作者:☆Ronny丶

出处:http://www.cnblogs.com/ronny/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

分类: 图像特征提取

转载于:https://www.cnblogs.com/netilu/p/4285542.html

图像特征提取:Sobel边缘检测相关推荐

  1. Matlab与FPGA图像处理系列——基于FPGA的实时边缘检测系统设计,sobel边缘检测流水线实现

    注:下载链接的资源是图片存 ROM 后读取进行 Sobel 检测显示在 VGA上,可供参考. 摘要:本文设计了一种基于 FPGA 的实时边缘检测系统,使用OV5640 摄像头模块获取实时的视频图像数据 ...

  2. OpenCV边缘检测(二)——Sobel边缘检测

    Sobel边缘检测是一种常用的基于图像梯度的边缘检测算法,它可以有效地检测出图像中的边缘.该算法通过对图像中每个像素应用Sobel算子来计算其在水平和垂直方向上的梯度值,然后将两个梯度值合并成一个值, ...

  3. ITK:Sobel边缘检测图像滤镜

    ITK:Sobel边缘检测图像滤镜 内容提要 输出结果 输入 输出 C++实现代码 内容提要 将SobelEdgeDetectionImageFilter应用于图像 输出结果 输入 输出 C++实现代 ...

  4. [Python图像处理] 四十二.Python图像锐化及边缘检测万字详解(Roberts、Prewitt、Sobel、Laplacian、Canny、LOG)

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  5. [Python从零到壹] 五十八.图像增强及运算篇之图像锐化Sobel、Laplacian算子实现边缘检测

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  6. IOS OpenGL ES GPUImage 图像Sobel边缘检测,类似漫画反色 GPUImageSobelEdgeDetectionFilter

    目录 一.简介 二.效果演示 三.源码下载 四.猜你喜欢 零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 基础 零基础 Ope ...

  7. python 视觉技术_python+opencv实现机器视觉基础技术(边缘提取,图像滤波,边缘检测算子,投影,车牌字符分割)...

    机器视觉是人工智能正在快速发展的一个分支.简单说来,机器视觉就是用机器代替人眼来做测量和判断.它是一项综合技术,包括图像处理.机械工程技术.控制.电光源照明.光学成像.传感器.模拟与数字视频技术.计算 ...

  8. 数字图像处理与Python实现笔记之图像特征提取

    数字图像处理与Python实现笔记 摘要 绪论 1 数字图像处理基础知识 2 彩色图像处理初步 3 空间滤波 4 频域滤波 5 图像特征提取 5.1 图像颜色特征提取 5.1.1 颜色直方图 1 一般 ...

  9. 图像算法九:【图像特征提取】特征降维、PCA人脸特征抽取、局部二进制

    PCA数学理论: 关于PCA的理论,资料很多,公式也一大把,本人功底有限,理论方面这里就不列出了.下面主要从应用的角度大概来讲讲具体怎么实现数据集的降维. 把原始数据中每个样本用一个向量表示,然后把所 ...

  10. 计算机视觉:图像特征与描述大全 ,有代码(一篇博文带你简单了解完图像特征提取技术)

    图像特征提取是 我们在做图像分类,图像检测,图像分割等任务前的任务. 图像特征提取的好坏,一定程度上决定着后续任务最终的结果.是特征工程,特征工程的重要性就不多说啦把,它决定着一个任务的上限成就. 算 ...

最新文章

  1. 企业根CA方法客户机证书的解决方案,ISA2006系列之三十
  2. 基于SSH实现教务管理系统
  3. android 4.2 桌面快捷方式,Android 添加桌面快捷方式操做
  4. union一个有趣的应用
  5. 计算机对英语口语考试成绩,英语口语考试面对“电脑考官” 有何临场技巧
  6. android弹出选择usb,android 解决:默认情况下用于该USB设备 自动获取USB操作权限...
  7. 《看门狗》真人版跑酷!
  8. iBatis.Net实现返回DataTable和DataSet对象
  9. zabbix搭建并结合mikoomi插件监控hadoop集群
  10. 移动客户端与服务器端安全通信方案
  11. Testng 测试框架源码阅读(二)
  12. 数组拼接时中间怎么加入空格_【题解二维数组】1123:图像相似度
  13. 关于“xxx”object is not callable的异常
  14. 标识符的命名规定java 0126
  15. 大数据学长面试之华为面试题
  16. Android Studio 连接阿里云数据库【制作基于数据库的多人远程聊天APP】
  17. Flutter 不一样的跨平台解决方案
  18. Python Data Analysis and Appplication
  19. 十大经典排序算法的动图
  20. TLC5916IDR

热门文章

  1. Windows10彻底关闭安全中心
  2. T5557卡读、写及EM4100 ID、HID卡复制函数说明
  3. 重学statistics,Cha3 Descriptive Statistics: numerical measures
  4. idea 查找替换快捷键
  5. 计算机《画图》教案学生状态,《初识“画图”》教案设计.doc
  6. 1×pbs缓冲液配方_PBS缓冲液的配方
  7. 俄亥俄州立大学计算机科学转学成功,录取捷报|努力定有回报,斩获俄亥俄州立计算机转学录取...
  8. CNTV的点播调度方式
  9. 项目设计:基于STM32的指纹/刷卡的门禁/考勤/智能小区管理系统
  10. centOS7下安装配置nagios