OpenCV3.1实现matlab中strel('disk', n)函数
2017-02-27 16:52
1146 查看
在数字图像处理过程中常会用到形态学处理的函数,比如膨胀和腐蚀等操作,在次之前往往需要创建一个掩膜(mask),在matlab中可以很方便地通过strel(‘disk’, 5)创建一个“圆盘”状的掩膜,如下图。
在OpenCV中有一个自带的函数来实现类似的效果,程序如下,
该函数名叫getStructuringElement,MORPH_ELLIPSE表示创建一个椭圆形的结构,此外还有其他几种结构,从后面的size看出matlab的大小参数是“半径”,而OpenCV是“直径”。由此可以得到如下图的一个掩膜,
两个掩膜之间非常相似,但不是完全一样,为了让OpenCV可以创建与matlab完全一样的掩膜,可以通过下面的方式来实现。该方式仅仅对掩膜半径较小的时候有效,代码如下,
通过下面代码进行测试,
得到的结果如下图,完全与matlab程序的结果一致。不过从程序可以看出,这段代码仅仅对“半径”小于等于21的单数有效,不过对于大多数应用来说已经足够。
在OpenCV中有一个自带的函数来实现类似的效果,程序如下,
Mat se = getStructuringElement(MORPH_ELLIPSE, Size(9, 9)); cout << se << endl;
该函数名叫getStructuringElement,MORPH_ELLIPSE表示创建一个椭圆形的结构,此外还有其他几种结构,从后面的size看出matlab的大小参数是“半径”,而OpenCV是“直径”。由此可以得到如下图的一个掩膜,
两个掩膜之间非常相似,但不是完全一样,为了让OpenCV可以创建与matlab完全一样的掩膜,可以通过下面的方式来实现。该方式仅仅对掩膜半径较小的时候有效,代码如下,
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<uchar>(i, j) = 0; sel.at<uchar>(i, sel.cols - 1 - j) = 0; sel.at<uchar>(sel.rows - 1 - i, j) = 0; sel.at<uchar>(sel.rows - 1 - i, sel.cols - 1 - j) = 0; } } return sel; }
通过下面代码进行测试,
Mat se = diskStrel(5); cout << se << endl;
得到的结果如下图,完全与matlab程序的结果一致。不过从程序可以看出,这段代码仅仅对“半径”小于等于21的单数有效,不过对于大多数应用来说已经足够。
相关文章推荐
- opencv实现 Matlab 寻找峰值函数 findpeaks
- 【2】MATLAB中strel('disk',r)的C实现
- OpenCV实现fft2、ifft2变换和matlab中psf2otf()函数的功能
- opencv实现 Matlab 寻找峰值函数 findpeaks
- 使用OpenCV中的filter2D函数精确实现matlab中的imfilter函数(已测)
- opencv 旋转图像函数实现 等同于matlab里的rotate() (注:旋转后图像变大,超出部分填为黑色)
- OpenCV中与matlab中相对应的函数
- OpenCV中与matlab中相对应的函数
- matlab与opencv部分函数的对照
- Matlab中保持原来数值顺序的unique函数实现
- OpenCV中与matlab中相对应的函数
- matlab实现最速下降法和dfp求函数最小值
- OpenCV中与matlab中相对应的函数
- 如何查看opencv函数实现
- OpenCV实现Matlab中的conv2的功能
- OpenCV中与matlab中相对应的函数
- 相机标定的原理与意义及OpenCV、Matlab实现差异小结
- Matlab中使用varargin来实现参数可变的函数
- OpenCV学习笔记(12)OpenCV调用Matlab函数进行保存视频的尝试
- matlab GUI callback 函数实现