




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、OpenCV成长之路(6):数学形态学基本操作及其应用分类: OpenCV成长之路2013-12-26 15:42 537人阅读 评论(5) 收藏 举报opencv图像处理智能交通车牌定位数学形态学目录(?)+数学形态学实际上可以理解为一种滤波行为,所以很多地方称它为形态学滤波。有了个这概念,我们就能更好的理解它。我们滤波中用的滤波器(kernl)在这里被称为结构元素,结构元素往往是由一个特殊的形状构成,如:线条、矩形、圆、菱形等。我们把结构无素的中心(Anchor Point)与图像上像素点对齐,然后结构元素覆盖的领域像素就是我们要分析的像素
2、,我们定义一种操作就形成了一种形态学运算。我们在这里不解释形态学操作的算法原理及它们的意义,有兴趣的可以参见相关数字图像处理方面的教材,或关注本博客,博主打算在OpenCV系列写完后,开始写图像处理方面算法系列的文章。一、形态学的基本操作腐蚀运算:erodevoid erode(InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=m
3、orphologyDefaultBorderValue();src:输入图像,很多场合下我们使用的是二值图像,当然灰度图像也可以。dst:输出图像,格式和输入图像一致。kernel:定义的结构元素。anchor:结构元素的中心,如果是默认参数(-1,-1),程序会自动将其设置为结构元素的中心。iterations:迭代次数,我们可以选择对图像进行多次形态学运算。后面两个参数是边界类型,由于要处理领域问题,所以图像需要扩充边界。一般情况下使用默认即可。膨胀运算:dilate膨胀跟腐蚀的参数完全一致,就不过多的说明了。这两个形态学操作是最基本的两个操作。int main() Mat image=i
4、mread("./cat.png"); / 彩色转灰度 cvtColor(image,image,CV_BGR2GRAY); / 阈值化 threshold(image,image,255*(0.5),255,THRESH_BINARY); / 形态学操作 / 如果把结构元素设置为Mat(),则将用默认的3*3的矩形结构元素 Mat eroded; erode(image,eroded,Mat(); Mat dilated; dilate(image,dilated,Mat(); return 0;下面要介绍的两个形态学操作,在实际应用中要比上面两个更加广泛,但实际上它们是
5、上面两种操作的一个组合式的操作。开运算与闭运算这两个运算都是使用函数morphologyEx来实现的,这个函数的接口如下: void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue();函数的大部分参数都与上面介绍的erode函数
6、参数是一样的,这里面的op是我们要进行的形态学的类型:MORPH_OPEN:对图像进行开运算。MORPH_CLOSE:对图像进行闭运算。下面我们还是以小猫图像为例显示一下对二值图像进行开运算和闭运算后得到的结果。int main() Mat image=imread("./cat.png"); / 彩色转灰度 cvtColor(image,image,CV_BGR2GRAY); / 阈值化 threshold(image,image,255*(0.5),255,THRESH_BINARY); / 定义结构元素 Mat se(5,5,CV_8U,Scalar(1); Mat
7、closed; morphologyEx(image,closed,MORPH_CLOSE,se); Mat opened; morphologyEx(image,opened,MORPH_OPEN,se); return 0;从图片中我们可以得出结论:闭运算可以填充图像中的孔洞,连接一些缺口;开运算可以去除图像中一些较小的结构。前提是这些孔洞或碎片要与进行运算的结构元素尺度相当。二、用形态学操作来检测边缘和角点其实用形态学来检测边缘的原理非常简单,我们打开源码看它是怎么操作的:case CV_MOP_GRADIENT: erode( src, temp, kernel, anchor, it
8、erations, borderType, borderValue ); dilate( src, dst, kernel, anchor, iterations, borderType, borderValue ); dst -= temp; break;可以看出来,它是对图像先做了一个腐蚀,再做了一次膨胀,然后将两次的结果相减即可。int main() Mat image=imread("./cat.png"); / 彩色转灰度 cvtColor(image,image,CV_BGR2GRAY); Mat catEdge; morphologyEx(image,catE
9、dge,MORPH_GRADIENT,Mat(); / 阈值化 threshold(catEdge,catEdge,40,255,THRESH_BINARY); namedWindow("catEdge");imshow("catEdge",catEdge); waitKey(); return 0;下面我们来实现用形态学操作来检测角点。首先我们需要定义几个特殊的结构元素,我们这里都用Mat来定义,并像素式的赋值,你可以选择OpenCV里的getStructElement来更快的实现。/ 定义结构元素 Mat cross(5,5,CV_8U,Scalar
10、(0); Mat diamond(5,5,CV_8U,Scalar(1); Mat square(5,5,CV_8U,Scalar(1); Mat x(5,5,CV_8U,Scalar(0); for(int i=0;i<5;i+) cross.at<uchar>(2,i)=1; cross.at<uchar>(i,2)=1; diamond.at<uchar>(0,0)=0; diamond.at<uchar>(0,1)=0; diamond.at<uchar>(1,0)=0; diamond.at<uchar>(
11、4,4)=0; diamond.at<uchar>(3,4)=0; diamond.at<uchar>(4,3)=0; diamond.at<uchar>(4,0)=0; diamond.at<uchar>(4,1)=0; diamond.at<uchar>(3,0)=0; diamond.at<uchar>(0,4)=0; diamond.at<uchar>(0,3)=0; diamond.at<uchar>(1,4)=0; for(int i=0;i<5;i+) x.at<uchar
12、>(i,i)=1; x.at<uchar>(4-i,i)=1; 第一个为一个十字型的结构元素,第二个为菱形,第三个是矩形,第四个是一个“X”型。然后我们按下面的顺序对一幅图像进行操作,并对最后的结果进行阈值化。Mat result;dilate(image,result,cross);erode(result,result,diamond);Mat result2;dilate(image,result2,x);erode(result2,result2,square);absdiff(result2,result,result);threshold(result,resul
13、t,40,255,THRESH_BINARY);经过上面步骤,我们得到了一张二值图像,显示了图像的一些角点的位置。为了更形象的说明,我们将上面的这些点在原彩色图像上标出来:/ 标记角点void drawOnImage(const Mat& binary,Mat& image) for(int i=0;i<binary.rows;i+) / 获取行指针 const uchar* data=binary.ptr<uchar>(i); for(int j=0;j<binary.cols;j+) if(dataj) /角点图像上的白点 circle(image,
14、Point(j,i),8,Scalar(0,255,0);/ 画圈 三、用数学形态学进行车牌定位智能交通中车牌的检测与识别一直是核心问题,而车牌识别发展了20余年,已经存在了很多的解决方案,我们这里采用数学形态学来进行车牌检测。本部分并不是一个完整的车牌定位程序,后面还需要进行连通区域的标记和筛选以及伪车牌去除等,有兴趣的读者可以继续现实或和我交流。第一步:应用形态学做竖直方向的边缘检测。文章第二部分中已经介绍了用形态学做边缘检测,我们这里只需要修改结构元素就可以实现只检测竖直方向上的边缘。第二步:定义水平方向的闭运算和竖直方向的闭运算,将竖直的线条连成一块。第三步:遍历连通区域,按照车牌的一些限制条件进行筛选即可。int main() Mat cimage=imread("./car.png"); Mat image; cvtColor(cimage,image,CV_BGR2GRAY); Mat result; /检测竖直边缘 morphologyEx(image,result,MORPH_GRADIENT,Mat(1,2,CV_8U,Scalar(1); /阈值化 threshold(result,result,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安徽农业大学《孟荀比较研究》2023-2024学年第二学期期末试卷
- 公司产品价格调整通知公告
- 工地噪音标准
- 第15课 明朝的统治 教案2024-2025学年七年级历史下册新课标
- 屋面喷漆改造施工方案
- 消火栓防撞柱施工方案
- 专项施工方案动画视频
- 2025年高考历史风标训练卷2(含解析)
- 文物清除水锈施工方案
- 5年级下册语文书第4课批准
- 高处作业专项安全培训考试试题(带答案)
- GB/T 24186-2022工程机械用高强度耐磨钢板和钢带
- 护理人际关系伦理
- 中国隧道及地下工程修建技术PPT
- 不良事件鱼骨图分析
- 三角形章起始课-展示课件
- 有限空间作业审批表范本
- 超市便利店日常工作检查记录表
- 细支气管肺泡癌的影像诊断(61页)
- X射线的物理学基础-
- 财务英语英汉对照表
评论
0/150
提交评论