在数字图像处理过程中常会用到形态学处理的函数,比如膨胀和腐蚀等操作,在次之前往往需要创建一个掩膜(mask),在中可以很方便地通过strel(‘disk’, 5)创建一个“圆盘”状的掩膜,如下图 。
!['disk', n OpenCV3.1实现matlab中strel函数](http://img.gansulong.com/230624/055HGQ9-0.png)
文章插图
在中有一个自带的函数来实现类似的效果,程序如下,
Mat se = getStructuringElement(MORPH_ELLIPSE, Size(9, 9));cout << se << endl;
该函数名叫t,表示创建一个椭圆形的结构,此外还有其他几种结构,从后面的size看出的大小参数是“半径”,而是“直径” 。由此可以得到如下图的一个掩膜,
【'disk', nOpenCV3.1实现matlab中strel函数】
!['disk', n OpenCV3.1实现matlab中strel函数](http://img.gansulong.com/230624/055HG496-1.png)
文章插图
两个掩膜之间非常相似,但不是完全一样,为了让可以创建与完全一样的掩膜,可以通过下面的方式来实现 。该方式仅仅对掩膜半径较小的时候有效,代码如下,
Mat diskStrel(int radius){Mat sel(2*radius - 1, 2*radius - 1, CV_8UC1, Scalar(1));int borderWidth = 0;switch (radius){case 1: borderWidth = 0; break;case 3: borderWidth = 0; break;case 5: borderWidth = 2; break;case 7: borderWidth = 2; break;case 9: borderWidth = 4; break;case 11: borderWidth = 6; break;case 13: borderWidth = 6; break;case 15: borderWidth = 8; break;case 17: borderWidth = 8; break;case 19: borderWidth = 10; break;case 21: borderWidth = 10; break;default: borderWidth = 2; break;}for (int i = 0; i < borderWidth; i++){for (int j = 0; j < borderWidth - i; j++){sel.at(i, j) = 0;sel.at(i, sel.cols - 1 - j) = 0;sel.at(sel.rows - 1 - i, j) = 0;sel.at(sel.rows - 1 - i, sel.cols - 1 - j) = 0;}}return sel;}
通过下面代码进行测试,
Mat se = diskStrel(5);cout << se << endl;
得到的结果如下图,完全与程序的结果一致 。不过从程序可以看出,这段代码仅仅对“半径”小于等于21的单数有效,不过对于大多数应用来说已经足够 。
!['disk', n OpenCV3.1实现matlab中strel函数](http://img.gansulong.com/230624/055HM306-2.png)
文章插图
- 使用WIF实现单点登录Part II —— Windows Identity F
- A星算法代码
- 【每日一练】39—七夕节背景轮播图效果的实现
- 007 【编程之路扫雷游戏】(C语言实现)
- 三.SPSS+finebi实现基于分类算法的理财产品顾客亏损及收益分析
- 使用Samba实现文件共享:Windows和Linux之间
- 一、实现纯颜色作为背景的轮播图
- python全景图像拼接_python实现图像全景拼接
- 简单的轮播图实现
- 10、帧动画