图像特征提取:Sobel边缘检测
图像特征提取: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边缘检测相关推荐
- Matlab与FPGA图像处理系列——基于FPGA的实时边缘检测系统设计,sobel边缘检测流水线实现
注:下载链接的资源是图片存 ROM 后读取进行 Sobel 检测显示在 VGA上,可供参考. 摘要:本文设计了一种基于 FPGA 的实时边缘检测系统,使用OV5640 摄像头模块获取实时的视频图像数据 ...
- OpenCV边缘检测(二)——Sobel边缘检测
Sobel边缘检测是一种常用的基于图像梯度的边缘检测算法,它可以有效地检测出图像中的边缘.该算法通过对图像中每个像素应用Sobel算子来计算其在水平和垂直方向上的梯度值,然后将两个梯度值合并成一个值, ...
- ITK:Sobel边缘检测图像滤镜
ITK:Sobel边缘检测图像滤镜 内容提要 输出结果 输入 输出 C++实现代码 内容提要 将SobelEdgeDetectionImageFilter应用于图像 输出结果 输入 输出 C++实现代 ...
- [Python图像处理] 四十二.Python图像锐化及边缘检测万字详解(Roberts、Prewitt、Sobel、Laplacian、Canny、LOG)
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...
- [Python从零到壹] 五十八.图像增强及运算篇之图像锐化Sobel、Laplacian算子实现边缘检测
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- IOS OpenGL ES GPUImage 图像Sobel边缘检测,类似漫画反色 GPUImageSobelEdgeDetectionFilter
目录 一.简介 二.效果演示 三.源码下载 四.猜你喜欢 零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 基础 零基础 Ope ...
- python 视觉技术_python+opencv实现机器视觉基础技术(边缘提取,图像滤波,边缘检测算子,投影,车牌字符分割)...
机器视觉是人工智能正在快速发展的一个分支.简单说来,机器视觉就是用机器代替人眼来做测量和判断.它是一项综合技术,包括图像处理.机械工程技术.控制.电光源照明.光学成像.传感器.模拟与数字视频技术.计算 ...
- 数字图像处理与Python实现笔记之图像特征提取
数字图像处理与Python实现笔记 摘要 绪论 1 数字图像处理基础知识 2 彩色图像处理初步 3 空间滤波 4 频域滤波 5 图像特征提取 5.1 图像颜色特征提取 5.1.1 颜色直方图 1 一般 ...
- 图像算法九:【图像特征提取】特征降维、PCA人脸特征抽取、局部二进制
PCA数学理论: 关于PCA的理论,资料很多,公式也一大把,本人功底有限,理论方面这里就不列出了.下面主要从应用的角度大概来讲讲具体怎么实现数据集的降维. 把原始数据中每个样本用一个向量表示,然后把所 ...
- 计算机视觉:图像特征与描述大全 ,有代码(一篇博文带你简单了解完图像特征提取技术)
图像特征提取是 我们在做图像分类,图像检测,图像分割等任务前的任务. 图像特征提取的好坏,一定程度上决定着后续任务最终的结果.是特征工程,特征工程的重要性就不多说啦把,它决定着一个任务的上限成就. 算 ...
最新文章
- 企业根CA方法客户机证书的解决方案,ISA2006系列之三十
- 基于SSH实现教务管理系统
- android 4.2 桌面快捷方式,Android 添加桌面快捷方式操做
- union一个有趣的应用
- 计算机对英语口语考试成绩,英语口语考试面对“电脑考官” 有何临场技巧
- android弹出选择usb,android 解决:默认情况下用于该USB设备 自动获取USB操作权限...
- 《看门狗》真人版跑酷!
- iBatis.Net实现返回DataTable和DataSet对象
- zabbix搭建并结合mikoomi插件监控hadoop集群
- 移动客户端与服务器端安全通信方案
- Testng 测试框架源码阅读(二)
- 数组拼接时中间怎么加入空格_【题解二维数组】1123:图像相似度
- 关于“xxx”object is not callable的异常
- 标识符的命名规定java 0126
- 大数据学长面试之华为面试题
- Android Studio 连接阿里云数据库【制作基于数据库的多人远程聊天APP】
- Flutter 不一样的跨平台解决方案
- Python Data Analysis and Appplication
- 十大经典排序算法的动图
- TLC5916IDR
热门文章
- Windows10彻底关闭安全中心
- T5557卡读、写及EM4100 ID、HID卡复制函数说明
- 重学statistics,Cha3 Descriptive Statistics: numerical measures
- idea 查找替换快捷键
- 计算机《画图》教案学生状态,《初识“画图”》教案设计.doc
- 1×pbs缓冲液配方_PBS缓冲液的配方
- 俄亥俄州立大学计算机科学转学成功,录取捷报|努力定有回报,斩获俄亥俄州立计算机转学录取...
- CNTV的点播调度方式
- 项目设计:基于STM32的指纹/刷卡的门禁/考勤/智能小区管理系统
- centOS7下安装配置nagios