zoukankan      html  css  js  c++  java
  • opencv源码学习: getStructuringElement函数;

    getStructuringElement函数归属于形态学,可以建立指定大小、形状的结构;

    原型: 

    /** @brief Returns a structuring element of the specified size and shape for morphological operations.
    
    The function constructs and returns the structuring element that can be further passed to cv::erode,
    cv::dilate or cv::morphologyEx. But you can also construct an arbitrary binary mask yourself and use it as
    the structuring element.
    
    @param shape Element shape that could be one of cv::MorphShapes
    @param ksize Size of the structuring element.
    @param anchor Anchor position within the element. The default value f$(-1, -1)f$ means that the
    anchor is at the center. Note that only the shape of a cross-shaped element depends on the anchor
    position. In other cases the anchor just regulates how much the result of the morphological
    operation is shifted.
     */
    CV_EXPORTS_W Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));

    源码解析:

    cv::Mat cv::getStructuringElement(int shape, Size ksize, Point anchor)
    {
        int i, j;
        int r = 0, c = 0;
        double inv_r2 = 0;
    
        CV_Assert( shape == MORPH_RECT || shape == MORPH_CROSS || shape == MORPH_ELLIPSE );        //目前支持三种形状的单元创建: 矩形, 十字形, 椭圆形;
    
        anchor = normalizeAnchor(anchor, ksize);                    //当默认为-1,-1时, 计算anchor;
    
        if( ksize == Size(1,1) )                  //当给定大小为1,1时,表明是一个点, 可以用矩形来表示;
            shape = MORPH_RECT;
    
        if( shape == MORPH_ELLIPSE )               //椭圆;
        {
            r = ksize.height/2;
            c = ksize.width/2;
            inv_r2 = r ? 1./((double)r*r) : 0;
        }
    
        Mat elem(ksize, CV_8U);
    
        for( i = 0; i < ksize.height; i++ )                    //对每一行,计算0,1的范围;
        {
            uchar* ptr = elem.ptr(i);
            int j1 = 0, j2 = 0;
    
            if( shape == MORPH_RECT || (shape == MORPH_CROSS && i == anchor.y) )        //矩形,或十字y锚点时  j2为ksize.width;
                j2 = ksize.width;
            else if( shape == MORPH_CROSS )
                j1 = anchor.x, j2 = j1 + 1;
            else                                               //椭圆;
            {
                int dy = i - r;
                if( std::abs(dy) <= r )
                {
                    int dx = saturate_cast<int>(c*std::sqrt((r*r - dy*dy)*inv_r2));        //计算得到x的偏移;
                    j1 = std::max( c - dx, 0 );
                    j2 = std::min( c + dx + 1, ksize.width );
                }
            }
    
            for( j = 0; j < j1; j++ )                //从这三个for可以看出, (0,j1)之间为 0,  (j1, j2)之间为1,  (j2, ksize.width)之间为0;
                ptr[j] = 0;
            for( ; j < j2; j++ )
                ptr[j] = 1;
            for( ; j < ksize.width; j++ )
                ptr[j] = 0;
        }
    
        return elem;
    }
  • 相关阅读:
    atitit.TokenService v3 qb1 token服务模块的设计 新特性.docx
    Atitit attilax在自然语言处理领域的成果
    Atitit 图像清晰度 模糊度 检测 识别 评价算法 原理
    Atitit (Sketch Filter)素描滤镜的实现  图像处理  attilax总结
    atitit。企业的价值观 员工第一 vs 客户第一.docx
    Atitit 实现java的linq 以及与stream api的比较
    Atitit dsl exer v3 qb3 新特性
    Atititi tesseract使用总结
    Atitit 修改密码的功能流程设计 attilax总结
    atitit.TokenService v3 qb1  token服务模块的设计 新特性.docx
  • 原文地址:https://www.cnblogs.com/yinwei-space/p/9833294.html
Copyright © 2011-2022 走看看