OpenCV3.1实现matlab中strel('disk', n)函数

在数字图像处理过程中常会用到形态学处理的函数,比如膨胀和腐蚀等操作,在次之前往往需要创建一个掩膜(mask),在matlab中可以很方便地通过strel(‘disk’, 5)创建一个“圆盘”状的掩膜,如下图。

strel

在OpenCV中有一个自带的函数来实现类似的效果,程序如下,

Mat se = getStructuringElement(MORPH_ELLIPSE, Size(9, 9));
cout << se << endl;

该函数名叫getStructuringElementMORPH_ELLIPSE表示创建一个椭圆形的结构,此外还有其他几种结构,从后面的size看出matlab的大小参数是“半径”,而OpenCV是“直径”。由此可以得到如下图的一个掩膜,

getStructuringElement

两个掩膜之间非常相似,但不是完全一样,为了让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的单数有效,不过对于大多数应用来说已经足够。

new

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值