创建自己的结构元素对图象进行操作

opencv一些图象处理函数,比如腐蚀cvErode和cvDilate,可以用自己的定制的结构元素进行处理.

 

 IplConvKernel* kernel = cvCreateStructuringElementEx(3, 3, 1, 1, CV_SHAPE_CROSS, NULL); 
 cvErode(cannyImage,cannyImage,0,1);//
 cvReleaseStructuringElement( &kernel );

 

记得用完需要释放空间.因为在函数cvCreateStructuringElementEx里面Alloc了堆空间.

腐蚀用在消除二值图象不相关的细节,膨胀将断裂的区域桥接起来.

cvCreateStructuringElementEx的第三个参数是表示结构元素的形状,不同的形状处理的结果不一样.腐蚀和膨胀的区域也不一样.

 

下面是函数的源代码解释了这个结构体

    switch (shape)
    {
    case CV_SHAPE_RECT:
        memset( vals, -1, sizeof( vals[0] ) * cols * rows );//这里就是矩形,每个元素都是-1
        break;
    case CV_SHAPE_CROSS://行偏移的位置为anchorY,列的偏移的位置是anchorX
       memset( vals, 0, sizeof( vals[0] ) * cols * rows );
        for( i = 0; i < cols; i++ )
        {
            vals[i + anchorY * cols] = -1;
        }

        for( i = 0; i < rows; i++ )
        {
            vals[anchorX + i * cols] = -1;
        }
        break;
    case CV_SHAPE_ELLIPSE://椭圆的位置,这个在待分析
      {
            int r = (rows + 1) / 2;
            int c = cols / 2;
            double inv_r2 = 1. / (((double) (r)) * (r));

            memset( vals, 0, sizeof( vals[0] ) * cols * rows );

            for( i = 0; i < r; i++ )
            {
                int y = r - i;
                int dx = cvRound( c * sqrt( ((double)r * r - y * y) * inv_r2 ));
                int x1 = c - dx;
                int x2 = c + dx;

                if( x1 < 0 )
                    x1 = 0;
                if( x2 >= cols )
                    x2 = cols;
                x2 -= x1 - 1;
                memset( vals + i * cols + x1, -1, x2 * sizeof( int ));
                memset( vals + (rows - i - 1) * cols + x1, -1, x2 * sizeof( int ));
            }
        }
        break;
    case CV_SHAPE_CUSTOM://根据values的值填充结构元素
      for( i = 0; i < size; i++ )
        {
            vals[i] = !values || values[i] ? -1 : 0;
        }
        break;
    default:
        cvFree( (void**)&element );
        CV_ERROR_FROM_STATUS( CV_BADFLAG_ERR );
    }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值